我的应用程序有一个垂直菜单栏和很多子菜单。我的问题是:通过鼠标在父菜单/菜单栏中的相应标签上输入后,子菜单立即打开。但我需要一秒钟的延迟。
以下是一个例子:
当我从开始到结束点移动鼠标时(见箭头),输入菜单“Second”后,最初打开的菜单将被关闭。
相同的情况适用于子菜单:
在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);
}
}
}
答案 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