如何阻止空格键触发按钮上的点击效果?

时间:2017-06-25 20:29:28

标签: java swing netbeans actionlistener keylistener

我已经创建了一个jframe,并且我添加了一个按钮,在点击之后,它会要求您按下任何按钮,该按钮也会显示在按钮上。
(它的显示应该是这样的 - >"点击我" - >"按任意按钮" - >"空格键")
我的第一个问题是,我不想从"点击我"到"按任意按钮"按空格键。
我的问题2是,当我在"按任意按钮"我按空格键,在发布时,它会回到"按任意按钮"而不是留在" Space Bar" 这是我的代码。

    public class Test {

/**
 * @param args the command line arguments
 */

static class starton implements ActionListener {
    private JButton button;
    private JFrame frame;

    public starton(JButton button, JFrame frame) {
        this.button = button;
        this.frame = frame;
    }

    public void actionPerformed(ActionEvent e) {
        button.setText("Press A Button");
        button.setSize(button.getPreferredSize());
        button.addKeyListener(
        new KeyListener() {
            @Override 
            public void keyPressed(KeyEvent e){
                String text = null;

                    char a = e.getKeyChar();
                    text = ""+a+"";
                    if (a == ' '){
                        text = "Space Bar";
                    }

                button.setText(""+text+"");
                button.setSize(button.getPreferredSize());
                button.removeKeyListener(this);
            }

            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent ke) {
            }
        });
    }
}

public static void main(String[] args) throws IOException {

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    double width = screenSize.getWidth();
    double height = screenSize.getHeight();
    int frame1w = 600;
    int frame1h = 400;

    JFrame frame1 = new JFrame("Foo");
    frame1.setSize(frame1w, frame1h);
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel contentPane = new JPanel();
    contentPane.setBackground(Color.WHITE);
    contentPane.setLayout(null);
    frame1.setContentPane(contentPane);

    JButton button1 = new JButton("Click Me");
        button1.setSize(button1.getPreferredSize());
        button1.addActionListener(new starton(button1, frame1));
            // add more code here
        contentPane.add(button1);
        frame1.setVisible(true);
}

}

2 个答案:

答案 0 :(得分:3)

JButton安装一系列键绑定来控制用户输入

你可以检查一下这些是什么......

JButton btn = new JButton("Test");
InputMap im = btn.getInputMap();
for (KeyStroke ik : im.allKeys()) {
    System.out.println(ik + " = " + im.get(ik));
}

在我的系统上,它会打印

pressed SPACE = pressed
released SPACE = released

这告诉我 Space 键绑定到操作键pressedreleased

要禁用这些密钥,您需要提供自己的绑定...

Action blankAction = new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
    }
};

ActionMap am = btn.getActionMap();
am.put("pressed", blankAction);
am.put("released", blankAction);

这只会将pressedreleased绑定替换为空Action,但不执行任何操作。

现在,一句警告 - 关键绑定在不同的平台/外观和感觉上可能会有所不同;您还应该注意,用户通常对某些控件可以做什么和不能做什么有预定义的期望,更改它们会影响他们对您的程序的反应

关于您的第二个问题,button仍然使用您最初注册的ActionListener,因此无论何时按 Space ,它都会触发{再次{1}},并添加一个新的ActionListener,这将加剧您的问题

您要么对两个按钮使用单独的KeyListener,要么在第一次触发按钮时从按钮中删除ActionListener - 我要去第二个按钮,它更容易理解代码

  

不,我的意思是,如果我禁用"按"对于空格键,当我在"按任意按钮时,我能够按下它吗?

最简单的解决方案是使用两个不同的按钮,一个用ActionListener设置另一个按钮,该按钮附有ActionListener

如果由于某种原因你真的"不想这样做,然后您需要在首次触发时从按钮中删除KeyListener

ActionListener

答案 1 :(得分:0)

由于您对动作侦听器中的KeyListener进行了嵌套控制,因此出现了问题。由于空格键是相当于单击按钮的默认键盘按钮,因此每次按下按钮actionPerformed空格键 ActionListener方法被解雇了。如果你actionCommand ActionEvent被解雇并打印出来,你可以看到这种情况。您还可以使用它来控制执行的代码。像这样:

public void actionPerformed(ActionEvent e) 
{
    System.out.println("Button Action: " + e.getActionCommand());
    if(e.getActionCommand().equals("Click Me"))
    {
        //Your existing code but remove this line
        //button.removeKeyListener(this);
    }
}