我正在开发一个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);
}
}
答案 0 :(得分:2)
问题#1
每次调用paint
时,您都会反复添加按钮。 paint
可能因任何原因而被召唤,可能是您无法控制的。切勿修改paint
方法中任何UI组件的状态。
而是在buttons
方法中调用init
。
问题#2
当您更改灯光状态时,您不会告诉UI自行更新。在actionPerformed
方法中,添加repaint();
作为最后一个语句,这将安排重新组织您的组件,并paint
将(最终)调用
更好的解决方案
首先将自定义绘画移动到paintComponent
的{{1}}方法。这将允许您隔离绘画并添加双缓冲的额外好处(停止闪烁更新)
有关详细信息,请查看Performing Custom Painting
将您的按钮添加到小程序的JPanel
位置,将灯光面板添加到BorderLayout.NORTH
,这样可以防止按钮与灯光面板交互(重叠)。
BorderLayout.CENTER
这将要求您提供从小程序控制灯光面板的方法,但从长远来看,它将使您的生活更轻松