2013-03-09 3 views
0

Я пытаюсь создать всплывающее окно, когда пользователь нажимает на меню About. Можно ли это сделать на Java? Я видел, что нажатие на меню не вызывает actionPerformed. После недолгих поисков я обнаружил, что я должен попытаться использовать это:override actionPerformed on JMenu

new AbstractAction("Do XY")

но NetBeans мне говорит, что идентификатор, как ожидается. Есть ли другой способ сделать это, или Java не разрешает кнопки непосредственно на панели меню?

ответ

3

Конечно, вы можете сделать это на Java. Вы могли бы просто добавить MenuListener в свое меню.

Вот пример такой вещи (она также реализует традиционную «О» пункте меню):

import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 
import javax.swing.event.MenuEvent; 
import javax.swing.event.MenuListener; 

public class TestAboutMenu { 

    protected void initUI() { 
     final JFrame frame = new JFrame("test"); 
     JMenuBar bar = new JMenuBar(); 
     JMenu help = new JMenu("Help"); 
     help.addMenuListener(new MenuListener() { 

      @Override 
      public void menuSelected(MenuEvent e) { 
       showAboutDialog(frame); 
      } 

      @Override 
      public void menuDeselected(MenuEvent e) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void menuCanceled(MenuEvent e) { 
       // TODO Auto-generated method stub 

      } 
     }); 
     JMenuItem about = new JMenuItem(new AbstractAction("About") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       showAboutDialog(frame); 
      } 
     }); 
     help.add(about); 
     bar.add(help); 
     frame.setJMenuBar(bar); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 

    protected void showAboutDialog(final JFrame frame) { 
     JDialog dialog = new JDialog(frame); 
     dialog.add(new JLabel("About this program")); 
     dialog.setModal(true); 
     dialog.pack(); 
     dialog.setLocationRelativeTo(frame); 
     dialog.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestAboutMenu().initUI(); 
      } 
     }); 
    } 
} 
+0

+1, забыл о MenuListener. – camickr

0

Для этого вам будет необходимо написать собственный класс меню. Но вы можете сделать такой трюк: написать прослушиватель мыши с помощью метода mouseClicked(). Если вы поместите панель меню сверху, вы знаете, что это границы: 0, windowWidth(), ~ 20 (высота строки меню), windowWidth(). И тогда вы проверяете, находится ли положение мыши в этом прямоугольнике. Если да - вы показываете всплывающее окно. Это просто идея, так что дайте мне знать, если это сработает для вас.

+0

не существует никакого способа, чтобы переопределить функции меню для только этого объекта? –

+0

К сожалению, я не знаю. Вы можете экспериментировать самостоятельно, но я думаю, что решение с обнаружением позиции щелчка мыши является самым простым способом достижения вашей цели. –

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