Java 应用程序 - Space vs Enter 用于激活 Mac 上的按钮

Java application - Space vs Enter for activating buttons on Mac

我正在创建一个 java swing 应用程序。 window 有几个按钮,我希望用户使用 tab 键在按钮之间切换,然后按 enter 激活所选按钮。

我在下面创建了一个示例 window。它有两个按钮和一个标签,激活任一按钮都会更改标签的文本。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.UIManager;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ButtonTest
{
    private JFrame frame;

    // Create the application.
    public ButtonTest() { initialize(); }

    // Initialize the contents of the frame.
    private void initialize()
    {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        
        JLabel lblText = new JLabel("Text");
        lblText.setBounds(167, 59, 46, 14);
        frame.getContentPane().add(lblText);
        
        JButton btnRed = new JButton("Red");
        btnRed.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                lblText.setText("Red");
            }
        });
        btnRed.setBounds(74, 174, 89, 23);
        frame.getContentPane().add(btnRed);
        
        JButton btnBlue = new JButton("Blue");
        btnBlue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                lblText.setText("Blue");
            }
        });
        btnBlue.setBounds(220, 174, 89, 23);
        frame.getContentPane().add(btnBlue);
    }
    
    // Launch the application.
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    ButtonTest window = new ButtonTest();
                    window.frame.setVisible(true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }
}

当我 运行 这段代码时,我可以按 Tab 键在按钮之间切换,并在其中一个按钮获得焦点时按 space 激活它。我宁愿按 enter 而不是 space 来激活聚焦按钮。我在该站点上看到其他答案使用以下代码行来解决此问题:

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);

这适用于 Windows,但似乎不适用于 Mac。在 Macs 上,按 space 仍然有效,按 enter 仍然无效。是否有适用于两个平台的解决方案? (注意:运行 这个应用程序在 Mac 上,我首先将它导出到一个 运行 可用的 jar 文件。)

您可以使用 Key Bindings 将现有的 Action 绑定到一个不同的 KeyStroke 以用于单个按钮:

InputMap im = button.getInputMap();
im.put( KeyStroke.getKeyStroke( "ENTER" ), "pressed" );
im.put( KeyStroke.getKeyStroke( "released ENTER" ), "released" );

或应用程序中的所有按钮。

InputMap im = (InputMap)UIManager.get("Button.focusInputMap");
im.put( KeyStroke.getKeyStroke( "ENTER" ), "pressed" );
im.put( KeyStroke.getKeyStroke( "released ENTER" ), "released" );

有关详细信息,请参阅:Enter Key and Button