【问题标题】:How to connect JButton to keyboard "ENTER" key?如何将 JButton 连接到键盘“ENTER”键?
【发布时间】:2020-07-22 00:33:24
【问题描述】:

我不知道如何将 JButton "b" 连接到键盘键 "ENTER"?

Java

b=new JButton(icon);
b.setBounds(285, 50, 40, 30);

b.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        String ip;
        String url=tf.getText();

        try {
            ip=java.net.InetAddress.getByName(url).getHostAddress();
            l2.setText("IP address:"+ip);
        } catch (UnknownHostException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }  

    }
});
add(b);

【问题讨论】:

标签: java swing user-interface


【解决方案1】:

您可以简单地重新绑定关键操作。默认情况下,ButtonUI 使用“SPACE”键来调用操作。这是一个例子:

import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * <code>ButtonKeyTest</code>.
 */
public class ButtonKeyTest {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ButtonKeyTest()::startUp);
    }

    private void startUp() {
        JButton b = new JButton("Use Enter Luke!");
        b.addActionListener(e -> JOptionPane.showMessageDialog(b, "Yeah!"));
        // rebind "space" action to "enter" for key pressed event
        Object actId = b.getInputMap().get(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0));
        b.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), actId);
        // rebind "space" action to "enter" for key released event
        actId = b.getInputMap().get(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true));
        b.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), actId);
        // end rebind

        // alternative
        // b.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "pressed");
        // b.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "released");

        JPanel p = new JPanel();
        p.add(b);
        JFrame frm = new JFrame("Button");
        frm.add(p);
        frm.setSize(200, 100);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }
}

有关键绑定的更多信息,您可以阅读here

【讨论】:

    【解决方案2】:

    您需要添加一个 KeyListener 而不是 ActionListener 并检查 KeyEvent e 和 int keyCode = e.getKeyCode()。这是一个恰当的例子:

    private JButton button;
    
    public Foo() {
        button = new JButton("click");
        // frame settings - width/height etc.
        this.add(button);
    
        button.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                // your logic here
            }
    
            @Override
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
                if (keyCode == KeyEvent.VK_ENTER) {
                    System.out.println("ENTER PRESSED");
                }
            }
    
            @Override
            public void keyReleased(KeyEvent e) {
                // your logic here
            }
        });
    
    }
    

    PS:在按钮上添加按键监听器并不是一个非常好的方法(顾名思义,按键监听器应该添加到输入类型 - textarea、textfield 等)。

    【讨论】:

    • (1-) Swing 设计用于“键绑定”(不是 KeyListener)。此外,此处的代码不会调用添加到按钮的默认 ActionListener。也就是说,OP 应该能够单击按钮或使用 Enter 键来调用相同的操作。
    • 他没有说他希望能够使用点击和回车按钮来做同样的动作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多