【问题标题】:Read a line when button pressed按下按钮时读取一行
【发布时间】:2014-04-09 19:02:09
【问题描述】:

我必须做一个测验课,它会从文本文件中读取问题,我一直试图让程序以这样的方式工作,每次按下答案按钮时它都会读取下一个问题(文本中的行文件),我尝试了许多来自互联网的建议,但我得到的最远的是在程序运行时读取第一行,然后在按下按钮时使用String[] args = new String[0]; 有一个新框架,但是文本根本不会读取.

这是我的代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Frame {

    JFrame frame;
    JPanel pan1;
    static JButton boutonRetour,boutonEnregistrer;
    static JTextField reponse,question;
    static int counter1 = 1;
    static int lines=0;


    public static void main(String[] args) {

        final JFrame frame = new JFrame("Frame");

        frame.setSize(700,600);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setVisible(true);
        question=new JTextField(10);
        question.setBounds(150, 220, 450, 50); 
        question.setEditable(true);
        frame.setContentPane(new JPanel() {
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(null, 0, 0, 700, 600, this);
            }
        });

        boutonEnregistrer=new JButton("Answer");
        boutonEnregistrer.setBounds(0,513,100,50);

        boutonEnregistrer.setBackground(new Color(0, 0, 182));
        boutonEnregistrer.setForeground(Color.white);
        boutonEnregistrer.setFocusPainted(false);
        boutonEnregistrer.setFont(new Font("Tahoma", Font.BOLD, 12));

        boutonEnregistrer.addActionListener(new ActionListener(){ 

            public void actionPerformed (ActionEvent e){
                counter1++;  
                String[] args = new String[0];              

                main(args); 
                /*
                SwingUtilities.updateComponentTreeUI(frame);
                frame.revalidate();
                frame.repaint();
                frame.removeAll();
                frame.invalidate();
                frame.validate();
                */   
            } 
        });


        frame.add(question);        
        frame.add(boutonEnregistrer);
        frame.setLayout(null);
        System.out.println(counter1);


        try {        
            BufferedReader br =
            new BufferedReader(new FileReader("Questions.txt"));
            String word = null;
            while((word =br.readLine()) != null) {
                lines++;
            if (lines == counter1){
                question.setText(word);
                break;

}

            }

        } catch(IOException err) {

        }                          
        frame.validate();
        System.out.println(lines);

    };
}

【问题讨论】:

  • 你的文字根本看不懂是什么意思?此外,您应该在 catch 块中打印堆栈跟踪 (err.printStackTrace()),以便您至少知道有错误。
  • 程序第一次运行时,它会读取第一行并将其显示在 jtextfield 上,但是当我按下按钮时,会打开一个新框架,但文本字段上没有显示任何文本...我添加了 err.printStackTrace() 但没有错误只是没有按照我需要的方式工作
  • 尝试关闭 BufferedReaders。在 finally 块中调用 br.close()。可能会出现问题,因为 BufferedReader 的第二个实例可能正在等待第一个流关闭。
  • 你用什么来编译你的程序?您的代码中有语法错误(不匹配的*/)。会不会是类文件没有更新?
  • 我用 br.close() 添加了 finally 块;在它上面我有一个找不到符号,我也尝试将它放在 while 循环之后,但它没有改变任何东西......我在我的程序中使用 netbeans 匹配的 /* 就在 SwingUtilities.updateComponentTreeUI(frame);行,必须在编辑帖子时将其删除

标签: java swing file-io jbutton bufferedreader


【解决方案1】:

您使用lines 变量来跟踪读取的最后一行。但是,您的代码中没有发生这种情况。 while 循环始终运行,直到阅读器到达 EOF。

一旦你读到所需的行,你应该从循环中中断:

if (lines == counter1){
    question.setText(word);
    break;
}

【讨论】:

  • 谢谢!!现在 jtextfield 不再为空...但它始终显示同一行(第一行),即使计数器和行号为 5 或 20
  • 您编辑问题的代码不正确。您需要 break; 语句位于 if 块中。目前它不是,并且在循环的一次迭代后它正在中断。
猜你喜欢
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 2011-11-22
相关资源
最近更新 更多