【问题标题】:Stop Swing Timer After N Executions在 N 次执行后停止摆动计时器
【发布时间】:2015-11-10 05:22:44
【问题描述】:

我编写了这个 Swing 计时器,它应该运行 10 次然后停止。但是,编译器说 Timer 没有初始化。我不想初始化它,我也不需要(here 是一个没有初始化但可以工作的例子)。怎么了?

public Enhanced() {
    Timer picTimer ;
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 422);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);


    JLabel lblTimer = new JLabel();
    lblTimer.setBounds(361, 67, 61, 16);
    contentPane.add(lblTimer);

    ActionListener a = new ActionListener() {
        int time=0;
        @Override
        public void actionPerformed(ActionEvent e) {


            System.out.println("hello");

            if (++time > 10) {
                picTimer.stop();
                System.exit(0);
            }
        }
    };
    picTimer = new Timer(1000,a);

}

【问题讨论】:

  • 您确定您导入了正确的计时器吗? 'javax.swing.Timer',你可能不小心导入了'java.util.Timer'
  • timer 在链接示例中是一个实例变量,因此它被初始化为null,并且监听器也可以访问它(因此可以稍后创建Timer 实例)。在您的示例中,它是一个未初始化的局部变量。

标签: java swing timer


【解决方案1】:

有一种方法可以避免引用外部计时器变量。

计时器实际上是您的ActionListener 每次收到的事件的来源。因此,您可以通过调用e.getSource()来访问它。

这样,你甚至不需要提前声明定时器:

ActionListener a = new ActionListener() {
    int time=0;
    @Override
    public void actionPerformed(ActionEvent e) {


        System.out.println("hello");

        if (++time > 10) {
            Timer timer = (Timer)e.getSource();
            timer.stop();
            System.exit(0);
        }
    }
};

new Timer(1000,a).start();

请注意,像这样调用System.exit() 无论如何都会停止计时器。真的不建议这样打电话给System.exit()

【讨论】:

    【解决方案2】:

    picTimer 的声明移动到类级别,这样就不需要在构造函数的本地范围内初始化变量

    【讨论】:

    • 你没有“必须”,ActionEvent#getSource 将返回对调用actionPerformedTimer 的引用,只是说;)
    【解决方案3】:

    在您链接到的那个示例中,timer 是一个字段,而在您的代码中它是一个局部变量。您至少可以通过两种方式解决您的问题:

    1. timer 设为示例中的字段。
    2. 使用null初始监听器创建定时器,以便在创建动作监听器时可以参考实际的定时器实例。然后使用Timer.addActionListener() 添加监听器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      相关资源
      最近更新 更多