JTextArea в SplitPane не отображает текст при загрузке файла в

возникла проблема с кодом, который я пишу для домашнего задания.

Функция, которая мне нужна, проста: когда я загружаю текстовый документ, я хочу, чтобы левая панель в моем графическом интерфейсе отображала текст, содержащийся в документе.

Я пробовал несколько вещей, настраивая JTextField и используя JTextArea, но всякий раз, когда я загружаю образец файла, я всегда получаю небольшое пустое поле, в которое я могу вводить данные.

JTextArea в SplitPane не отображает текст при загрузке файла в

Если у кого-то есть исправление / решение для этого и он может указать мне, что я делал неправильно, это было бы очень признательно.

Вот мой код.

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");
                        } 


                    }
                }});

    }
}
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
46
3

Ответы 3

        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 выделенных раздела кода?

Daniel Siwiec 14.04.2018 18:59

Я не понимаю, о чем вы имеете в виду, когда пишете "первые 2 выделенных раздела кода". Но этот код настолько плох, что я бы выбросил его и начал снова после изучения учебника Swing / layout.

Andrew Thompson 14.04.2018 19:01

В дополнение к тому, что сказал Эндрю Томпсон, в вашем цикле 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, чтобы при необходимости можно было использовать полосу прокрутки. Панель не нужна. Также:

  1. Компоненты Swing видны по умолчанию, поэтому нет необходимости в setVisible (true);
  2. Диспетчер компоновки (или в данном случае JSplitPane) будет определять размер каждого компонента, поэтому setSize (...) ничего не делает. Вы НЕ должны делать ставки, пытаясь установить размер компонента.

Итак, лучший код будет примерно таким:

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);

Другие вопросы по теме