2012-07-27 4 views
0

У меня есть приложение, имеющее основной графический интерфейс с меню, и еще один полноэкранный фрейм, который делает некоторые части основного графического интерфейса отображаемыми в полноэкранном эксклюзивном режиме. Когда я нахожусь в полноэкранном режиме, я хотел бы связать выпадающее меню из строки меню как jpopupmenu.Java/Swing/Mac OSX: преобразование JMenu в JPopupMenu с использованием ScreenMenuBar

Swing предоставляет функцию getPopupMenu() в JMenu. На первый взгляд эта функция работает нормально. Я могу навести курсор на элементы меню и перейти к подменю и просмотреть его. Наведение курсора на подменю подчеркивает подменю, зависающее над простым элементом меню (или радиобъектом или флажком) не подчеркивает элемент. Однако я не могу нажимать на элемент меню. Однако ярлыки клавиш действительно работают нормально. Проблема, по существу, такой же, как представлено на этом форуме (где эта проблема не решена, хотя):

http://www.java-forums.org/new-java/16463-jmenu-jpopupmenu.html

Если добавить JMenuItem после того, как строка меню инициализирован и используется/показано в главном GUI (таким образом, при переключении на полноэкранный кадр) элемент меню фактически доступен для клика. Этот элемент меню, в свою очередь, также можно щелкнуть в строке меню основного графического интерфейса. Выполнение getPopupMenu() непосредственно после инициализации jMenu ничего не меняет. Не использовать полноэкранный эксклюзивный режим также не изменяет ничего о проблеме.

Редактировать

Кажется, я оставил некоторые важные сведения: я тестирование приложения на Mac OSX и использование: System.setProperty("apple.laf.useScreenMenuBar", "true");

Для того, чтобы в строке меню использовать нативный меню. Если я отключу это, всплывающее меню работает так, как ожидалось. Это похоже на ошибку в API java mac? Это их способ преодолеть, это?

Прошу прощения за то, что я забыл об этом, я не знал, что это повлияет на что-либо (хотя это кажется очевидным).

ответ

2

Хорошо, я, вероятно, что-то отсутствует, но я взломал это вместе очень быстро и не имеют никаких проблем

public class PopupFrame extends javax.swing.JFrame { 

    /** 
    * Creates new form PopupFrame 
    */ 
    public PopupFrame() { 
     initComponents(); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     jMenuBar1 = new javax.swing.JMenuBar(); 
     mnuFile = new javax.swing.JMenu(); 
     jMenuItem1 = new javax.swing.JMenuItem(); 
     jMenuItem2 = new javax.swing.JMenuItem(); 
     jMenuItem3 = new javax.swing.JMenuItem(); 
     jMenuItem4 = new javax.swing.JMenuItem(); 
     jMenuItem5 = new javax.swing.JMenuItem(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mousePressed(java.awt.event.MouseEvent evt) { 
       doMouseClicked(evt); 
      } 
      public void mouseReleased(java.awt.event.MouseEvent evt) { 
       doMouseClicked(evt); 
      } 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
       doMouseClicked(evt); 
      } 
     }); 

     mnuFile.setText("File"); 

     jMenuItem1.setText("New"); 
     jMenuItem1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       doActionPerformed(evt); 
      } 
     }); 
     mnuFile.add(jMenuItem1); 

     jMenuItem2.setText("Open"); 
     jMenuItem2.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       doActionPerformed(evt); 
      } 
     }); 
     mnuFile.add(jMenuItem2); 

     jMenuItem3.setText("Save"); 
     jMenuItem3.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       doActionPerformed(evt); 
      } 
     }); 
     mnuFile.add(jMenuItem3); 

     jMenuItem4.setText("Close"); 
     jMenuItem4.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       doActionPerformed(evt); 
      } 
     }); 
     mnuFile.add(jMenuItem4); 

     jMenuItem5.setText("Exit"); 
     jMenuItem5.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       doActionPerformed(evt); 
      } 
     }); 
     mnuFile.add(jMenuItem5); 

     jMenuBar1.add(mnuFile); 

     setJMenuBar(jMenuBar1); 

     org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 
      .add(0, 400, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 
      .add(0, 278, Short.MAX_VALUE) 
     ); 

     pack(); 
    }// </editor-fold> 

    private void doActionPerformed(java.awt.event.ActionEvent evt) { 

     JMenuItem mi = (JMenuItem) evt.getSource(); 

     JOptionPane.showMessageDialog(this, "Clicked " + mi.getText()); 

    } 

    private void doMouseClicked(java.awt.event.MouseEvent evt) { 

     if (evt.isPopupTrigger()) { 

      JPopupMenu popupMenu = mnuFile.getPopupMenu(); 
      popupMenu.show(this, evt.getX(), evt.getY()); 

     } 

    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* 
     * Set the Nimbus look and feel 
     */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* 
     * If Nimbus (introduced in Java SE 6) is not available, stay with the 
     * default look and feel. For details see 
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(PopupFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(PopupFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(PopupFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(PopupFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* 
     * Create and display the form 
     */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new PopupFrame().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JMenuBar jMenuBar1; 
    private javax.swing.JMenuItem jMenuItem1; 
    private javax.swing.JMenuItem jMenuItem2; 
    private javax.swing.JMenuItem jMenuItem3; 
    private javax.swing.JMenuItem jMenuItem4; 
    private javax.swing.JMenuItem jMenuItem5; 
    private javax.swing.JMenu mnuFile; 
    // End of variables declaration 
} 

I извинений, я должен был поставить его вместе в то время как мой 3 месяца было вздремнуть, так это быстро и некрасиво: P

UPDATE

После некоторых играли вокруг, казалось бы, что, когда мы вызываем всплывающее окно, себя, я изменял родительскую ссылку всплывающего окна (в invoker), что означало, что когда JMenu попытался показать всплывающее окно, контекст был неправильным.

Я обновил метод doActionPerformed выглядеть следующим образом:

JOptionPane.showMessageDialog(this, "Clicked " + mi.getText()); 
JPopupMenu popupMenu = mnuFile.getPopupMenu(); 
popupMenu.setInvoker(mnuFile); 

В основном, упираясь ссылку клиента всплывающего окна в.

+0

Кажется, что это работает. Возможно, проблема в том, что рамка, используемая для отображения popupmenu, не совпадает с фреймом, в котором находится панель меню. Изменить: - После того, как я нажал правую кнопку мыши (и, таким образом, появится всплывающее меню), меню файла больше не появится, что выглядит странно. – user23127

+0

+1 Хороший пример; аналогичный результат см. здесь [здесь] (http://stackoverflow.com/a/5129757/230513). – trashgod

+0

Как правило, мой предпочтительный подход к этой проблеме состоял бы в том, чтобы иметь отдельное всплывающее меню.Я бы создал все пункты меню, используя классы «Action», что позволило мне централизовать общий код, позволяя при этом большую гибкость в дизайне. Например, вы можете создавать свои всплывающие окна из контекстной точки зрения. – MadProgrammer

 Смежные вопросы

  • Нет связанных вопросов^_^