【问题标题】:Removing Default JButton input map删除默认 JButton 输入映射
【发布时间】:2012-08-21 10:59:22
【问题描述】:

我在删除 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 单击等。有人看到此代码块有问题吗?先谢谢了。

【问题讨论】:

    标签: java swing user-interface applet


    【解决方案1】:

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

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

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

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

    Space 键与一个有效的空操作相关联,如How to Make and Remove Key Bindings 中描述的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();
                }
            });
        }
    }
    

    【讨论】:

    • 好吧,我试过了,但是当我调用 UIManager.get("Button.focusInputMap"); 时,我的 UI 管理器返回了一个空值。关于为什么会这样的任何想法?
    • 我应该提一下,我使用的是自定义合成器外观,由我编写的 xml 文件生成....
    • 抱歉,不知道如何使用 XML 添加新的focusInputMap
    • 那么除了遍历所有组件并一次执行一个之外,没有办法从每个组件输入映射中删除一个键吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多