2015-10-04 32 views
0

我正在尝试编写一个交通灯模拟程序,用于在Java课程中进行编程。当我运行小程序时,即使我还没有点击任何JButton,所有三个灯仍然点亮。当我这样做时,小程序会像做某事一样暂时变成空白,如果按GO键,汽车就会移动。我想知道是否需要重新设置图形类中的颜色,或者使用switch语句(我不太确定如何操作),然后从其他示例中看到的颜色开始。我的代码中是否有任何不正确的东西阻碍我获得我想要的结果?任何帮助将不胜感激。谢谢。使用if或switch语句更改交通信号灯

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

/** 
* Class TrafficLights - At the click of a button, change the traffic lights 
* 
* @author Mickey Mouse 
* @version JDK 8 
* @course CSCI 1130-01 
* @date 10-2-15 
*/ 
public class TrafficLights extends JApplet implements ActionListener { 
    private JButton WAIT, STOP, GO; 

    private boolean clickWAIT = false; 
    private boolean clickSTOP = false; 
    private boolean clickGO = false; 

    private int carX = 200; 

    /** 
    * Called by the browser or applet viewer to inform this JApplet that it 
    * has been loaded into the system. It is always called before the first 
    * time that the start method is called. 
    */ 
    public void init() 
    { 
     setLayout(new FlowLayout()); // changes the layout from BorderLayout to FlowLayout 

     WAIT = new JButton ("WAIT"); //adds WAIT label to button 
     WAIT.setForeground(Color.yellow); //changes the label to yellow 

     //adds the WAIT JButton to the screen 
     add (WAIT); 
     WAIT.addActionListener(this); 


     GO = new JButton ("GO"); //adds GO label to button 
     GO.setForeground(Color.green); //changes the label to green 

     //adds the button to the screen 
     add (GO); 
     GO.addActionListener(this); 


     STOP = new JButton ("STOP"); //adds STOP label to button 
     STOP.setForeground(Color.red); //changes the label to red 

     //adds STOP JButton to screen 
     add (STOP); 
     STOP.addActionListener(this); 


    } 



    /** 
    * Called by the browser or applet viewer to inform this JApplet that it 
    * should start its execution. It is called after the init method and 
    * each time the JApplet is revisited in a Web page. 
    */ 
    public void start() 
    { 
     // provide any code requred to run each time 
     // web page is visited 
    } 

    /** 
    * Called by the browser or applet viewer to inform this JApplet that 
    * it should stop its execution. It is called when the Web page that 
    * contains this JApplet has been replaced by another page, and also 
    * just before the JApplet is to be destroyed. 
    */ 
    public void stop() 
    { 
     // provide any code that needs to be run when page 
     // is replaced by another page or before JApplet is destroyed 
    } 

    /** 
    * Paint method for applet. 
    * 
    * @param g the Graphics object for this applet 
    */ 
    public void paint(Graphics g) 
    { 
     super.paint(g); 

     //declares and retrieves the images from their file locations 
     Image img = getImage(getDocumentBase(), "stoplights.png"); 
     Image img2 = getImage(getDocumentBase(), "car.jpg"); 

     g.drawImage(img, 50, 100, 300, 350, 0, 0, 5000, 5000, this); //draws and resizes the stoplights image 
     g.drawImage(img2, carX, 400, 1000, 1000, 0, 0, 5000, 5000, this); //draws and resizes the car image 

     //draw and fill an oval red for the STOP stoplight when STOP is pressed 
     if (clickSTOP == true); 
     { 
     g.drawOval(63, 112, 30, 30); 
     g.setColor(Color.red); 
     g.fillOval(63, 112, 30, 30); 
     clickSTOP = false; 
     } 


     //draw and fill an oval yellow for the WAIT stoplight when WAIT is pressed 
     if (clickWAIT == true); 
     { 
     g.setColor(Color.black); 
     g.drawOval(63, 148, 30, 30); 
     g.setColor(Color.orange); 
     g.fillOval(63, 148, 30, 30); 
     clickWAIT = false; 
     } 

     //draw and fill an oval green for the GO stoplight when GO is pressed 
     if (clickGO == true); 
     { 
     g.setColor(Color.black); 
     g.drawOval(63, 184, 30, 30); 
     g.setColor(Color.green); 
     g.fillOval(63, 184, 30, 30); 
     clickGO = false; 
     } 



    } 


    public void actionPerformed(ActionEvent event) 
    { 
     /* 
     * Links the JButtons and the graphic sequences to display the lights 
     * 
     */ 
     if(event.getSource() == GO) //display green if GO is clicked 
     { 
      clickGO = true; 
      carX -=15; 
      repaint(); 
      } 
      if (event.getSource() == WAIT) //display yellow if WAIT is clicked 
      { 
       clickWAIT = true; 
       repaint(); 
       } 
       if (event.getSource() == STOP) //display red if STOP is clicked 
       { 
        clickSTOP = true; 
        repaint(); 
        } 

    } 


    /** 
+0

当您更改状态(例如从等待到停止)时,您需要重置其他状态。使用单个状态变量会更简单,例如可能利用'enum's例如 – MadProgrammer

回答

2

当我运行小程序,所有三个指示灯仍然点亮,即使我没有任何点击这些Jbutton的又

这是因为你的每一个后有;if语句,这基本上是短路你的逻辑,所以它后面的代码,总是执行,不管变量的状态...

if (clickSTOP == true); 

所以,相反,你应该使用更多的东西一样

if (clickSTOP == true) 
{ 
    g.setColor(Color.red); 
    g.fillOval(63, 112, 30, 30); 
    clickSTOP = false; 
} 

您也从内您paint方法修改程序的状态,这是一般不提倡,因为paint应该只是做到这一点,漆当前州。

更好的地方改变国家在ActionListener

相反则有三个状态变量,它通常被描述同样的事情,你应该有一个单一的状态变量,所以国家就永远只能是gowaitstop,从来没有一个三者的组合。

同样,你可以使用一个ButtonGroupJToggleButton S或JRadioButton S,这将允许按钮携带一定数量的关于状态的信息,因为只有唯一的按钮可以在一个时间来选择。

看一看How to Use the ButtonGroup ComponentHow to Use Buttons, Check Boxes, and Radio Buttons更多细节

当我这样做时,小应用程序打开空白的瞬间像它做一些

这可能是事实,你是引起从paint方法中加载图像,但作为一般规则,您应避免覆盖此类顶级容器的paint

+0

感谢您花时间写出如此彻底的答案。我会尽量做出适当的调整,看看它是如何发展的。再次感谢您的回复。 – chase366