我发现了这个非常棒的Java Traffic Light代码,效果很好: https://www.roseindia.net/answers/viewqa/Java-Beginners/19175-how-to-make-traffic-light-code-in-java.html
我想实现类似的东西,但点击按钮时灯光不应该改变。我希望它们基于具有双精度的数组进行更改,但我不知道如何将更改灯命令发送到GUI。
我从网站上更改了代码并删除了我不需要的所有内容。
问题发生在测试方法中,eclipse要求我让测试方法静态,但是我希望方法返回命令来切换灯光,而在原始代码中,方法actionPerformed也不是静态的
稍后我可能不得不在灯光变化之间实现延迟,以便它可见
非常感谢!
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
public class TrafficLight extends JFrame {
Signal green = new Signal(Color.green);
Signal yellow = new Signal(Color.yellow);
Signal red = new Signal(Color.red);
public TrafficLight(){
super("Traffic Light");
getContentPane().setLayout(new GridLayout(2, 1));
green.turnOn(false);
yellow.turnOn(false);
red.turnOn(true);
JPanel p1 = new JPanel(new GridLayout(3,1));
p1.add(red);
p1.add(yellow);
p1.add(green);
getContentPane().add(p1);
pack();
}
public static void main(String[] args){
TrafficLight tl = new TrafficLight();
tl.setVisible(true);
double[] x = {
-5,
-6,
143.18,
146.8,
144.61,
142.3,
144.22,
};
test(x);
}
public void test(double[] testArray) {
for(int i = 0; i < testArray.length; i++){
if(testArray[i] <= 0){ //no data yet...
green.turnOn(false);
yellow.turnOn(false);
red.turnOn(true);
} else if(testArray[i] > 0){
red.turnOn(false);
yellow.turnOn(false);
green.turnOn(true);
}}}
}
class Signal extends JPanel{
Color on;
int radius = 40;
int border = 10;
boolean change;
Signal(Color color){
on = color;
change = true;
}
public void turnOn(boolean a){
change = a;
repaint();
}
public Dimension getPreferredSize(){
int size = (radius+border)*2;
return new Dimension( size, size );
}
public void paintComponent(Graphics g){
g.setColor( Color.black );
g.fillRect(0,0,getWidth(),getHeight());
if (change){
g.setColor( on );
} else {
g.setColor( on.darker().darker().darker() );
}
g.fillOval( border,border,2*radius,2*radius );
}
}
答案 0 :(得分:0)
问题是你的main方法是静态的,所以它在自己的对象中调用的所有方法也需要是静态的。所以在你打电话时的代码中:
test(x);
您没有在TrafficLight
对象上调用它,而是在TrafficLight
类上调用它。
您要做的是在您创建的红绿灯对象上调用您的方法:
tl.test(x);