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。
我正在创建一个 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。