我正在阅读有关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(){
}
}
答案 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);
}
}