【问题标题】:Java Keylistener If Statement [duplicate]Java Keylistener If 语句 [重复]
【发布时间】:2013-06-24 23:05:58
【问题描述】:

我正在尝试创建一个程序,其中图像在屏幕上,如果变量 keycode 等于键 VK_ESCAPE,它将使用 validate 方法从屏幕上删除图像。如何聚焦 keylistener 以便运行 if 语句并验证图像。我导入了正确的库并且没有出现错误?!

public void keyPressed(KeyEvent e){
    int keycode = e.getKeyCode();
    if(keycode == KeyEvent.VK_ESCAPE){
     scroll = new ImageIcon("").getImage();
     validate();
     e.consume();
    }
}

【问题讨论】:

  • 是否调用了keyPressed?要触发事件的组件必须具有键盘焦点。推荐的替代方法是使用key bindings 而不是KeyListener。那么组件就不需要成为焦点所有者了。
  • 您需要从父级删除图像,例如JPanel 然后调用 revalidate()

标签: java swing keylistener


【解决方案1】:

你应该使用Key Bindings 而不是Key Listeners 因为key listeners 的主要问题是你必须有焦点,除了在键绑定中你只将一个动作绑定到一个键上,在你绑定到所有的键监听器中。顺便说一句,你没有删除任何东西 在您的组件中,您必须删除图像,然后调用 revalidate()

教程How to use key bindings

例子:

AbstractAction escapeAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
         myComponent.remove(img); // if you are not using label,if yes label.setImage(null); 
         revalidate();  // im not pretty sure about this 2 lines
         repaint(); //suggested by madProgrammer
    }};
 String key = "ESCAPE";
 KeyStroke keyStroke = KeyStroke.getKeyStroke(key);
 component.getInputMap().put(keyStroke, key);
 component.getActionMap().put(key, escapeAction);

【讨论】:

  • 虽然我当然同意,并且解释为什么 OP 应该使用 KeyListener 的键绑定不会误入歧途,不像盲目的建议 ;)
  • @MadProgrammer 像这样删除 img 是否正确?假设他将 img 作为最终变量
  • 我取决于 OP 想要做什么。将标签的图标设置为null 也可以。您仍然需要重新验证(并可能重新绘制)父容器以使其更新
  • @MadProgrammer revalidate 不调用 repaint?我编辑了:)
  • “revalidate 不调用 repaint?” 因为,根据我的经验,有时我会说这是一个很难回答的问题。添加repaint 保证repaint 将发生,并且RepaintManager 合并重复请求,它不会受到伤害
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 2017-11-21
相关资源
最近更新 更多