我正试图使用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);
}
}
-
不要扩展Canvas。Swing中的自定义绘制是通过扩展
JPanel
和重写paintComponent()
方法来完成的。阅读Swing教程中关于自定义绘制的部分,了解更多信息和工作示例。 -
绘制方法应该只绘制类的当前状态。因此,您需要将类似
setLightColor(Color lightColor)
的方法添加到执行自定义绘制的组件中。然后在绘制方法中,使用该值作为圆的颜色(而不是硬编码"RED"(。或者您有一个类似changeLight()
的方法,可以从0、1、2、0、1和2更新变量……然后在绘制方法中检查变量的状态并绘制适当的颜色。 -
您需要使用Swing Timer来安排事件。当Timer触发时,您将调用类上的
setLightColor(...)
方法。 -
Timer应该是您的类中进行自定义绘制的一部分。您应该有一个可以启动/停止计时器的方法。
您可以查看:https://stackoverflow.com/a/7816604/131872Swing Timer的基本示例。