Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除默认JButton输入映射_Java_Swing_User Interface_Applet - Fatal编程技术网

Java 删除默认JButton输入映射

Java 删除默认JButton输入映射,java,swing,user-interface,applet,Java,Swing,User Interface,Applet,在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)UI

在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");
        }
    }
}
//要删除的密钥列表
公共静态最终int[]覆盖的_键=
{
VK_空间
};
//获取默认输入映射
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”)
};
//循环输入映射
for(int i=0;i

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

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

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), NIL);
有效地阻止空格键调用按钮的
ActionListener
。取消行的注释

button.getActionMap().put(NIL, nil);
将空格键与有效的空操作关联,如中所述的
doNothing
操作中所示


我试过了,但是当我调用
UIManager.get(“Button.focusInputMap”)时,我的UI管理器返回了null。你知道为什么会这样吗?我应该提到,我正在使用一个定制的synth外观,它是由我编写的xml文件生成的……对不起,不知道如何使用XML添加一个新的
focusInputMap
。那么除了遍历所有组件并一次执行一个操作之外,没有办法从每个组件输入映射中删除一个键吗?我想我不明白为什么自定义L&F会为
focusInputMap
默认值返回
null
,当原始L&F拥有它们时。
/**
 * @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();
            }
        });
    }
}