Swing:如何从菜单栏/子菜单中提供打开菜单的延迟

时间:2015-10-29 09:03:28

标签: java swing jmenu jmenubar

我的应用程序有一个垂直菜单栏和很多子菜单。我的问题是:通过鼠标在父菜单/菜单栏中的相应标签上输入后,子菜单立即打开。但我需要一秒钟的延迟。

以下是一个例子:

enter image description here

当我从开始到结束点移动鼠标时(见箭头),输入菜单“Second”后,最初打开的菜单将被关闭。

相同的情况适用于子菜单:

enter image description here

在Windows本机应用程序中,第二种情况正常,因此我可以将鼠标移到子元素上而不会丢失当前打开的子菜单。

有人知道,我该如何实施所需的延迟?

以下是代码示例

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

public class MenuTryout {

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        final JFrame frm = new JFrame("Menu test");
        final JMenuBar menuBar = new JMenuBar();
        menuBar.setLayout(new GridLayout(15, 1)); // in my application I use a custom layout here
        JMenu m1 = new VerticalMenu("First");
        m1.add("Subelement 1");
        m1.add("Subelement 2");
        m1.add("Subelement 3");
        final JMenu m11 = new JMenu("Submenu");
        m11.add("Subelement 1.1");
        m11.add("Subelement 1.2");
        m11.add("Subelement 1.3");
        m1.add(m11);
        m1.add("Subelement 4");
        m1.add("Subelement 5");
        menuBar.add(m1);
        m1 = new VerticalMenu("Second");
        m1.add("Subelement 1");
        m1.add("Subelement 2");
        m1.add("Subelement 3");
        menuBar.add(m1);
        m1 = new VerticalMenu("Third");
        m1.add("Subelement 1");
        m1.add("Subelement 2");
        m1.add("Subelement 3");
        menuBar.add(m1);
        frm.add(menuBar, BorderLayout.WEST);
        frm.add(new JScrollPane(new JTextArea(20, 80)));
        frm.pack();
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }

    private static class VerticalMenu extends JMenu {
        public VerticalMenu(String aText) {
            super(aText);
        }
        @Override
        protected Point getPopupMenuOrigin() {
            return new Point(getWidth() + 5, 0);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

package swing;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

public class MenuTryout {

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        final JFrame frm = new JFrame("Menu test");
        final int DELAY_MS = 1000;
        final JMenuBar menuBar = new JMenuBar();
        menuBar.setLayout(new GridLayout(15, 1)); // in my application I use a custom layout here
        JMenu m1 = new VerticalMenu("First");
        m1.add("Subelement 1");
        m1.add("Subelement 2");
        m1.add("Subelement 3");

        final JMenu m11 = new JMenu("Submenu");
        m11.setDelay(DELAY_MS);
        m11.setDelay(DELAY_MS);
        m11.add("Subelement 1.1");
        m11.add("Subelement 1.2");
        m11.add("Subelement 1.3");
        m1.add(m11);
        m1.add("Subelement 4");
        m1.add("Subelement 5");
        menuBar.add(m1);
        m1 = new VerticalMenu("Second");
        m1.add("Subelement 1");
        m1.add("Subelement 2");
        m1.add("Subelement 3");
        menuBar.add(m1);
        m1 = new VerticalMenu("Third");
        m1.add("Subelement 1");
        m1.add("Subelement 2");
        m1.add("Subelement 3");
        menuBar.add(m1);
        frm.add(menuBar, BorderLayout.WEST);
        frm.add(new JScrollPane(new JTextArea(20, 80)));
        frm.pack();
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }

    private static class VerticalMenu extends JMenu {
        public VerticalMenu(String aText) {
            super(aText);
        }
        @Override
        protected Point getPopupMenuOrigin() {
            return new Point(getWidth() + 5, 0);
        }
    }
}

您需要在代码中添加这三行。他们推迟你的子菜单。它取决于delay_ms值

     final int DELAY_MS = 1000;
     m11.setDelay(DELAY_MS);
     m11.setDelay(DELAY_MS);

请参阅以下链接:

http://bugs.java.com/view_bug.do?bug_id=6563939

Java Swing - Add leniency when selecting items in submenus

http://java-demos.blogspot.in/2013/11/jmenu-example-in-swing.html