如果jmenu不打开(但只有少数),则Jmenuitem上的加速器无效

发布于 2025-01-23 09:12:13 字数 1077 浏览 1 评论 0原文

我的问题是关于Jmenuitem上的加速器,如果没有打开Jmenu,而仅针对其中一些,则加速器无效。对于一个它正在工作(CTRL + G),但对于另一个是不起作用的(Ctrl + H)。我不知道为什么它不起作用。 (如果Jmenu开放,我提醒它,这在起作用)

也许是关于该组合已经设置的另一个快捷方式?

remplacer.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.CTRL_DOWN_MASK));
    remplacer.setText("Remplacer");
    remplacer.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            remplacerActionPerformed(evt);
        }
    });
    edition_menu.add(remplacer);

    atteindre.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G, java.awt.event.InputEvent.CTRL_DOWN_MASK));
    atteindre.setText("Atteindre");
    atteindre.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            atteindreActionPerformed(evt);
        }
    });
    edition_menu.add(atteindre);

这是Jmenu中包含的两个Jmenuitem,无论如何都在起作用,但是仅当我以前打开Jmenu时,另一个才能正常工作。感谢您的帮助。

My problem is about accelerators on JMenuItem, the accelerator doesn't work if the JMenu is not opened, but only for some of them. For one it is working (CTRL + G), but for another one it is not working (CTRL + H). I have no idea why it doesn't work.
(it's working if the JMenu is open I remind it)

Maybe it's about another shortcut already set up on that combination ?

remplacer.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.CTRL_DOWN_MASK));
    remplacer.setText("Remplacer");
    remplacer.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            remplacerActionPerformed(evt);
        }
    });
    edition_menu.add(remplacer);

    atteindre.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G, java.awt.event.InputEvent.CTRL_DOWN_MASK));
    atteindre.setText("Atteindre");
    atteindre.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            atteindreActionPerformed(evt);
        }
    });
    edition_menu.add(atteindre);

Here are two JMenuItem contained in a JMenu, one is working anyway, but the other is working only if I open the JMenu before. Thank's for your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

淡淡的优雅 2025-01-30 09:12:13

似乎对我有用,请考虑提供最小可重复的示例

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JMenuItem replaceMI = new JMenuItem("Replace");
                replaceMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_DOWN_MASK));
                replaceMI.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Do replace");
                    }
                });
                JMenuItem findMI = new JMenuItem("Find");
                findMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, KeyEvent.CTRL_DOWN_MASK));
                findMI.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Do find");
                    }
                });

                JMenu editMenu = new JMenu("Edit");
                editMenu.add(replaceMI);
                editMenu.add(findMI);

                JMenuBar menuBar = new JMenuBar();
                menuBar.add(editMenu);

                JFrame frame = new JFrame();
                frame.setJMenuBar(menuBar);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
}

Seems to work fine for me, consider providing a minimal reproducible example which demonstrates your issue

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JMenuItem replaceMI = new JMenuItem("Replace");
                replaceMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_DOWN_MASK));
                replaceMI.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Do replace");
                    }
                });
                JMenuItem findMI = new JMenuItem("Find");
                findMI.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, KeyEvent.CTRL_DOWN_MASK));
                findMI.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Do find");
                    }
                });

                JMenu editMenu = new JMenu("Edit");
                editMenu.add(replaceMI);
                editMenu.add(findMI);

                JMenuBar menuBar = new JMenuBar();
                menuBar.add(editMenu);

                JFrame frame = new JFrame();
                frame.setJMenuBar(menuBar);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文