如何创建控制停止灯的小程序?

时间:2014-07-23 03:27:05

标签: java swing applet

我正在开发一个Java applet,它有三个按钮:

  • 开始
  • 停止

按钮将控制一个反过来控制汽车的红绿灯。在这一点上,我无法让停止灯改变颜色,同时保持班级强制要求的开关语句。到目前为止,这是我的代码:

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

public class lights extends JApplet implements ActionListener {

    JButton stop, go, slow;
    AudioClip ac;
    JPanel buttong;
    int x = 0;

    public void init() {
    }

    public void actionPerformed(ActionEvent ae) {
        Object obj = ae.getSource();

        if (obj == go) {
            x = 1;
        }

        if (obj == stop) {
            x = 2;
        } else if (obj == slow) {
            x = 3;
        }
    }

    public void paint(Graphics g) {
        super.paint(g);
        stoplight(g, 50, 50);
        buttons();

        switch (x) {
            case 1:
                g.setColor(Color.green);
                g.fillOval(50, 50, 10, 10);

                ac = getAudioClip(getDocumentBase(), "Hot rod start.wav");
                ac.play();
                break;
            case 2:
                x = 2;
                g.setColor(Color.red);

                g.fillOval(50, 70, 10, 10);
                break;
            case 3:
                g.setColor(Color.yellow);

                g.fillOval(x, 60, 10, 10);
                break;
        }
    }

    public void stoplight(Graphics grph, int x, int y) {
        Polygon box;
        box = new Polygon();
        box.addPoint(x, y);
        box.addPoint(x + 10, y);
        box.addPoint(x + 10, y + 30);
        box.addPoint(x, y + 30);
        grph.drawPolygon(box);
        grph.drawOval(x, y, 10, 10);
        grph.drawOval(x, y + 10, 10, 10);
        grph.drawOval(x, y + 20, 10, 10);
        Polygon pole;
        pole = new Polygon();
        pole.addPoint(x + 3, y + 30);
        pole.addPoint(x + 3, y + 70);
        pole.addPoint(x + 7, y + 70);
        pole.addPoint(x + 7, y + 30);
        grph.drawPolygon(pole);
    }

    public void buttons() {

        buttong = new JPanel(new FlowLayout());
        stop = new JButton("Stop");

        go = new JButton("Go");

        slow = new JButton("Slow");
        go.addActionListener(this);
        stop.addActionListener(this);
        slow.addActionListener(this);

        buttong.add(go);
        buttong.add(stop);
        buttong.add(slow);
        add(buttong);
    }
}

1 个答案:

答案 0 :(得分:2)

问题#1

每次调用paint时,您都会反复添加按钮。 paint可能因任何原因而被召唤,可能是您无法控制的。切勿修改paint方法中任何UI组件的状态。

而是在buttons方法中调用init

问题#2

当您更改灯光状态时,您不会告诉UI自行更新。在actionPerformed方法中,添加repaint();作为最后一个语句,这将安排重新组织您的组件,并paint将(最终)调用

更好的解决方案

首先将自定义绘画移动到paintComponent的{​​{1}}方法。这将允许您隔离绘画并添加双缓冲的额外好处(停止闪烁更新)

有关详细信息,请查看Performing Custom Painting

将您的按钮添加到小程序的JPanel位置,将灯光面板添加到BorderLayout.NORTH,这样可以防止按钮与灯光面板交互(重叠)。

BorderLayout.CENTER

这将要求您提供从小程序控制灯光面板的方法,但从长远来看,它将使您的生活更轻松