@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){

}
}
});

компилируется, но текст не передается.
  • Вопрос задан
  • 554 просмотра
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
18 апр. 2024, в 01:12
150000 руб./за проект
18 апр. 2024, в 00:10
50000 руб./за проект