5

我在删除 java swing 应用程序中组件上的默认输入映射信息时遇到了一些麻烦。这就是我想要做的:

//List of keys to remove
public static final int[] OVERWRITTEN_KEYS = 
{
    VK_SPACE
};

//Get default input maps
InputMap[] im = { 
    (InputMap)UIManager.get("Button.focusInputMap"),
    (InputMap)UIManager.get("ToggleButton.focusInputMap"),
    (InputMap)UIManager.get("Slider.focusInputMap"),
    (InputMap)UIManager.get("RadioButton.focusInputMap"),
    (InputMap)UIManager.get("TextArea.focusInputMap"),
    (InputMap)UIManager.get("TextField.focusInputMap")
};

//Loop through input maps        
for(int i = 0; i < im.length; i++)
{
    //Loop through keys
    for(int j = 0; j < OVERWRITTEN_KEYS.length; j++)
    {
        if(im[i] != null)
        {
            //Overwrite press and release of button
            im[i].put(KeyStroke.getKeyStroke(OVERWRITTEN_KEYS[j],0,false), "none");
            im[i].put(KeyStroke.getKeyStroke(OVERWRITTEN_KEYS[j],0,true), "none");
        }
    }
}

但是,由于某种原因,这没有效果。按空格键仍会触发 JButton 单击等。有人看到此代码块有问题吗?预先感谢。

4

1 回答 1

8

我无法重现您描述的问题。我通常修改组件的InputMap,但UIManager实例具有默认绑定。在下面的示例中,

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), NIL);

有效地阻止Space键调用按钮的ActionListener. 取消注释该行

button.getActionMap().put(NIL, nil);

Space键与有效的空操作相关联,如如何制作和删除键绑定doNothing中描述的操作中所示。

/**
 * @see http://stackoverflow.com/q/12133795/230513
 */
public class NilBindingTest extends JPanel {

    private static final String NIL = "none";
    private Action nil = new AbstractAction(NIL) {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("\"" + e.getActionCommand() + "\"");
        }
    };
    private JButton button = new JButton(nil);
    //private InputMap im = button.getInputMap();
    private InputMap im = (InputMap) UIManager.get("Button.focusInputMap");

    public NilBindingTest() {
        this.add(new JButton("foo"));
        System.out.println(Arrays.toString(im.keys()));
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), NIL);
        //button.getActionMap().put(NIL, nil);
        this.add(button);
    }

    private void display() {
        JFrame f = new JFrame("NilBindingTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NilBindingTest().display();
            }
        });
    }
}
于 2012-08-27T04:39:39.073 回答