当前位置: 首页 > 面试题库 >

使用空格键触发JButton或输入键,或单击鼠标

张照
2023-03-14
问题内容

我试图通过一个按钮来获得一个简单的JFrame,以在发生以下任何事件时触发一个事件:

  • 按下Enter键,并且JButton具有焦点
  • 按下空格键,并且JButton具有焦点
  • 单击JButton。

看起来,使用JButton上的addActionListener,默认情况下,Enter和空格键是“免费的”,以及默认的鼠标单击。麻烦的是,我已经读到键绑定取决于所使用的外观。

我试图通过在JButton的动作图中添加Enter和空格键来实现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);
}

}

问题答案:

BasicButtonListener所使用的BasicButtonUI,确保 所有
按钮(选中,单选,切换)Space在聚焦时都已绑定。即使个别的外观可以独特地渲染各种按钮模型状态,这也可以跨平台使用。按下Space唤起被 按下
UIAction,释放Space唤起被 释放
UIAction。当在按钮范围内按下并释放鼠标时,也会发生同样的情况。在按住按钮的同时拖动按钮以查看布防状态的变化。

无论哪种情况, 按下释放 的组合都 调用按钮的actionPerformed()方法。

一个方便的方法来绑定EnterAction,不论焦点的,是通过根窗格的setDefaultButton()方法。本示例说明了单击按钮的所有三种方式。



 类似资料:
  • 问题内容: 我正在为我的数据库开发GUI设计。 在设计了大多数框架并对其进行调试之后,我释放了我需要使用 ENTER 键(而不是仅单击它)将选项添加到“触发”按钮。 我应该怎么做?我当前正在为按钮使用 MouseListener ,并希望添加一个在按下ENTER键时执行相同操作的Listener。谢谢 问题答案: 使用Enter键调用按钮的动作是LAF问题。Windows支持该功能,但是在默认的M

  • 我正在为我的数据库开发GUI设计。 在设计了大部分框架并调试它们之后,我发布了我需要使用ENTER键添加触发按钮的选项,而不是只点击它。 我应该怎么做?我目前正在使用MouseListener作为我的按钮,并希望添加一个在按ENTER键时执行相同操作的监听器。谢谢

  • 使用python 3,可以选择使用类型符号。 我的问题是,如果一个函数返回None,应该加上这个,还是留空。 即 哪个PEP解决了这个问题?

  • 问题内容: 在我的三个按钮上,鼠标=中键单击和=右键单击。 两键鼠标就是这种情况吗? 谢谢 问题答案: 为了避免任何歧义,请使用SwingUtilities中的实用程序方法:

  • 我在一个页面上有几个html控件和一个搜索按钮。当用户在输入控件之外时(即焦点不在输入控件内),如果用户按enter键,我想触发搜索按钮的单击事件。搜索按钮不是按钮,也不在内 目前我正在做这个

  • 在Mac 10.9上,我的watir-webdriver脚本适用于Chrome和Firefox,但在Safari上,我不能右键单击或双击。尝试双击或右键单击会出现以下错误: 按钮可用?true/users/engineering/.rvm/gems/ruby-1.9.3-P484/gems/selenium-webdriver-2.40.0/lib/selenium/webdriver/safar