簡體   English   中英

無法重新啟用OSX菜單欄

[英]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 事件分配線程中也可能存在一些異常問題。 我還沒有做詳細的分析。 理想情況下,我只是確定只要給定窗口獲得焦點,它的菜單欄就會自動重新啟用-但是如果您將焦點切換到另一個窗口,則JMenuBarsetEnabled()方法實際上不會執行任何操作,因為演示演示。

我該如何解決?

(令我非常惱火的是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM