2015-08-19 2 views
2

Я отключение JMenuBar перед отображением FileDialog (как пункты меню все еще активны, когда FileDialog видна) с помощью getJMenuBar().setEnabled(false) и последующего вызова getJMenuBar().setEnabled(true) после того, как FileDialog закрытий, но пункты меню сделать не становятся активными после включения - они будут, если я перейду на другое приложение и вернусь к моему. Я пробовал звонить getJMenuBar().revalidate() и/или getJMenuBar().repaint() безрезультатно.JMenuBar не позволяет отключенный

Следует отметить, что я использую меню панели экрана, как я на OS X. Пример кода, который показывает проблему:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class MenuTest extends JFrame implements ActionListener { 

    private JMenuItem menuItemNew = new JMenuItem("New"); 
    private JMenuItem menuItemOpen = new JMenuItem("Open"); 
    private JMenuItem menuItemSave = new JMenuItem("Save"); 
    private JMenu menuFile = new JMenu("File"); 
    private JMenuBar menuBar = new JMenuBar(); 

    public MenuTest() { 
     super("JMenu Test"); 
     setSize(300, 300); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     menuItemOpen.addActionListener(this); 

     menuFile.add(menuItemNew); 
     menuFile.add(menuItemOpen); 
     menuFile.add(menuItemSave); 
     menuBar.add(menuFile); 
     setJMenuBar(menuBar); 

     setVisible(true); 
    } 

    public void openFile() { 
     getJMenuBar().setEnabled(false); 
     FileDialog fd = new FileDialog(this, "Choose a file", FileDialog.LOAD); 
     fd.setVisible(true); 
     getJMenuBar().setEnabled(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == menuItemOpen) { 
      openFile(); 
     } 
    } 

    public static void main(String[] arguements) { 
     System.setProperty("apple.laf.useScreenMenuBar", "true"); 
     new MenuTest(); 
    } 

} 

Заранее спасибо за комментарии/предложения!

+0

Почему? Разве «FileDialog» не является модальным диалогом? – MadProgrammer

+0

Это .. он отключает окна позади него, но не панель меню. Он также отключит панель меню, если я не установил системное свойство, чтобы оно было как панель меню экрана для OS X. – Nikki

+0

А как вы можете указать, что вы на OSX в своем вопросе;) – MadProgrammer

ответ

0

Для меня я могу решить проблему, включив/отключив каждый JMenuItem, а не панель меню или меню.

Я также сделал все на EDT, на всякий случай это была проблема, но это не помогло.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class MenuTest implements ActionListener { 

    private JMenuItem menuItemNew = new JMenuItem("New"); 
    private JMenuItem menuItemOpen = new JMenuItem("Open"); 
    private JMenuItem menuItemSave = new JMenuItem("Save"); 
    private JMenu menuFile = new JMenu("File"); 
    private JMenuBar menuBar = new JMenuBar(); 
    JFrame frame; 
    public MenuTest() { 

    } 

    public void buildGui(){ 
     frame = new JFrame("JMenu Test"); 
     frame.setSize(300, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     menuItemOpen.addActionListener(this); 

     menuFile.add(menuItemNew); 
     menuFile.add(menuItemOpen); 
     menuFile.add(menuItemSave); 

     menuBar.add(menuFile); 
     frame.setJMenuBar(menuBar); 

     frame.setVisible(true); 
    } 

    public void openFile() { 
     menuItemNew.setEnabled(false); 
     menuItemOpen.setEnabled(false); 
     menuItemSave.setEnabled(false); 

     FileDialog fd = new FileDialog(frame, "Choose a file", FileDialog.LOAD); 
     fd.setVisible(true); 

     menuItemNew.setEnabled(true); 
     menuItemOpen.setEnabled(true); 
     menuItemSave.setEnabled(true); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

      openFile(); 
     } 

    public static void main(String[] arguements) { 
     System.setProperty("apple.laf.useScreenMenuBar", "true"); 
     EventQueue.invokeLater(()->{ 
      new MenuTest().buildGui(); 
       }); 
    } 

}