gpt4 book ai didi

java - 删除默认的 JButton 输入映射

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:30 27 4
gpt4 key购买 nike

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

最佳答案

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

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();
}
});
}
}

关于java - 删除默认的 JButton 输入映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133795/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com