java - 如何在用户按下下一个按钮后显示下一个文本行?

标签 java swing file-io io jtextarea

我正在尝试创建一个允许用户选择文本文件的程序 从他们的目录。然后它会显示在使用 Swing 创建的框架内的 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. 您的代码只执行您告诉它要做的事情。
  2. 您的按钮的 ActionListener 有一个 while 循环,它循环遍历整个文件,将所有内容写入 JTextArea。所以我不确定为什么这种行为会让您感到惊讶。
  3. 如果是我,我会把整个文件读入 ArrayList<String>每次添加一个新行。我会这样做一次,如果您事先知道要读取哪个文件,则可能在类构造函数中执行此操作,如果您不知道,则可能是为了响应通过 JFileChooser 获取文件。
  4. 然后在我的按钮中获取此列表中的下一行,使用一个 int 索引变量来存储索引号,并将此行附加到我的 JTextArea。
  5. 也许比使用 JTextArea 更好的方法是使用 JList。

完成。


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

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

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

检查 info resources .尤其要查看初学者资源的链接。


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

关于java - 如何在用户按下下一个按钮后显示下一个文本行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772837/

相关文章:

java - 为什么joptionpane弹出两次

java - 从 Swing 中的条形码扫描仪读取

java - 无法写入文件

java - HtmlUnit 不适用于 javascript 处理

java - 可打包对象中的数组列表

java - 双重依赖注入(inject)和良好实践

Java FileOutputStream 创建文件未解锁

java - 用 C++ 将 float 写入二进制文件 |等效于 Java 的 DataOutputStream.writeFloat()

java - 使用 Apache poi 在 Android 中生成 Excel

java - 将图像转换为黑白(不是灰度)