У меня возникли проблемы с JMenuBar, и я не могу понять, как это понять.Java JDialog испортил JMenuBar на mac
Начну с искажения проблемы: программа состоит из JFrame, JDialog и JMenuBar. Первоначально вы увидите JFrame с JMenuBar в верхней части. Но в какой-то момент появится JDialog, где пользователь может заполнить некоторые текстовые поля. Проблема, с которой я столкнулась, заключается в том, что, как только основное внимание будет обращено на JDialog, JMenuBar исчезает. Я хочу, чтобы JMenuBar постоянно находился в верхней части экрана, за исключением того, что вся программа не находится в фокусе. Вот 2 скриншота, на первом снимке экрана выбран JFrame, а в другом - JDialog.
Так что я на самом деле хочу, вместо того, чтобы только видеть JMenuBar когда фокус находится на JFrame, я хочу, чтобы увидеть JMenuBar все время. Поскольку JDialogs не может иметь JMenuBar в верхней части, как у JFrame, я решил не иметь несколько JMenuBars, а только тот, который должен быть видимым все время.
В конце концов я дам часть кода, который является как можно (и до сих пор работает), а также содержит проблему:
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. Но мы увидим;)
Неужели кто-нибудь еще столкнулся с этой проблемой и сумел решить эту проблему, или есть кто-нибудь, кто хочет дать ему шанс?
Заранее благодарен!
Добавлено содержание:
В следующем примере я покажу версию, которая дает некоторые функциональные возможности для игры.
Это программа, которую я делаю: На втором изображении показано состояние, в котором правое меню отстыковано.
Очевидно, что JMenuBar должен быть видимым и работоспособным, так как без него многие функции программы будут отключены.
На данный момент я начинаю думать, что JMenuBar не может оставаться видимым, когда диалог (отстыкованное меню) отстыкован и сосредоточен.
Я знаю, что JMenuBar на JDialog не может быть в стиле 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 (мое мнение, поправьте меня, если я ошибаюсь) - это мост betweens Native OS и Инструмент Java Graphics Toolkit (AWT) – mKorbel