我正在阅读有关Swing计时器的信息,该示例看上去确实不像我尝试执行的操作,因此我发现将其应用于我的程序在逻辑上令人困惑。我开始认为我什至不需要计时器。
这是我正在尝试做的事情:
我正在制作一个让用户在JTextField中输入信用卡号的JFrame程序。在他们执行此操作之前,有一个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(){
}
}
您的Timer的ActionListener遇到一些主要问题,因为它向其自身添加了匿名内部ActionListener对象(this
即Timer的构造函数中的对象)。因此,它将调用由启动计时器的JButton调用的计时器内部相同的actionPerformed -非常令人困惑。如果您的程序需要一个Timer,则最好确保为其提供自己的ActionListener,而不要像现在那样将其添加到JButton中。
最重要的是,您是否还需要一个Swing计时器?我不这么认为,因为您似乎不希望每隔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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句