Java 如何专注于jmenu,以便使用键盘进行操作
我正在创建一个桌面应用程序,它有一个包含两个框架的窗口,一个在另一个内部,内部框架包含JMENUBAR,所以我的问题是,当这个窗口打开时,如何关注第一个jmenu,它看起来像: 下面是帮助代码 导入java.awt.event.KeyEvent 导入java.text.simpleDataFormat 导入java.util.Calendar } 请帮我写代码Java 如何专注于jmenu,以便使用键盘进行操作,java,swing,Java,Swing,我正在创建一个桌面应用程序,它有一个包含两个框架的窗口,一个在另一个内部,内部框架包含JMENUBAR,所以我的问题是,当这个窗口打开时,如何关注第一个jmenu,它看起来像: 下面是帮助代码 导入java.awt.event.KeyEvent 导入java.text.simpleDataFormat 导入java.util.Calendar } 请帮我写代码 我想专注于销售发票,这样我就可以通过键盘操作它。也许你想在菜单中添加助记符,在菜单项中添加加速器。像这样的 private void
我想专注于销售发票,这样我就可以通过键盘操作它。也许你想在菜单中添加助记符,在菜单项中添加加速器。像这样的
private void setBindings(){
sales_invoicing.setMnemonic(KeyEvent.VK_S);
jMenuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, InputEvent.CTRL_DOWN_MASK));
jMenuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, InputEvent.CTRL_DOWN_MASK));
jMenuItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3, InputEvent.CTRL_DOWN_MASK));
jMenuItem4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4, InputEvent.CTRL_DOWN_MASK));
}
sales\u invoicing
的助记符为s
,因此要打开该菜单,请按住Alt+s键
对于菜单项,它们具有使用ctrl键加上与菜单项对应的数字的加速器
这里有一个例子
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class SalesMenu extends JFrame {
JMenuBar menubar;
JMenu sales_invoicing;
JMenuItem jMenuItem1;
JMenuItem jMenuItem2;
JMenuItem jMenuItem3;
JMenuItem jMenuItem4;
public SalesMenu() {
menubar = new JMenuBar();
sales_invoicing = new JMenu("Sales Invoice");
jMenuItem1 = new JMenuItem("Item 1");
jMenuItem2 = new JMenuItem("Item 2");
jMenuItem3 = new JMenuItem("Item 3");
jMenuItem4 = new JMenuItem("Item 4");
sales_invoicing.add(jMenuItem1);
sales_invoicing.add(jMenuItem2);
sales_invoicing.add(jMenuItem3);
sales_invoicing.add(jMenuItem4);
setBindings();
menubar.add(sales_invoicing);
setJMenuBar(menubar);
}
private void setBindings(){
sales_invoicing.setMnemonic(KeyEvent.VK_S);
jMenuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, InputEvent.CTRL_DOWN_MASK));
jMenuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, InputEvent.CTRL_DOWN_MASK));
jMenuItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3, InputEvent.CTRL_DOWN_MASK));
jMenuItem4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4, InputEvent.CTRL_DOWN_MASK));
}
public static void createAndShowGui() {
JFrame frame = new SalesMenu();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(300, 300);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
您可以看到菜单助记符下的取消线,也可以看到菜单项的加速器
编辑:运行此示例。它使用内部框架。程序打开后,焦点将集中在内部帧上,因此您可以立即访问密钥绑定。有两个类文件。测试类和内部框架类
internalframenutest.java
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.SwingUtilities;
public class InternalFrameMenuTest extends JFrame {
public InternalFrameMenuTest() {
JDesktopPane desktop = new JDesktopPane();
InternalFrameMenu iframe = new InternalFrameMenu();
desktop.add(iframe);
iframe.setVisible(true);
iframe.setFocusable(true);
try {
iframe.setSelected(true);
} catch (Exception ex) {
}
add(desktop);
}
public static void createAndShowGui() {
JFrame frame = new InternalFrameMenuTest();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(350, 350);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class InternalFrameMenu extends JInternalFrame {
JMenuBar menubar;
JMenu sales_invoicing;
JMenuItem jMenuItem1;
JMenuItem jMenuItem2;
JMenuItem jMenuItem3;
JMenuItem jMenuItem4;
JLabel label = new JLabel(" ");
public InternalFrameMenu() {
super("Internal Frame", true, true, true, true);
menubar = new JMenuBar();
sales_invoicing = new JMenu("Sales Invoice");
jMenuItem1 = new JMenuItem("Item 1");
jMenuItem2 = new JMenuItem("Item 2");
jMenuItem3 = new JMenuItem("Item 3");
jMenuItem4 = new JMenuItem("Item 4");
setBindings();
sales_invoicing.add(jMenuItem1);
sales_invoicing.add(jMenuItem2);
sales_invoicing.add(jMenuItem3);
sales_invoicing.add(jMenuItem4);
menubar.add(sales_invoicing);
setJMenuBar(menubar);
label.setHorizontalAlignment(JLabel.CENTER);
label.setVerticalAlignment(JLabel.CENTER);
add(label);
setSize(250, 250);
setLocation(20, 20);
}
private void setBindings() {
sales_invoicing.setMnemonic(KeyEvent.VK_S);
jMenuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, InputEvent.CTRL_DOWN_MASK));
jMenuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, InputEvent.CTRL_DOWN_MASK));
jMenuItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3, InputEvent.CTRL_DOWN_MASK));
jMenuItem4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4, InputEvent.CTRL_DOWN_MASK));
}
}
InternalFrameMenu.java
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.SwingUtilities;
public class InternalFrameMenuTest extends JFrame {
public InternalFrameMenuTest() {
JDesktopPane desktop = new JDesktopPane();
InternalFrameMenu iframe = new InternalFrameMenu();
desktop.add(iframe);
iframe.setVisible(true);
iframe.setFocusable(true);
try {
iframe.setSelected(true);
} catch (Exception ex) {
}
add(desktop);
}
public static void createAndShowGui() {
JFrame frame = new InternalFrameMenuTest();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(350, 350);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class InternalFrameMenu extends JInternalFrame {
JMenuBar menubar;
JMenu sales_invoicing;
JMenuItem jMenuItem1;
JMenuItem jMenuItem2;
JMenuItem jMenuItem3;
JMenuItem jMenuItem4;
JLabel label = new JLabel(" ");
public InternalFrameMenu() {
super("Internal Frame", true, true, true, true);
menubar = new JMenuBar();
sales_invoicing = new JMenu("Sales Invoice");
jMenuItem1 = new JMenuItem("Item 1");
jMenuItem2 = new JMenuItem("Item 2");
jMenuItem3 = new JMenuItem("Item 3");
jMenuItem4 = new JMenuItem("Item 4");
setBindings();
sales_invoicing.add(jMenuItem1);
sales_invoicing.add(jMenuItem2);
sales_invoicing.add(jMenuItem3);
sales_invoicing.add(jMenuItem4);
menubar.add(sales_invoicing);
setJMenuBar(menubar);
label.setHorizontalAlignment(JLabel.CENTER);
label.setVerticalAlignment(JLabel.CENTER);
add(label);
setSize(250, 250);
setLocation(20, 20);
}
private void setBindings() {
sales_invoicing.setMnemonic(KeyEvent.VK_S);
jMenuItem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, InputEvent.CTRL_DOWN_MASK));
jMenuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, InputEvent.CTRL_DOWN_MASK));
jMenuItem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3, InputEvent.CTRL_DOWN_MASK));
jMenuItem4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4, InputEvent.CTRL_DOWN_MASK));
}
}
嘿,伙计们,我得到了关注内部框架的答案,请参见下面的代码
private void formFocusGained(java.awt.event.FocusEvent evt) {
try {
// TODO add your handling code here:
jInternalFrame1.setSelected(true);
jInternalFrame1.requestFocus(true);
} catch (PropertyVetoException ex) {
Logger.getLogger(Carlsberg.class.getName()).log(Level.SEVERE, null, ex);
}
}
你说的专注于菜单是什么意思?你是说你想在程序打开时打开它?你为什么要这样做?将链接张贴到你的图片上。“我想专注于销售发票,这样我就可以通过键盘操作它”。也许你想在菜单上绑定一个键。您已经这样做了吗?为菜单定义一个加速器。这就是用户所需要的所有“轻松访问”。@alex2410我已经发布了一个链接,请查看!,它可以工作,但正如您看到的,我的jmenu在内部框架内,对于您的代码,我必须首先单击内部框架,所以我认为我们可能必须首先将焦点设置在内部框架上。或者有没有其他方法可以解决这个问题。提前谢谢,请看我的编辑。我将其设置为使用内部帧
iframe.setFocusable(true)
这对我不起作用,看看我的代码我已经编辑了我得到了在内部帧中聚焦的答案,然后我使用你的代码@peeskillet作为快捷方式