【问题标题】:Honestly confused on how to apply Swing Timers to my program, can someone take a look?老实说,对如何将 Swing Timers 应用于我的程序感到困惑,有人可以看看吗?
【发布时间】:2026-01-05 20:25:01
【问题描述】:

我正在阅读有关 Swing Timers 的内容,该示例看起来与我尝试做的完全不同,因此我发现将其应用于我的程序在逻辑上令人困惑。 我开始认为我什至不需要为此设置计时器。

这是我想要做的:

我正在制作一个让用户在 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(){       

    }        
}

【问题讨论】:

  • 我想总比不诚实的困惑好。
  • Jarod -- 不是重复的,因为这个问题的答案是他真的不需要摇摆计时器。

标签: java swing timer actionlistener


【解决方案1】:

您的 Timer 的 ActionListener 存在一些重大问题,因为它正在向自身添加匿名的内部 ActionListener 对象,即 Timer 构造函数中的 this。因此,它将在 Timer 中调用由启动 Timer 的 JButton 调用的相同 actionPerformed —— 相当混乱。如果你的程序需要一个 Timer,你最好确保给它自己的 ActionListener,而不是像现在这样添加到 JButton 中的 ActionListener。

最重要的是,您还需要摇摆计时器吗?我不这么认为,因为您似乎不希望每 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);
  }
}

【讨论】:

  • 我在想这个,谢谢 :) 我画了一个空白,因为我真的不确定我想用我的程序做什么。我现在明白了。
  • @SoloSpirit:不客气,很高兴你已经取得了进展!
最近更新 更多