我正在创建一个显示交通信号灯的简单Java小程序。如果没有按下按键,则背景为白色。如果您点击小键盘上的“1”,“2”或“3”键,那么红绿灯应该更改颜色:红色,绿色和黄色。它没有用,因为当我按任意键时,没有任何反应。 除了isReleased之外,所有isX布尔值都被初始化为false。
@Override
public void keyPressed(KeyEvent e) {
isReleased = false;
switch(e.getKeyCode()){
case KeyEvent.VK_NUMPAD1:
isRed=true;
break;
case KeyEvent.VK_NUMPAD2:
isGreen=true;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
isReleased = true;
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void paint(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(trafficLight, 0, 0, null);
if(isReleased==true){
g.drawImage(blank, 0, 0, this);
}else{
if(isRed==true){
g.drawImage(red, 0, 0, this);
}
if(isGreen==true){
g.drawImage(green, 0, 0, this);
}
}
}
注意
(更新)我的完整代码可以在这里看到:http://pastebin.com/8ZNQUWJy
答案 0 :(得分:2)
我们忽略了您的代码不完整的事实,因此无法知道您要扩展的内容,或者您是否实际添加了KeyListener
。
KeyListener
以其对焦点状态变幻无常而臭名昭着。基本上,这意味着,KeyListener
只会响应按键,如果它注册的组件是可聚焦的并具有键盘焦点...
更好的解决方案是使用Key Bindings API,它可以更好地控制将触发关键事件的焦点水平。
你也打破了油漆链。绘画是一系列复杂的方法调用,链接在一起产生最终结果。由于未能调用super.paint
,您已经破坏了这个链,引入了绘制工件的可能性。
您还应该避免覆盖paint
,尤其是顶级容器,例如窗口,因为它们不是双缓冲的。相反,建议您从JPanel
或JComponent
扩展并覆盖它的paintComponent
方法。
请查看Performing Custom Painting了解详情。
根据查看完整来源
进行了更新Applet
),API已过期,而且很多人不再使用它,相反,您应该考虑使用JApplet
。但就个人而言,在您对整体API有更好的了解之前,我会避免使用applet。setSize
,大小由描述浏览器小程序的html标记确定run
方法毫无意义,因为它实际上没有做任何有用的事情,实际上可能导致您的应用程序“挂起”update
方法仅绘制trafficLight
BufferedImage
,但由于您未能调用super.update
,因此无其他内容。最好去掉它并在paint
方法中进行绘画,但要确保你正在调用super.paint
。但正如我已经说过的,你最好使用像JPanel
这样的东西并覆盖它的paintComponent
方法。请查看Creating a GUI with Swing了解详情
您可能还会发现Why CS teachers should stop teaching Java applets有些值得...