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

时间:2015-11-20 18:43:05

标签: java swing hotkeys enter

首先,我知道如何使用以下代码添加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);不起作用。我收到了一个错误:

  

线程中的异常" main"显示java.lang.NullPointerException

这是我的框架类

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

3 个答案:

答案 0 :(得分:4)

您无法在LeftPanel类的构造函数中设置默认按钮,因为该面板尚未添加到JFrame中,因此它不知道根窗格是什么。

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

  1. 制作你的" execButton"实例变量,而不是局部变量。
  2. 创建一个类似getDefaultButton()的方法,它只返回实例变量。
  3. 现在,在您创建框架的代码中,您可以设置默认按钮:

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

    此外,摆脱代码中的所有null布局。 Swing旨在与布局管理器一起使用。

答案 1 :(得分:3)

在MyFrame类中添加@ManyToOne(fetch = FetchType.LAZY) @MapsId("attributeId") private AttributeNameVo attributeNameVo; ,如下所示

getRootPane().setDefaultButton(exebutton);

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

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);
    }
}

答案 2 :(得分:0)

另一种方式,它不需要以任何方式改变主体。将其添加到您的"class:=username","type:=username"子类:

JPanel

这是有效的,因为当布局面板时(例如通过调用@Override public void addNotify() { super.addNotify(); getRootPane().setDefaultButton(exebutton); } ),方法setVisible()一直在组件树下调用。

(来源:https://stackoverflow.com/a/6287283/1052284