老实说,如何将Swing Timers应用到我的程序中,有人可以看看吗?

时间:2014-07-29 20:12:41

标签: java swing timer actionlistener

我正在阅读有关Swing Timers的内容,这个例子看起来并不像我试图做的那样,我觉得将它应用到我的程序中时发现它在逻辑上令人困惑。 我开始认为我甚至不需要计时器。

以下是我要做的事情:

我正在创建一个JFrame程序,让用户在JTextField中输入信用卡号。在他们这样做之前,有一个JLabel说"请在文本字段"中输入您的号码,然后一旦他们将其输入字段并按Enter键,具体取决于我的代码是否确定卡号是有效的或者无效,JLabel将更改为"无效"或者"谢谢你,处理。"

然而,我没有成功找到一种方法来改变它的文本,它似乎与我最初提供的任何文本保持一致。

那么有人可以查看我的代码并将其更改为我要问的问题吗?那将是非常好的。你们过去一直都很有帮助。

public class CreditGraphics {

    public String cardNum;
    public JFrame frame;
    public JPanel panel;
    public JLabel label;
    public JTextField text;
    public Timer timer;

    public CreditGraphics() {
        frame = new JFrame("HI");
        panel = new JPanel();
        label = new JLabel();    
        text = new JTextField(16);    
        panel.add(label);
        panel.add(text);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setPreferredSize(new Dimension(500, 500));
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true); 
        label.setText("Hi");          
        label.setText("Hello");
        text.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                cardNum = text.getText();
                timer = new Timer(2000,this);
                timer.setInitialDelay(1000);
                timer.start();
            }                
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new CreditGraphics();

               }
        });
    }

    public void checkCard(){       

    }        
}

1 个答案:

答案 0 :(得分:3)

你的Timer的ActionListener有一些重大问题,因为它将自己的匿名内部ActionListener对象(Timer的构造函数中的this)添加到自身。所以它将调用Timer中的同一个actionPerformed,它由启动Timer的JButton调用 - 非常令人困惑。如果你的程序需要一个Timer,你最好确保给它自己的ActionListener,而不是你现在正在添加到你的JButton的ActionListener。

最重要的是,你甚至需要一个Swing Timer吗?我不这么认为,因为您似乎不希望每xxx毫秒重复发生一次动作,或者在xxx毫秒之后发生一次动作,并且因为您要做的就是更改文本。我建议您只需在匿名内部ActionListener类中更改JLabel的文本,然后将其保留。如果您的要求不同,那么您需要澄清并扩展您的问题。

所以在半伪代码中,类似于:

public void actionPerformed(ActionEvent e) {
  String userText = text.getText();
  if (testIfTextValid(userText)) { // some method to test if input OK
    label.setText(INPUT_VALID);  // String constant for JLabel to display

    // here pass the userText to other parts of your code that needs to use it

  } else {
    label.setText(INPUT_INVALID);
  }
}