Java 内部喷漆摆动计时器不工作
我以前从未使用过定时器,所以我的问题可能真的很愚蠢。我的程序画了一个红色的圆圈,在随机的几秒钟后,圆圈应该变成绿色。我刚刚制作了一个swing计时器,正如您在下面的代码中看到的那样。它进入Java 内部喷漆摆动计时器不工作,java,swing,timer,paint,Java,Swing,Timer,Paint,我以前从未使用过定时器,所以我的问题可能真的很愚蠢。我的程序画了一个红色的圆圈,在随机的几秒钟后,圆圈应该变成绿色。我刚刚制作了一个swing计时器,正如您在下面的代码中看到的那样。它进入actionPerformed()方法,但不改变颜色。你能帮我解决一下换颜色的问题吗 我的代码: package igrica; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.
actionPerformed()
方法,但不改变颜色。你能帮我解决一下换颜色的问题吗
我的代码:
package igrica;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class ChangingCircle implements ActionListener{
JFrame frame;
Timer timer;
Random r;
public static void main(String[] args) {
ChangingCircle gui = new ChangingCircle();
gui.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel panel = new MyPanel();
frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.setSize(300, 300);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
frame.repaint();
}
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillOval(100, 100, 100, 100);
Random r = new Random();
Timer timer = new Timer(r.nextInt(5000) + 1000, new ActionListener() {
public void actionPerformed(ActionEvent ev) {
System.out.println("Timer out");
g.setColor(Color.green);
g.fillOval(100, 100, 100, 100);
}
});
timer.start();
}
}
}
不要从paintComponent方法中启动计时器。此方法仅适用于绘画和绘画。相反,在构造函数和计时器的actionPerromed中启动计时器并调用
repaint()
,更改类字段的状态,并在paintComponent中使用该信息使用该字段绘制任何新信息
e、 g
另外,不要忘记从覆盖中调用super的paintComponent方法
如果需要更改颜色,请为JPanel提供一个颜色字段,例如调用
Color
,并在计时器内更改其值,然后调用repaint()
。同样在paintComponent中,使用该字段的值绘制椭圆。同样在这种情况下,计时器应该重复,所以在这种情况下要去掉Timer.setRepeats(false)
。计时器异步工作,并且paintComponent
在完成计时器的工作之前完成。你的代码中有很多乱七八糟的东西。试试这个:
public class ChangingCircle {
Color color = Color.RED;
MyPanel panel = new MyPanel();
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
ChangingCircle gui = new ChangingCircle();
gui.go();
});
}
public void go() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
Random r = new Random();
Timer timer = new Timer(r.nextInt(5000) + 1000, new ActionListener() {
public void actionPerformed(ActionEvent ev) {
System.out.println("Timer");
color = Color.GREEN;
panel.repaint();
}
});
timer.setRepeats(false);
timer.start();
}
class MyPanel extends JPanel {
private int size = 100, loc = 100;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillOval(loc, loc, size, size);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(size + loc, size + loc);
}
}
}
其思想是计时器只更改要绘制的形状的属性,然后调用repaint()
以反映更改。只要需要,就会调用paintComponent
,即使是快速连续调用,也应该很快返回
具体说明:
- 从
外部创建并启动计时器,因为它被多次调用,这将创建并启动许多计时器paintComponent
- 您可能应该将计时器设置为不重复
- 调用
super.paintComponent(g)代码>作为内部的第一件事
paintComponent
- 您似乎有一个什么都不做的
ActionListener
- 如果适用,请使用
@覆盖
注释
- 在框架上调用
,而不是手动设置其大小,并pack()
@覆盖您在其上绘制的组件的
方法。根据绘制的内容返回有意义的大小getPreferredSize
- 使用
而不是相反的方法(不推荐使用)添加(组件、位置)
- 当局部变量可用时,不要使用字段(例如,
)Random r
- 使用大写常量名称(
而不是Color.RED
)Color.RED
操作执行
。谢谢您如此详细地描述它!
public class ChangingCircle {
Color color = Color.RED;
MyPanel panel = new MyPanel();
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
ChangingCircle gui = new ChangingCircle();
gui.go();
});
}
public void go() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
Random r = new Random();
Timer timer = new Timer(r.nextInt(5000) + 1000, new ActionListener() {
public void actionPerformed(ActionEvent ev) {
System.out.println("Timer");
color = Color.GREEN;
panel.repaint();
}
});
timer.setRepeats(false);
timer.start();
}
class MyPanel extends JPanel {
private int size = 100, loc = 100;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillOval(loc, loc, size, size);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(size + loc, size + loc);
}
}
}