возникла проблема с кодом, который я пишу для домашнего задания.
Функция, которая мне нужна, проста: когда я загружаю текстовый документ, я хочу, чтобы левая панель в моем графическом интерфейсе отображала текст, содержащийся в документе.
Я пробовал несколько вещей, настраивая JTextField и используя JTextArea, но всякий раз, когда я загружаю образец файла, я всегда получаю небольшое пустое поле, в которое я могу вводить данные.
Если у кого-то есть исправление / решение для этого и он может указать мне, что я делал неправильно, это было бы очень признательно.
Вот мой код.
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.*;
public class JavaAssingnment {
public static void main(String[] args) throws FileNotFoundException {
window window = new window();
String reader;
}
public static class window extends JFrame {
public window() throws FileNotFoundException {
JMenuBar menuBar = new JMenuBar(); // menubar
JMenu menu1 = new JMenu("File"); //menu
menuBar.add(menu1); // add menu to gui
JMenu menu2 = new JMenu("Help");
menuBar.add(menu2);
JMenuItem menuItem1 = new JMenuItem("Load File", KeyEvent.VK_1); // create drop down menu
JMenuItem menuItem2 = new JMenuItem("Save File", KeyEvent.VK_1);
JMenuItem menuItem3 = new JMenuItem("Exit", KeyEvent.VK_1);
JMenuItem menuItem4 = new JMenuItem("About", KeyEvent.VK_1);
menu1.add(menuItem1); // adds drop down menus to gui
menu1.add(menuItem2);
menu1.add(menuItem3);
menu2.add(menuItem4);
JPanel leftScrollPane = new JPanel();
JPanel rightPane = new JPanel();
JSplitPane splitPane;
JTextArea input = new JTextArea();
input.setVisible(true);
input.setSize(300,300);
leftScrollPane.add(input);
this.setVisible(true);
this.setSize(400, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
splitPane = new JSplitPane();
splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
splitPane.setDividerSize(10);
splitPane.setDividerLocation(100);
splitPane.setLeftComponent(leftScrollPane);
splitPane.setRightComponent(rightPane);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(600);
Dimension minimumSize = new Dimension(100, 50);
leftScrollPane.setSize(400, 400);
this.setJMenuBar(menuBar);
splitPane.setPreferredSize(new Dimension(400, 200));
splitPane.setLeftComponent(leftScrollPane);
splitPane.setRightComponent(rightPane);
this.add(splitPane);
this.setSize(1280, 720);
// execute code when selected
menuItem1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final JFileChooser fc = new JFileChooser();
// you can set the directory with the setCurrentDirectory method.
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
// User has selected to open the file.
File file = fc.getSelectedFile();
try {
// Open the selected file
BufferedReader reader = new BufferedReader(new FileReader(file));
// Output the contents to the console.
String nextLine = reader.readLine();
while ( nextLine != null ) {
nextLine = reader.readLine();
input.setText(nextLine);
}
reader.close();
} catch (IOException e1) {
System.err.println("Error while reading the file");
}
}
}});
}
}
}




JTextArea input = new JTextArea();
Это не говорит о размере, хотя ..
JTextArea input = new JTextArea(20,40);
Предлагает размер в столбцах и строках.
input.setSize(300,300);
Это ни в малейшей степени не помогает, поскольку макет игнорирует размер в пользу предпочтительного размера. Но не стоит связываться с этим, поскольку числа - это просто предположение, тогда как установка строк и столбцов позволяет среде выполнения определять, насколько они должны быть большими.
Способствовать:
JPanel leftScrollPane = new JPanel();
В итоге будет установлен FlowLayout по умолчанию, что означает, что компоненты будут отображаться с их предпочтительным размером и не будут растянуты до размера панели.
Это «исправит» следующее:
JPanel leftScrollPane = new JPanel(new GridLayout()); // will stretch content to fill
Я не понимаю, о чем вы имеете в виду, когда пишете "первые 2 выделенных раздела кода". Но этот код настолько плох, что я бы выбросил его и начал снова после изучения учебника Swing / layout.
В дополнение к тому, что сказал Эндрю Томпсон, в вашем цикле while есть ошибка.
String nextLine = reader.readLine();
Вы читаете здесь первую строчку.
while ( nextLine != null ) {
Если первая строка не нулевая
nextLine = reader.readLine();
Вы читаете вторую строку и выводите ее на экран.
input.setText(nextLine);
}
Вы не проверяете наличие строки чтения в своем операторе управления для цикла while.
Вместо этого попробуйте вот так:
String nextLine;
String temp = "";
while ( ( nextLine = reader.readLine()) != null ) {
temp += nextLine;
input.setText(temp);
Если вы не добавляете каждую прочитанную ранее строку к вновь прочитанной строке, вы останетесь только с последней строкой текстового файла.
splitPane.setLeftComponent(leftScrollPane);
splitPane.setRightComponent(rightPane);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(600);
Dimension minimumSize = new Dimension(100, 50);
leftScrollPane.setSize(400, 400);
this.setJMenuBar(menuBar);
splitPane.setPreferredSize(new Dimension(400, 200));
splitPane.setLeftComponent(leftScrollPane); // ???
splitPane.setRightComponent(rightPane); // ??
Почему вы добавляете компоненты в разделенную панель дважды?
JPanel leftScrollPane = new JPanel();
JPanel rightPane = new JPanel();
JSplitPane splitPane;
JTextArea input = new JTextArea();
input.setVisible(true);
input.setSize(300,300);
leftScrollPane.add(input);
Почему вы добавляете текстовую область в панель JPanel, которую вы называете «панелью прокрутки». Обычно вы добавляете текстовую область к фактической JScrollPane, чтобы при необходимости можно было использовать полосу прокрутки. Панель не нужна. Также:
Итак, лучший код будет примерно таким:
JTextArea textArea = new JTextArea(5,20);
JScrollPane scrollPane = new JScrollPane( textArea );
splitPane.setLeftComponent( scrollPane );
whenever I load the sample file
Не зацикливайтесь на чтении файла. Используйте метод read (...) объекта JTextArea:
textArea.read(reader, null);
Итак, я должен внести какие-либо изменения в первые 2 выделенных раздела кода?