我正在尝试创建一个程序,允许用户选择一个文本文件
从他们的目录。然后将其显示在使用Swing创建的框架内的JTextArea中。

我用动作命令创建了一个按钮,该按钮应该允许用户一旦按下即可从文件中获取下一个文本行,并在文本区域内显示该文本行,直到到达文件末尾。

为此,我使用了sub-string命令来检查String变量并显示它。
但是它似乎不这样做,而是仅显示文件中找到的所有文本。

在下面,您将找到允许程序打开文件并显示的代码
作为创建用来帮助浏览文本的按钮。

package reader;

public class Viewer extends JFrame{

    private static final long serialVersionUID = 1L;

    private static JFrame Frame;
    private JPanel Cpanel;

    JScrollPane scrollPane;
    String book = "";
    int currentChar = 10;
    static JTextArea textArea;
    JFileChooser fileChooser;
    File f;

    public static void DocViewer() {

        new Viewer("new document");
    }

    public Viewer(String s) {
        Frame = new JFrame("Reader");

        textArea = new JTextArea(20,60);
        textArea.setFont(new Font("Calibri", Font.PLAIN, 12));
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        textArea.setEditable(false);
        scrollPane = new JScrollPane(textArea);
        f = new File("C://Program Files//Java//jdk1.6.0//bin//");
        fileChooser = new JFileChooser(f);
        Frame.getContentPane().setBackground(Color.red);

        Frame.setLayout(new GridLayout(3, 1));


        Cpanel = new JPanel();
        Cpanel.setLayout(new FlowLayout());
        Cpanel.setBackground(Color.RED);

        JButton StButton = new JButton("open");
        JButton QButton = new JButton("back");
        JButton TestButton = new JButton("next");
        TestButton.setHorizontalTextPosition(SwingConstants.LEFT);

        StButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String book = "";
                // int currentChar=10;

                int returnVal = fileChooser.showOpenDialog(Viewer.this);
                try {

                    File file = fileChooser.getSelectedFile();

                    FileInputStream fin = new FileInputStream(file);
                    BufferedReader d = new BufferedReader(
                            new InputStreamReader(fin, "UTF-8"));

                    book = "";
                    if (returnVal == JFileChooser.APPROVE_OPTION) {

                         while (book != null) {
                             book = d.readLine();
                            textArea.append(book + "\n");
                        System.out.println(book);
                         }
                    }

                    System.out.println("returnVal = " + returnVal
                            + " and ba.fileChooser.APPROVE_OPTION = "
                            + JFileChooser.APPROVE_OPTION);
                    fin.close();
                } catch (Exception ex) {

                }

            }

        });

        QButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // System.exit(0);
                Viewer.EXIT_ON_CLOSE();
                Loader.main(null);

            }
        });

        TestButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                String page = "";

                for (int l = 1; l >= 10; l = l + 2) {
                    page += book.substring(l, l + 49);

                    page += "\n";
                    currentChar += 50;

                }

            }
        });

        Cpanel.add(StButton);
        Cpanel.add(QButton);
        Cpanel.add(TestButton);





        Frame.add(Cpanel, BorderLayout.NORTH);
        Frame.add(scrollPane, BorderLayout.CENTER);
        Frame.setSize(300,300);
        Frame.setVisible(true);

    }

}

最佳答案

您的代码只会执行您要执行的操作。
您按钮的ActionListener具有一个while循环,该循环循环遍历整个文件,并将所有内容写入JTextArea。因此,我不确定为什么这种行为会让您感到惊讶。
如果是我,我会将整个文件读入ArrayList<String>,并且每次添加新行一次。我会这样做一次,如果您事先知道要读取哪个文件,也许是在类构造函数中,或者如果不知道,则通过JFileChooser来获取文件。
然后在我的按钮中,使用int index变量存储此列表中的下一行,以存储索引号,并将此行附加到我的JTextArea上。
使用JList甚至比使用JTextArea更好。


做完了



编辑
您已经问了更多问题,所以我将尝试细分一些步骤:


创建一个ArrayList<String>作为实例字段(非静态类变量)
打开文件,将其放入扫描仪对象
使用while循环,在扫描仪有下一行时循环
在循环内,使用扫描仪获取下一行并将其放入列表中。
还给该类一个int索引字段。
按下按钮时,获取与索引对应的ArrayList中的String,然后递增索引
使用其append方法在您的JTextField中发布该字符串。


如果仍然卡住,请进一步分解步骤,并尝试专门查找卡住的位置。 Google寻求解决方案,如果仍然遇到问题,请提出您的具体问题和代码。

检查java info resources。特别要看一下初学者的链接资源。



顺便说一句,您将要学习和使用Java naming conventions。变量名都应以小写字母开头,而类名应以大写字母开头。

09-10 09:13
查看更多