Allowing the “Enter” key to press the submit button, as opposed to only using MouseClick

前端 未结 7 1200
清歌不尽
清歌不尽 2020-11-27 04:23

I\'m learning Swing class now and everything about it. I\'ve got this toy program I\'ve been putting together that prompts for a name and then presents a JOptionPane with th

7条回答
  •  醉酒成梦
    2020-11-27 05:03

    You can use the top level containers root pane to set a default button, which will allow it to respond to the enter.

    SwingUtilities.getRootPane(submitButton).setDefaultButton(submitButton);
    

    This, of course, assumes you've added the button to a valid container ;)

    UPDATED

    This is a basic example using the JRootPane#setDefaultButton and key bindings API

    public class DefaultButton {
    
        public static void main(String[] args) {
            new DefaultButton();
        }
    
        public DefaultButton() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
    
            });
        }
    
        public class TestPane extends JPanel {
    
            private JButton button;
            private JLabel label;
            private int count;
    
            public TestPane() {
    
                label = new JLabel("Press the button");
                button = new JButton("Press me");
    
                setLayout(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridy = 0;
                add(label, gbc);
                gbc.gridy++;
                add(button, gbc);
                gbc.gridy++;
                add(new JButton("No Action Here"), gbc);
    
                button.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        doButtonPressed(e);
                    }
    
                });
    
                InputMap im = button.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
                ActionMap am = button.getActionMap();
    
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "spaced");
                am.put("spaced", new AbstractAction() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        doButtonPressed(e);
                    }
    
                });
    
            }
    
            @Override
            public void addNotify() {
                super.addNotify();
                SwingUtilities.getRootPane(button).setDefaultButton(button);
            }
    
            protected void doButtonPressed(ActionEvent evt) {
                count++;
                label.setText("Pressed " + count + " times");
            }
    
        }
    
    }
    

    This of course, assumes that the component with focus does not consume the key event in question (like the second button consuming the space or enter keys

提交回复
热议问题