@olololosh

Где я допустил ошибку?

Есть два класса, один создает filedialog, который выбирает файл и записывает его в строку.
Второй класс создает фрейм, меню и лэйбел. Хочу строку передать в лэйбл, но не получается. Что я делаю не так?

класс файла
public class OpenBook extends JFrame{

 FileDialog fileDialog = new FileDialog(this, "Select book", FileDialog.LOAD);
 String s = "";

    public OpenBook() {
       fileDialog.show();
        
        if(fileDialog.getFile() == null)
        return;
    }
    public void openBook() throws FileNotFoundException{
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame.setDefaultLookAndFeelDecorated(true);
                JDialog.setDefaultLookAndFeelDecorated(true);   
            }
        });
        
       File myFile = new File(fileDialog.getDirectory(), fileDialog.getFile());
       Scanner in = new Scanner(new File(fileDialog.getDirectory()));
       while(in.hasNext())
       s += in.nextLine() + "\r\n";
       in.close();
     }
}


сюда я хочу вывести строку

public class CreateJFrame
{
public static void createGUI()
{
//Create JFrame
JFrame frame = new JFrame("LIBRARY");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

//Create JLabel
JLabel label = new JLabel();
frame.add(label);
label.setVisible(true);
.....
//readMenuItem ActionListener
readMenuItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{

try{
OpenBook opBook = new OpenBook();
opBook.openBook();
}
catch(Exception exc){

}
}
});

компилируется, но текст не передается.
  • Вопрос задан
  • 555 просмотров
Пригласить эксперта
Ответы на вопрос 2
timych
@timych
package application;

import java.awt.FileDialog;
import java.awt.Frame;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


// Тут необязательно наследоваться от JFrame
// Название класса  должно отображать его предназаначение
public class BookReader {

	// поля должны быть приватными
	private FileDialog fileDialog;
	private BookReaderCallback callback;

	// Вложенный интерфейс обратного вызова
	public interface BookReaderCallback {
		// метод будет вызван, когда текстовый файл будет успешно прочитан до конца
		void onReadComplete(String text);
	}

// В конструктор передаем фрейм родителя
// не обязательно его инстанцировать в этом классе
	public BookReader(Frame parent) {
		fileDialog = new FileDialog(parent, "Select book", FileDialog.LOAD);
	}

	//А название метода  должно отображать его действие или результат действия
	public void readBook() {

		// show() deprecated поэтому вызываем  "setVisible"
		fileDialog.setVisible(true);

		if (fileDialog.getDirectory() == null || fileDialog.getFile() == null) {
			return;
		}

		Scanner in = null;
		String text = "";
		try {
			in = new Scanner(new File(fileDialog.getDirectory(),
					fileDialog.getFile()));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		while (in.hasNext()) {
			text += in.nextLine() + "\n";
		}
		in.close();
		// прочитали файл и теперь через обьект класса обраьтного вызова 
		//нотифицируем вызывающий класс о том что текст прочитан и передаем ему результат
		if (callback != null) {
			callback.onReadComplete(text);
		}

	}

	//"ceттер" для экземпляра обратного вызова
	public void setCallback(BookReaderCallback callback) {
		this.callback = callback;
	}
}

package application;

import java.awt.Button;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;


public class JFrameCreator {

	public static void main(String[] args) {
		createGUI();
	}

	public static void createGUI() {

		try {
			UIManager.setLookAndFeel((LookAndFeel) Class.forName(UIManager.getCrossPlatformLookAndFeelClassName()).newInstance());
		} catch (InstantiationException | IllegalAccessException| ClassNotFoundException | UnsupportedLookAndFeelException e) {
			// Игнорируем
		}

		JPanel content = new JPanel(new FlowLayout());
		// вместо Label для текста стоит бы использовать TextArea(Label - для короткого однострочного текста),
		JTextArea textArea = new JTextArea();
		textArea.setText("Пока пусто...");
		Button btnOpenFileDialog = new Button("Browse");
		content.add(btnOpenFileDialog);
		content.add(textArea);

		JFrame frame = new JFrame("LIBRARY");
		frame.setContentPane(content);
		frame.setPreferredSize(new Dimension(300, 200));
		frame.pack();
		
		// центрируем относительно экрана
		frame.setLocationRelativeTo(null);

		// навешиваем слушатель на кнопку 
		// это плохой пример, скорее всего нужно навесить KeyListener, но лень имплементировать три метода
		btnOpenFileDialog.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// создаем обьект BookReader
				BookReader bookReader = new BookReader(frame);
				// передаем ему экземпляр BookReaderCallback в виде анонимного класса
				bookReader.setCallback(new BookReader.BookReaderCallback() {

					// метод будет вызван из класса BookReader как только файл будет прочитан
					@Override
					public void onReadComplete(String text) {
						// меняем текст в Label
						textArea.setText(text);
					}
				});
				// запускаем "читалку" :)
				bookReader.readBook();

			}
		});

		frame.setVisible(true);
	}

}


Если я правильно понял задачу, то вот как примерно можно было переделать. Это все упрощенно конечно (Да я и не спец в Swing ).
А то опять какая-то каша понаписана. Старайтесь во первых называть классы и методы адекватно. Я уже говорил кстати об этом :).
И начинайте с основ Java. Заметно что пока плохое понятие OOП.
Ответ написан
compilator
@compilator
Senior Data Engineer
while(in.hasNext())
       s += in.nextLine() + "\r\n";

Нехорошо стрингу в цикле конкатенировать, это не мутабельный тип. Когда конкатенируете, создается новый объект. В итоге проигрываете по перфомансу. Используйте StringBuilder или StringBuffer.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы