2009-11-07 16 views
32

Chcę utworzyć pasek narzędzi w mojej aplikacji. Kliknięcie przycisku na pasku narzędzi spowoduje wyświetlenie menu, podobnie jak na pasku narzędzi Eclipse. Nie wiem, jak to zrobić w Swing. Czy ktoś może mi pomóc? Wypróbowałem Google, ale nic nie znalazłem.Jak utworzyć JButton z menu?

Odpowiedz

30

To jest o wiele trudniejsze niż w Swing. Zamiast więc skierować cię do samouczków, stworzyłem w pełni działający przykład.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class ToolbarDemo { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(600, 400)); 
     final JToolBar toolBar = new JToolBar(); 

     //Create the popup menu. 
     final JPopupMenu popup = new JPopupMenu(); 
     popup.add(new JMenuItem(new AbstractAction("Option 1") { 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(frame, "Option 1 selected"); 
      } 
     })); 
     popup.add(new JMenuItem(new AbstractAction("Option 2") { 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(frame, "Option 2 selected"); 
      } 
     })); 

     final JButton button = new JButton("Options"); 
     button.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       popup.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     }); 
     toolBar.add(button); 

     frame.getContentPane().add(toolBar, BorderLayout.NORTH); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Robiłem coś takiego, ale bez JToolBar. Czy Twoje rozwiązanie zachowuje się tak, że po ponownym kliknięciu przycisku z menu w górę pojawia się ponownie menu zamiast go odrzucić? –

+2

Zrobiłem też coś nieco inaczej: popup.show (c, 0, c.getHeight()); –

+0

Dziękuję. Jest to najłatwiejsze do zrozumienia rozwiązanie, które znalazłem, więc użyję go, chociaż nie jest to właściwie dropbox JButton. Inne rozwiązania są zbyt skomplikowane, aby je zrozumieć. Poniżej wymienię niektóre z nich. Dikei

2

Myślę, że jest taki sam jak w AWT.

Powinieneś umieścić polecenie akcji na tym przycisku, a po jego uruchomieniu wyświetlać menu wyskakujące zgodnie ze współrzędnymi myszy.

2

Patrz sekcja wychowywanie Menu podręczne, w How to Use Menus.

+0

tylko, że jest to bardziej specyficzne Link: http://docs.oracle.com/javase/tutorial/uiswing/components/menu .html # popup – pratikabu

14

nie widzę dlaczego to jest trudniejsze niż to musi być i dlaczego należy użyć MouseListener. Rozwiązanie Steve'a McLeoda działa, ale miejsce, w którym pojawia się menu, zależy od tego, gdzie kliknięto myszą. Dlaczego nie po prostu użyć ActionListener, jak zwykle używane do JButton. Wydaje się nie trudniejsze ani mniej trudne.

final JPopupMenu menu = new JPopupMenu(); 
menu.add(...whatever...); 

final JButton button = new JButton(); 
button.setText("My Menu"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent ev) { 
     menu.show(button, button.getBounds().x, button.getBounds().y 
      + button.getBounds().height); 
    } 
}); 

To pozycjonuje dla mnie menu podobne do menu w JMenuBar, a pozycja jest zgodna. Możesz ustawić to inaczej, modyfikując xiy w menu.show().

+0

Problem z podejściem polega na tym, że menu podręczne pojawia się tylko wtedy, gdy użytkownik zwolni przycisk myszy. Menu powinno pojawić się po kliknięciu myszką, a nie pod myszką –

+0

Masz rację. Nie zauważyłem. Wciąż lubię to lepiej niż w drugą stronę, ale żadna z nich nie jest w pełni satysfakcjonująca. W końcu nie wdrożyłem tego, co próbowałem zrobić w ten sposób, więc i tak go nie używałem. Sądzę, że możesz zrobić to, co zrobiłeś i użyć mojej wersji menu.pokaż współrzędne przycisku, aby uniknąć niespójności pozycji. –

+0

To jest o wiele lepsza odpowiedź i powinna uzyskać więcej głosów. Wygląda lepiej niż lokalizacja myszy. – rsman

0

Oto prosty i przyjemny klasa

enter image description here

import javax.swing.JPopupMenu; 
import javax.swing.JToggleButton; 
import javax.swing.event.PopupMenuEvent; 
import javax.swing.event.PopupMenuListener; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class MenuButton extends JToggleButton { 

    JPopupMenu popup; 

    public MenuButton(String name, JPopupMenu menu) { 
     super(name); 
     this.popup = menu; 
     addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ev) { 
       JToggleButton b = MenuButton.this; 
       if (b.isSelected()) { 
        popup.show(b, 0, b.getBounds().height); 
       } else { 
        popup.setVisible(false); 
       } 
      } 
     }); 
     popup.addPopupMenuListener(new PopupMenuListener() { 
      @Override 
      public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} 
      @Override 
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
       MenuButton.this.setSelected(false); 
      } 
      @Override 
      public void popupMenuCanceled(PopupMenuEvent e) {} 
     }); 
    } 
} 
Powiązane problemy