Java 如何创建控制停车灯的小程序?
我正在开发一个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
- 去
- 停止
- 慢
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);