一旦用户按下下一个按钮,如何显示下一个文本行?

时间:2014-05-21 02:02:43

标签: java swing file-io io jtextarea

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

我创建了一个带有动作命令的按钮,该按钮应该允许用户按下一次从文件中获取下一个文本行,显示在文本区域中,直到它到达文件末尾。

为此,我使用子字符串命令来浏览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);

    }

}

1 个答案:

答案 0 :(得分:3)

  1. 您的代码只执行您要求它执行的操作。
  2. 你的按钮的ActionListener有一个while循环,循环遍历整个文件,将所有内容写入JTextArea。所以我不确定为什么这种行为让你感到惊讶。
  3. 如果是我,我会将整个文件读入ArrayList<String>,每次添加一个新行。如果您事先知道要读取的文件,可能是在类构造函数中执行此操作,可能是为了响应通过JFileChooser获取文件,如果您不这样做。
  4. 然后在我的按钮中抓取此List中的下一行,使用int索引变量存储索引号,并将此行追加到我的JTextArea。
  5. 或许比使用JTextArea更好的方法是使用JList。
  6. 完成。


    修改
    您已经提出了更多问题,因此我会尝试将这些步骤细分一点:

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

    如果仍然卡住,请进一步细分您的步骤,并尝试专门找到您遇到的问题。谷歌寻求解决方案,如果仍然卡住,请带着您的具体问题和代码来到这里。

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


    另外,您需要学习并使用Java naming conventions。变量名都应以较低的字母开头,而类名以大写字母开头。