SplitPane中的JTextArea在加载文件时不显示文本

时间:2018-04-14 15:41:45

标签: java swing

我正在为家庭作业写的代码有问题。

当我加载txt文档时,我需要它执行的功能很简单我希望GUI中的左侧面板显示文档中的文本。

我已经尝试了一些调整JTextField和使用JTextArea的东西,但每当我加载示例文件时,我总是最后得到一个小空框,我可以输入内容。

enter image description here

如果有人为此修复/解决方案并且可以指出我做错了什么,那将非常感激。

这是我的代码。

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


                    }
                }});

    }
}
}

3 个答案:

答案 0 :(得分:2)

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

为什么要将组件添加到splitpane两次?

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(...)不执行任何操作。您不应该打赌尝试设置组件的大小。
  3. 所以更好的代码就像:

    JTextArea textArea = new JTextArea(5,20);
    JScrollPane scrollPane = new JScrollPane( textArea );
    splitPane.setLeftComponent( scrollPane );
    
      每当我加载示例文件时

    不要循环读取文件。使用JTextArea的read(...)方法:

    textArea.read(reader, null);
    

答案 1 :(得分:1)

        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 :(得分:0)

除了Andrew Thompson所说的,你的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);

如果你没有将你之前读过的每一行添加到新读取的行中,你将只得到文本文件的最后一行。