Java 摆动计时器只工作一次
几天来,我一直在用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
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()
removeJLabel
infrontclicked
,因为您已经在外部声明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@RegularMomentsTimerC()
中的那一行,JLabel单击=newjlabel()
removeJLabel
infrontclicked
,因为您已经在外部声明clicked,这样您将再次声明为局部变量