Java,GUI:红绿灯,根据数组值更改颜色方法

时间:2017-11-05 21:33:06

标签: java

我发现了这个非常棒的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 );
    }
}

1 个答案:

答案 0 :(得分:0)

问题是你的main方法是静态的,所以它在自己的对象中调用的所有方法也需要是静态的。所以在你打电话时的代码中:

 test(x);

您没有在TrafficLight对象上调用它,而是在TrafficLight类上调用它。

您要做的是在您创建的红绿灯对象上调用您的方法:

tl.test(x);