如何在Java GUI中使用计时器重复更改圆圈的颜色



我正试图使用Java GUI创建一个红绿灯,它只显示一个圆圈,颜色从红色变为黄色,再变为绿色。应该有一个定时器,只有黄色应该在3秒内变为绿色。我已经设置了一个圆圈和一个红色,但我无法使用计时器将其分别更改为黄色和绿色。

顺便说一句,我对GUI真的很陌生,在网上找不到有用的来源,尽管我仍然看了几段youtube视频,但没有发现任何有用的或与此任务相关的东西。任何帮助都将不胜感激

代码:

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JFrame;
public class Main extends Canvas {
public static void main(String[] args) {
JFrame frame = new JFrame();
Canvas canvas = new Main();
canvas.setSize(700, 700);
frame.add(canvas);
frame.pack();
frame.setVisible(true);
}
public void paint(Graphics g) {
g.setColor(Color.red);
g.fillOval(200, 200, 300, 300);
}
}

预期输出:

它应该只有一个圆圈

这里有一种方法。指示灯保持亮起3秒钟。要更改它们的持续时间,必须相应地修改代码。这将在计时器内完成。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class TrafficLight extends JPanel {
JFrame frame = new JFrame();

int colorIdx = 0;
Color[] colors = { Color.green, Color.yellow, Color.red };

public static void main(String[] args) {
// Ensure the program is started on the Event Dispatch Thread
SwingUtilities.invokeLater(() -> new TrafficLight().start());
}

public void start() {
// set up
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// set the preferred size. Okay in this instance but best
// practice dictates to override getPreferredSize()
setPreferredSize(new Dimension(500, 500));

frame.add(this);
frame.pack();

// center on screen
frame.setLocationRelativeTo(null);
frame.setVisible(true);

Timer t = new Timer(3000, ae -> {
colorIdx = colorIdx >= 2 ? 0 : colorIdx + 1;
repaint();
});
t.start();
}


public void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor(colors[colorIdx]);
g.fillOval(150, 150, 200, 200);

}

}
  1. 不要扩展Canvas。Swing中的自定义绘制是通过扩展JPanel和重写paintComponent()方法来完成的。阅读Swing教程中关于自定义绘制的部分,了解更多信息和工作示例。

  2. 绘制方法应该只绘制类的当前状态。因此,您需要将类似setLightColor(Color lightColor)的方法添加到执行自定义绘制的组件中。然后在绘制方法中,使用该值作为圆的颜色(而不是硬编码"RED"(。或者您有一个类似changeLight()的方法,可以从0、1、2、0、1和2更新变量……然后在绘制方法中检查变量的状态并绘制适当的颜色。

  3. 您需要使用Swing Timer来安排事件。当Timer触发时,您将调用类上的setLightColor(...)方法。

  4. Timer应该是您的类中进行自定义绘制的一部分。您应该有一个可以启动/停止计时器的方法。

您可以查看:https://stackoverflow.com/a/7816604/131872Swing Timer的基本示例。

相关内容

  • 没有找到相关文章

最新更新