Swing Timer只能工作一次

时间:2015-10-10 18:28:28

标签: java swing timer

几天后,我一直在研究Java中的Timer程序。 工作原理是,您打开程序并JLabel计数。由于某种原因,它不会重复,只能工作一次。

这是我的代码。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.SwingConstants;
import java.awt.Font;

public class TimerC extends JFrame implements ActionListener{

Timer t = new Timer(5, this);
public int intClicked;
public String stringClicked;
public JLabel clicked;
public TimerC() {
    t.start();
    JPanel p1 = new JPanel();
    getContentPane().add(p1);
    p1.setLayout(null);

    JLabel clicked = new JLabel();
    clicked.setFont(new Font("Tahoma", Font.PLAIN, 64));
    clicked.setHorizontalAlignment(SwingConstants.CENTER);
    clicked.setText("0");

    int intClicked = 1;
    String stringClicked = String.valueOf(intClicked);

    clicked.setText(stringClicked);

p1.add(clicked);

clicked.setSize(42, 100);
clicked.setLocation(191, 97);
     }

@Override
public void actionPerformed(ActionEvent e) {
}
}

3 个答案:

答案 0 :(得分:1)

TimerC()内的那一行,JLabel clicked = new JLabel();移除JLabel infront clicked,因为您已经声明已点击外部,并且通过这种方式您再次声明为局部变量。阅读变量范围。

我不知道你是否注意到了,但你使用的字体大小很大,你的JLabel尺寸不够大,试试改变它的大小:

clicked.setSize(200, 100);

将某些行为定义为actionPerformed

   @Override
    public void actionPerformed(ActionEvent e) {
        clicked.setText(intClicked++ + " ");
       // this.repaint(); it's not necessary
    }

答案 1 :(得分:1)

作为一种优秀的编程习惯,始终建议在代码流中完成对象构造完成后,将自引用this传递给其他对象。在代码示例中,

    public class TimerC extends JFrame implements ActionListener{

        Timer t = null;
        public JLabel clicked;

        public TimerC() {
            ...
            clicked = new JLabel();
            ...
            intClicked = 1;
            ...
            clicked.setSize(42, 100);
            clicked.setLocation(191, 97);

            t = new Timer(5, this);
            t.start();
        }

         @Override
         public void actionPerformed(ActionEvent e) {
             intClicked = intClicked + 1;
             clicked.setText(String.valueOf(intClicked));
             clicked.repaint();
         }
    }

答案 2 :(得分:0)

对于每次第二次更新,您需要Timer t = new Timer(1000, this);并使用actionPeformed,如下所示:

public void actionPerformed(ActionEvent e) {
        System.out.println(e);
        clicked.setText(String.valueOf(intClicked++));
}