2013-07-30 117 views
1

我正在做一些非常基本的编码,只是试图学习键绑定背后的基本概念。这一切似乎都很直接,但是我的逻辑或结构出现问题,导致我的代码无法按照我希望的方式执行。使用键绑定

这里是我的代码

public class Board { 

ButtonListener buttonlistener; 
EnterAction enterAction; 

public Board(){ 

    JFrame skeleton = new JFrame(); 
    skeleton.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    skeleton.setVisible(true); 
    skeleton.setSize(400, 400); 

    buttonlistener = new ButtonListener(); 
    enterAction = new EnterAction(); 

    JPanel panel = new JPanel(); 
    panel.setBackground(Color.BLACK); 

    JButton button = new JButton("button"); 
    button.addActionListener(buttonlistener); 
    panel.add(button); 
    skeleton.add(panel);   
    panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction"); 
    panel.getActionMap().put("doEnterAction", enterAction); 

} 

public class ButtonListener implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent arg0) {  
     System.out.println("button pressed"); 
    }  
} 

public class EnterAction extends AbstractAction{ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("enter pressed");  
    }  
} 

public static void main(String[] args){ 
    new Board(); 
} 

所以,它应该是非常简单的。正如你所看到的,我只是试着让它输出“enter pressed”,只要你按下回车键,但它不会打印出任何东西(除非你点击上面代码中显示的按钮)。另外,在eclipse中,EnterAction类以黄色下划线,我认为它可能不是正确的,但我不知道为什么它不会。

任何帮助表示赞赏,谢谢。

+0

那么,什么是你在Eclipse中得到警示? – Doorknob

回答

3

眼前的问题,我可以看到的是与下面的语句

panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction"); 

KeyStroke.getKeyStroke("s")会返回null。传递给此方法的String的要求非常特别且没有很好的记录(恕我直言)。

您可以改为使用KeyStroke.getKeyStroke("S"),但我更喜欢使用KeyStroke.getKeyStroke(KeyEvent.VK_S, 0),因为在声明中不可能有歧义。

我也建议你定义的焦点边界以及用于输入地图...

相反的panel.getInputMap(),请尝试使用panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW),以确保如果窗口集中

,关键事件将被触发

查看JComponent#getInputMap了解更多详情。

如果您还没有这样做的话,你也应该看看How to use Key Bindings

4

变化

panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction"); 

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("S"), "doEnterAction"); 

而且

skeleton.setDefaultCloseOperation(EXIT_ON_CLOSE);

参数必须是JFrame.EXIT_ON_CLOSE或者只是放数3

+0

*“或者只是把数字3 *”...以及如果常数改变值会发生什么? – MadProgrammer

+0

@MadProgrammer:简单地说,发生灾难了:) – Azad

2

我认为Azad和MadProgrammer是正确的,除了他们推荐的程序运行之外,我只需要做一个更简单的更改。我已经将这三个项目编号为代码中的注释:(复制和粘贴,你很好去)。

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

public class Board { 

    ButtonListener buttonlistener; 
    EnterAction enterAction; 

    public Board() { 

     JFrame skeleton = new JFrame(); 
     //Change #1 below 
     skeleton.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     skeleton.setVisible(true); 
     skeleton.setSize(400, 400); 

     buttonlistener = new ButtonListener(); 
     enterAction = new EnterAction(); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.BLACK); 

     JButton button = new JButton("button"); 
     button.addActionListener(buttonlistener); 
     panel.add(button); 
     skeleton.add(panel); 
     //Change #2 below 
     panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
       KeyStroke.getKeyStroke("S"), "doEnterAction"); 
     panel.getActionMap().put("doEnterAction", (Action) enterAction); 

    } 

    public class ButtonListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.out.println("button pressed"); 
     } 
    } 

    public class EnterAction extends AbstractAction { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("enter pressed"); 
     } 
    } 

    public static void main(String[] args) { 
     new Board(); 
    } 
    //Change #3 below 
} 

这里是截图: enter image description here