按下键时绘制图像

时间:2014-02-04 00:15:55

标签: java key paint

我正在创建一个显示交通信号灯的简单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

1 个答案:

答案 0 :(得分:2)

我们忽略了您的代码不完整的事实,因此无法知道您要扩展的内容,或者您​​是否实际添加了KeyListener

KeyListener以其对焦点状态变幻无常而臭名昭着。基本上,这意味着,KeyListener只会响应按键,如果它注册的组件是可聚焦的并具有键盘焦点...

更好的解决方案是使用Key Bindings API,它可以更好地控制将触发关键事件的焦点水平。

你也打破了油漆链。绘画是一系列复杂的方法调用,链接在一起产生最终结果。由于未能调用super.paint,您已经破坏了这个链,引入了绘制工件的可能性。

您还应该避免覆盖paint,尤其是顶级容器,例如窗口,因为它们不是双缓冲的。相反,建议您从JPanelJComponent扩展并覆盖它的paintComponent方法。

请查看Performing Custom Painting了解详情。

根据查看完整来源

进行了更新
  • 避免使用基于AWT的组件(例如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有些值得...