Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何专注于jmenu,以便使用键盘进行操作_Java_Swing - Fatal编程技术网

Java 如何专注于jmenu,以便使用键盘进行操作

Java 如何专注于jmenu,以便使用键盘进行操作,java,swing,Java,Swing,我正在创建一个桌面应用程序,它有一个包含两个框架的窗口,一个在另一个内部,内部框架包含JMENUBAR,所以我的问题是,当这个窗口打开时,如何关注第一个jmenu,它看起来像: 下面是帮助代码 导入java.awt.event.KeyEvent 导入java.text.simpleDataFormat 导入java.util.Calendar } 请帮我写代码 我想专注于销售发票,这样我就可以通过键盘操作它。也许你想在菜单中添加助记符,在菜单项中添加加速器。像这样的 private void

我正在创建一个桌面应用程序,它有一个包含两个框架的窗口,一个在另一个内部,内部框架包含JMENUBAR,所以我的问题是,当这个窗口打开时,如何关注第一个jmenu,它看起来像:

下面是帮助代码

导入java.awt.event.KeyEvent

导入java.text.simpleDataFormat

导入java.util.Calendar

}

请帮我写代码
我想专注于销售发票,这样我就可以通过键盘操作它。也许你想在菜单中添加助记符,在菜单项中添加加速器。像这样的

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作为快捷方式