-->

火的JButton用空格键或回车键,或者鼠标点击(Fire a JButton with space

2019-06-24 16:39发布

我试图得到一个简单的JFrame一个按钮,当这些事件发生的触发事件:

  • 回车键被按下,将JButton具有焦点
  • 按下空格键和一个JButton具有焦点
  • 将JButton被点击。

看来,输入和空格键来“免费”与将JButton使用addActionListener方法,默认的鼠标点击一起; 麻烦的是,我读过的按键绑定依赖于外观和感觉使用。

我试着加入回车,空格键JButton的动作映射得到跨越的LaF普遍行为,甚至添加一个随机密钥(“M”),以确保ActionMap中所做的工作(这是),但现在的鼠标单击丢失。 我似乎能够得到所有的按键和鼠标点击的唯一办法是同时使用动作映射和addActionListener方法。

有没有办法让这些键和鼠标绑定在所有的LaF工作始终没有试图检测每一个可能的LaF可能一起去吗? 我可以注册一个动作监听器将触发两个按键和鼠标事件?

我最喜欢的解决办法是增加一个鼠标点击将JButton动作映射和检测哪些键或鼠标点击碰巧里面的动作里面。

我还在学习的绳索在这里,所以这可能不是做事情的最好或最有效的方式; 我敢肯定它是过度设计。 这是那种训练演习在那里我有尝试一切我能得到我的手的。 任何及所有的编码风格的意见,欢迎!

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;

public class Example extends JFrame {

// ============================
private class BtnListener extends AbstractAction {
    private static final long serialVersionUID = 1L;

    public void actionPerformed(ActionEvent ae) {
        System.out.println("\nclick button listener triggered");
        System.out.println(ae.getSource().getClass().toString());
    }
} // class BtnListener

private static final int NO_MODIFIER = 0;
private static final boolean ON_KEY_PRESS = false;
private static final KeyStroke ENTER_PRESSED = KeyStroke.getKeyStroke(
        KeyEvent.VK_ENTER, NO_MODIFIER, ON_KEY_PRESS);
private static final KeyStroke M_PRESSED = KeyStroke.getKeyStroke(
        KeyEvent.VK_M, NO_MODIFIER, ON_KEY_PRESS);
private static final KeyStroke SPACEBAR_PRESSED = KeyStroke.getKeyStroke(
        KeyEvent.VK_SPACE, NO_MODIFIER, ON_KEY_PRESS);
private JButton btnButton;
private final AbstractAction btnListener = new BtnListener();
private JPanel buttonPanel;
private JFrame frmMain;

public static void main(String[] args) {
    Example ex = new Example();
    ex.displayFrame();
}

Action btnActionListener = new AbstractAction() {
    private static final long serialVersionUID = 1L;

    public void actionPerformed(ActionEvent e) {
        System.out.println("\nkey button action triggerred");
        System.out.println(e.getSource().getClass().toString());
        if (e.getSource() instanceof JButton) {
            System.out.println("button");
        } else {
            System.out.println("Something else");
        }
    }
};

public Example() {
    initialize();
}

public void displayFrame() {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Throwable e) {
        e.printStackTrace();
    }
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frmMain.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

private void initialize() {

    frmMain = new JFrame();
    btnButton = new JButton("Abutton");

    // Comment this out, you lose the mouse click
    btnButton.addActionListener(btnListener);

    // Comment out ActionMaps, but keep addActionListner (above), and
            // only lose M_PRESSED
    InputMap buttonFocusedMap = btnButton
            .getInputMap(JComponent.WHEN_FOCUSED);

    buttonFocusedMap.put(ENTER_PRESSED, "blah");
    btnButton.getActionMap().put("blah", btnActionListener);

    buttonFocusedMap.put(SPACEBAR_PRESSED, "blort");
    btnButton.getActionMap().put("blort", btnActionListener);

    buttonFocusedMap.put(M_PRESSED, "gaaak");
    btnButton.getActionMap().put("gaaak", btnActionListener);

    // Is there a way to add a mouse click to the ActionMap?

    buttonPanel = new JPanel();
    buttonPanel.add(btnButton);

    frmMain.getContentPane().add(buttonPanel);
    frmMain.setBounds(100, 100, 500, 432);
    frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

Answer 1:

BasicButtonListener ,通过使用BasicButtonUI ,确保所有的按钮(检查,无线电,切换)聚焦时被绑定到空间 。 这种跨平台工作,即使个别的外观和感觉可唯一呈现各种按钮模型状态。 按空格唤起了 UIAction ,并释放空间唤起释放 UIAction 。 同样当被按下并且该按钮的边界内释放鼠标发生; 按钮的同时拖动外压看到戒备状态变化。

在这两种情况下, 按下释放组合调用你的按钮的actionPerformed()方法。

结合输入到一个方便的方式Action ,而不管焦点的,是通过根窗格的setDefaultButton()方法。 这个例子说明了这三种方法来点击一个按钮。



Answer 2:

什么,你可以(也可能应该)做的就是创建一个AbstractAction。 您可以使用AbstractAction这对你的ActionMap以及为点击(做JButton.setAction(...))



文章来源: Fire a JButton with spacebar, or enter key, or mouse click