用Java中的定时器重置矩形位置
我正在用Java对用Java中的定时器重置矩形位置,java,swing,timer,jframe,jpanel,Java,Swing,Timer,Jframe,Jpanel,我正在用Java对计时器动画进行一个小测试。其中有三个按钮和一个矩形。按钮是开始停止重置。单击“开始”按钮时,矩形将设置动画;单击“停止”按钮时,矩形将停止设置动画;单击“重置”按钮时,矩形将返回到原始位置,只有单击“开始”按钮时,矩形才应重新设置动画。前两个按钮有效!但问题出在重置按钮上。这是我的密码,请告诉我哪里出错了 package projectretrytest; import javax.swing.*; import java.awt.*; import java.awt.eve
计时器动画进行一个小测试。其中有三个按钮和一个矩形。按钮是开始
停止
重置
。单击“开始”按钮时,矩形将设置动画;单击“停止”按钮时,矩形将停止设置动画;单击“重置”按钮时,矩形将返回到原始位置,只有单击“开始”按钮时,矩形才应重新设置动画。前两个按钮有效!但问题出在重置
按钮上。这是我的密码,请告诉我哪里出错了
package projectretrytest;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ProjectRetryTest extends JPanel {
private static final int D_HEIGHT = 500;
private static final int D_WIDTH = 400;
private static final int INCREMENT = 8;
int recx = 150,recy = 150;
private Timer timer = null;
public ProjectRetryTest() {
timer = new Timer(30, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
update();
repaint();
}
});
JButton start = new JButton("Start");
start.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
timer.start();
}
});
JButton stop = new JButton("Stop");
stop.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
timer.stop();
}
});
JButton reset = new JButton("Reset");
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
recx = 150; recy = 150;
}
});
JPanel panel = new JPanel();
panel.add(start);
panel.add(stop);
panel.add(reset);
setBackground(Color.blue);
setLayout(new BorderLayout());
add(panel, BorderLayout.PAGE_START);
}
public void update()
{
recx++;
recy--;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(recx,recy,20,20);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(D_WIDTH, D_HEIGHT);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.add(new ProjectRetryTest());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
请让我知道我的课程结构。我需要对它做一些更改吗?重置侦听器也应该停止计时器!所以这部分的动作执行方法
recx = 150; recy = 150;
应该更像:
recx = 150; recy = 150;
timer.stop(); // stop the animation..
必须像下面这样添加repaint()方法:
JButton reset = new JButton("Reset");
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
timer.stop();
recx = 150; recy = 150;
repaint();
}
});
另一个答案中提到,在重新绘制图形之前,必须停止计时器。
Repaint()
:将更新图形,因为更改值不足以更新用户在界面上实际看到的内容
停止计时器:如果用户想在启动计时器后重置图形,矩形将返回到其初始状态,但它将继续移动,这就是为什么在这种情况下必须停止计时器。问题是,单击“重置”不起作用的原因是此时未重新绘制UI。
只需在侦听器中添加一个repaint()
,它就会工作
JButton reset = new JButton("Reset");
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
recx = 150; recy = 150;
repaint(); //<--this one is needed
}
});
JButton reset=新的JButton(“reset”);
reset.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
recx=150;recy=150;
重新油漆()//