我对JMenuBar有一些问题,我似乎无法弄清楚。Java JDialog在mac上搞砸了JMenuBar
我将从这个问题的提出开始:该程序由一个JFrame,一个JDialog和一个JMenuBar组成。最初,您将看到顶部带有JMenuBar的JFrame。但是在某些时候,JDialog会弹出用户可以填写某些文本字段的位置。我遇到的问题是,只要焦点转移到JDialog,JMenuBar就会消失。我想要的是JMenuBar始终保持在屏幕的顶部,除非整个程序没有焦点。这里有两个屏幕截图,第一个屏幕截图中,选择了JFrame,在另一个屏幕截图中选择了JDialog。
所以我真正想要的是不是仅仅看到的JMenuBar当焦点在JFrame的,我希望看到的JMenuBar所有的时间。由于一个JDialogs不能像顶一个JFrame一样拥有JMenuBar,所以我决定不使用多个JMenuBars,而只是一个应该始终可见的JMenuBar。
最后,我将给出尽可能(现在仍然工作),也可以作为小代码的一部分包含问题:
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;
/**
* @author Guus Leijsten
* @created Oct 27, 2012
*/
public class MenuBarProblem extends JFrame {
public MenuBarProblem() {
super("Frame");
this.setMinimumSize(new Dimension(270, 200));
this.setPreferredSize(new Dimension(800, 530));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JRootPane root = this.getRootPane();
//Menu
JMenu fileMenu = new JMenu("File");
JMenuItem file_exit = new JMenuItem("Exit");
file_exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
file_exit.setToolTipText("Exit application");
file_exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
fileMenu.add(file_exit);
JMenuBar menu = new JMenuBar();
menu.add(fileMenu);
root.setJMenuBar(menu);
this.setVisible(true);
JDialog d = new JDialog(this, "Dialog");
d.setSize(200, 100);
d.setLocation(0, (int)root.getContentPane().getLocationOnScreen().getY());
d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
d.setVisible(true);
}
public static void main(String[] args) {
String os = System.getProperty("os.name").toLowerCase();
if(os.indexOf("mac") >= 0) {
System.setProperty("apple.laf.useScreenMenuBar", "true");
}
new MenuBarProblem();
}
}
如果我可以honoust,我觉得现在的问题在于在JRootPane的一部分。但我们会看到;)
有没有其他人遇到过这个问题,并设法解决它alrady,或有没有人想给它一个镜头?
在此先感谢!
新增内容:
在下面的例子中,我将展示一个版本,提供了一些功能的发挥。
这是我正在制作的程序: 第二张图片显示的是右键菜单未连接的状态。 显然,JMenuBar应该仍然可见并且可操作,因为如果没有它,程序的许多功能将被禁用。
在这一点上,我开始认为当对话框(未锁定菜单)被解除锁定并且专注于JMenuBar时,JMenuBar不可能保持可见。我知道JDialog上的JMenuBar不能处于mac osx样式(屏幕顶部),那么是否还有其他技术可以用于取消对象,这确实给了我一个mac osx样式的JMenuBar?
不是osx用户,通过正确使用JMenuBar发生了什么,把它放到JFrame – mKorbel
你是什么意思mKorbel?我将需要比这更多一点。像什么是使用JMenuBar的正确方法?并把什么JFrame? @mKorbel – Triplle
[例如](http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#create),RootPane(我的观点,纠正我,如果我错了)是本地操作系统和Java图形工具包(AWT) – mKorbel