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
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);
}
}
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.
Nie jestem pewien, czy rozumiem zostanie poprawnie, ale jeśli chcesz wiedzieć, jak zrobić paski narzędzi w czeku Swing to
Patrz sekcja wychowywanie Menu podręczne, w How to Use Menus.
tylko, że jest to bardziej specyficzne Link: http://docs.oracle.com/javase/tutorial/uiswing/components/menu .html # popup – pratikabu
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().
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ą –
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. –
To jest o wiele lepsza odpowiedź i powinna uzyskać więcej głosów. Wygląda lepiej niż lokalizacja myszy. – rsman
Oto prosty i przyjemny klasa
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) {}
});
}
}
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ć? –
Zrobiłem też coś nieco inaczej: popup.show (c, 0, c.getHeight()); –
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