如何在 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 中,您需要做几件事:
- 让你的 "execButton" 成为实例变量,而不是局部变量。
- 创建一个类似于
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()
会一直沿组件树向下调用。
(来源:)
首先,我知道如何使用以下代码添加 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 中,您需要做几件事:
- 让你的 "execButton" 成为实例变量,而不是局部变量。
- 创建一个类似于
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()
会一直沿组件树向下调用。
(来源:)