[英]Can't re-enable OSX menubar
我有一個程序,通過不同的窗口使用多個JMenuBar
(通過JFrame.setJMenuBar()
)。 我們發現,在OSX中,在某些情況下,這些菜單欄之一可能會被禁用,並且事后似乎無法重新啟用它。 這是我的簡單示例:
public class Demo {
public static void main(String[] args) {
System.setProperty("apple.laf.useScreenMenuBar", "true");
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {
System.out.println("Error setting LAF: " + e);
}
new MyFrame("Alpha frame");
new MyFrame("Beta frame");
}
public static class MyFrame extends JFrame {
public MyFrame(String title) {
super(title);
final JMenuBar menuBar = new JMenuBar();
JButton button = new JButton("Toggle menu") {
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
};
add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
menuBar.setEnabled(!menuBar.isEnabled());
}
});
JMenu fileMenu = new JMenu("File");
fileMenu.add(new JMenuItem("Dummy action"));
menuBar.add(fileMenu);
setJMenuBar(menuBar);
pack();
setVisible(true);
}
}
}
如果使用框架的按鈕禁用其中一個菜單欄,然后將焦點切換到另一框架,再切換回並再次單擊該按鈕,則菜單欄不會在視覺上重新啟用-菜單項保持為灰色且無法使用,但是isEnabled()
方法將返回true。
這是一個問題,因為某些模式對話框似乎會自動禁用當前菜單欄。 我已經看到它發生在JFileChooser
,並且我也看到了它發生在FileDialog
。 事件分配線程中也可能存在一些異常問題。 我還沒有做詳細的分析。 理想情況下,我只是確定只要給定窗口獲得焦點,它的菜單欄就會自動重新啟用-但是如果您將焦點切換到另一個窗口,則JMenuBar
的setEnabled()
方法實際上不會執行任何操作,因為演示演示。
我該如何解決?
(令我非常惱火的是Java 6,我們將在物理上盡快更新為Java 8)
感謝您的時間。
對我來說,我必須禁用JMenuItem
而不是JMenuBar
。 禁用菜單欄的代碼:
for(int i = 0; i<menuBar.getMenuCount(); i++){
JMenu menu = menuBar.getMenu(i);
if(menu==null) continue;
for(int j = 0; j<menu.getItemCount(); j++){
JMenuItem item = menu.getItem(j);
if(item==null) continue;
item.setEnabled(false);
}
}
啟用菜單欄的代碼。
for(int i = 0; i<menuBar.getMenuCount(); i++){
JMenu menu = menuBar.getMenu(i);
if(menu==null) continue;
for(int j = 0; j<menu.getItemCount(); j++){
JMenuItem item = menu.getItem(j);
if(item==null) continue;
item.setEnabled(true);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.