如何在 JPanel class 中添加热键 Enter?

How to add a hotkey Enter in a JPanel class?

首先,我知道如何使用以下代码添加 Enter 热键:

JPanel panel = new JPanel();
//...
JButton button = new JButton("Execute");
panel.getRootPane().setDefaultButton(button); // Hotkey "Enter" by default
// ...
panel.add(button);

但在这种情况下,下面的代码

class LeftPanel extends JPanel
{
    LeftPanel()
    {
        setLayout(null);
        setBounds(2, 42, 146, 252);

        button();
    }

    void button() 
    {       
        JButton exebutton = new JButton("Execute");
        //getRootPane().setDefaultButton(exebutton); // Hotkey "Enter" by default
        exebutton.setMnemonic(KeyEvent.VK_ENTER); // Shortcut: Alt + Enter
        exebutton.setBounds(4, 18, 138, 47);
        add(exebutton);
    }
}

如何添加 Enter 热键? getRootPane().setDefaultButton(exebutton); 不起作用。我收到一个错误:

Exception in thread "main" java.lang.NullPointerException

这是我的相框class

public class MyFrame extends JFrame
{   
    MyFrame()
    {
        setTitle("Frame Test");
        setSize(400, 200);
        setLayout(null);

        LeftPanel leftpanel = new LeftPanel();
        add(leftpanel);

        setVisible(true);
        setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE);
    }
}

和我的主要

public static void main(String[] args) 
{
    new MyFrame();
}

Alt+Enter 快捷方式有效,但 Enter.

无效

像这样在您的 MyFrame class 中添加 getRootPane().setDefaultButton(exebutton);

public class MyFrame extends JFrame
{   
    MyFrame()
    {
        setTitle("Frame Test");
        setSize(400, 200);
        setLayout(null);

        LeftPanel leftpanel = new LeftPanel();
        add(leftpanel);
        getRootPane().setDefaultButton(leftpanel.getDefaultBtn());

        setVisible(true);
        setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE);
    }
}

确保您可以通过在像这样的任何方法之前声明来访问您的 JButton

class LeftPanel extends JPanel
{
    JButton exeButton;

    LeftPanel()
    {
        setLayout(null);
        setBounds(2, 42, 146, 252);

        button();
    }

    void button() 
    {       
        exebutton = new JButton("Execute");
        exebutton.setMnemonic(KeyEvent.VK_ENTER); // Shortcut: Alt + Enter
        exebutton.setBounds(4, 18, 138, 47);
        add(exebutton);
    }

    public JButton getDefaultBtn()
    {
        return exebutton;
    }
}

您不能在 LeftPanel 的构造函数中设置默认按钮 class 因为面板还没有添加到 JFrame,所以它不知道根窗格是什么。

所以在您的 LeftPanel 中,您需要做几件事:

  1. 让你的 "execButton" 成为实例变量,而不是局部变量。
  2. 创建一个类似于 getDefaultButton() 的方法,它将简单地 return 实例变量。

现在,当您创建框架时,您可以在代码中设置默认按钮:

LeftPanel leftpanel = new LeftPanel();
add(leftpanel);
getRootPane().setDefaultButton( leftPanel.getDefaultButton() );

此外,删除代码中的所有空布局。 Swing 旨在与布局管理器一起使用。

还有另一种方式,它不需要以任何方式更改 main。将此添加到您的 JPanel 子类:

@Override
public void addNotify() {
    super.addNotify();
    getRootPane().setDefaultButton(exebutton);
}

这是可行的,因为在布置面板时(例如通过调用 setVisible()),方法 addNotify() 会一直沿组件树向下调用。

(来源:)