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

Java 如何创建控制停车灯的小程序?,java,swing,applet,Java,Swing,Applet,我正在开发一个Java小程序,它有三个按钮: 去 停止 慢 这些按钮将控制停车灯,停车灯反过来控制汽车。在这一点上,我无法让刹车灯改变颜色,同时保持类强制的switch语句。以下是我目前的代码: import java.awt.*; import java.applet.*; import javax.swing.*; import java.awt.event.*; public class lights extends JApplet implements ActionListener

我正在开发一个Java小程序,它有三个按钮:

  • 停止
这些按钮将控制停车灯,停车灯反过来控制汽车。在这一点上,我无法让刹车灯改变颜色,同时保持类强制的switch语句。以下是我目前的代码:

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

无论何时调用
paint
,您都会重复添加按钮<调用代码>绘制可能有多种原因,其中可能有您无法控制的原因。切勿在
paint
方法中修改任何UI组件的状态

相反,在
init
方法中调用
按钮

问题#2

当您更改灯光的状态时,您不会告诉UI更新自身。在
actionPerformed
方法中,添加
repaint()
作为最后一条语句,这将计划重新绘制组件,并将(最终)调用
paint

更好的解决方案

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

请查看以了解更多详细信息

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


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

为什么要编写小程序?如果是由于您的讲师的规范,请参考。
ac=getAudioClip(getDocumentBase(),“Hot rod start.wav”);ac.play()我们不应该尝试在
paint()
方法中加载资源!最好移动
ac=getAudioClip(getDocumentBase(),“Hot rod start.wav”)
init()
方法中。不要在
paint
方法中添加组件(或实际修改组件的状态)!!应该在
init
方法中添加组件!我明白你的意思,只要不在paint方法中调用buttons方法,但是当我尝试将其放入init时,我的applet就不会初始化。我将查看oracle教程。此外,我还必须为按钮使用flowlayout,这是项目的一项要求。按钮位于单独的
JPanel
上,默认情况下使用
flowlayout
,我指的是将面板放在小程序的北面位置,默认情况下,它使用的是
边框布局
,我让灯光正常工作,但那是在我删除音频文件之后。我现在的问题是,当按下go时,如何播放音频文件,我还需要一个汽车图像,在go时移动,在slow和stop时停止。音频应该通过
actionPerformed
方法控制,汽车的状态也是如此。对于汽车动画,您可能需要一个
javax.swing.Timer
当我使用paint方法绘制图像时,我的小程序不再初始化。我的音频不会在actionpeformed方法下播放(与之前在if(obj==go)部分下播放的代码相同)。
add(buttong, BorderLayout.NORTH);
add(lightsPane);