Java 摆动计时器只工作一次

Java 摆动计时器只工作一次,java,swing,timer,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; imp

几天来,我一直在用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) {
}
}

TimerC()
中的那一行,
JLabel单击=newjlabel()
remove
JLabel
infront
clicked
,因为您已经在外部声明clicked,这样您将再次声明为局部变量。了解变量范围

我不知道您是否注意到,但您使用的字体太大,而您的JLabel大小不够大,请尝试更改其大小:

clicked.setSize(200100)

定义一些行为以执行
操作

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

作为一种良好的编程实践,始终建议仅在对象构造完成后,在代码流中将自引用
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();
         }
    }

对于每一次更新,您需要
Timer t=new Timer(1000,这个)并按如下方式使用
actionPeformed

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

1) 在源代码中只需要一行空白就可以了。
{
之后或
}
之前的空行通常也是多余的。2) 使用缩进代码行和代码块的逻辑和一致形式。缩进的目的是使代码的流程更易于遵循<代码>定时器t=新定时器(5,此)这里的基本问题是
actionPerformed
方法
this
没有任何作用!首先更改,将内容打印到
System.out
p1.setLayout(null)Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。@andrewhompsonindeed@RegularMoments
TimerC()
中的那一行,
JLabel单击=newjlabel()
remove
JLabel
infront
clicked
,因为您已经在外部声明clicked,这样您将再次声明为局部变量