【问题标题】:How to add a hotkey Enter in a JPanel class?如何在 JPanel 类中添加热键 Enter?
【发布时间】:2016-02-23 08:43:48
【问题描述】:

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

线程“主”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 无效。

【问题讨论】:

    标签: java swing hotkeys enter


    【解决方案1】:

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

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

    1. 将“execButton”设为实例变量,而不是局部变量。
    2. 创建一个类似getDefaultButton() 的方法,它只会返回实例变量。

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

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

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

    【讨论】:

      【解决方案2】:

      像这样在你的 MyFrame 类中添加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;
          }
      }
      

      【讨论】:

      • 非常感谢。我注意到编译器建议我在外面也声明 JButton
      • 没问题!乐意效劳。 :)
      • @LordRixuel,如果你想访问面板外的按钮,你应该创建一个方法,不要直接访问类的变量。
      • @camickr 我会试试的。非常感谢您的建议
      • 如果您需要该方法的帮助,请随时询问!
      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 1970-01-01
        • 2023-03-23
        • 2010-12-30
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        相关资源
        最近更新 更多