Como criar um JButton com um menu?
-
18-09-2019 - |
Pergunta
Eu quero criar uma barra de ferramentas no meu aplicativo. Se você clicar em um botão na barra de ferramentas que, ele irá aparecer um menu, assim como na barra de ferramentas do Eclipse. Eu não sei como fazer isso no Swing. Alguém pode me ajudar, por favor? Eu tentei Google, mas não encontrou nada.
Solução
Esta é a maneira mais difícil no Swing do que precisa ser. Então, ao invés de apontar-lhe a tutoriais Eu criei um exemplo totalmente funcional.
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);
}
}
Outras dicas
Eu não vejo por que isso é mais difícil do que ele precisa ser, ou porque você deve usar um MouseListener. A solução por Steve McLeod funciona, mas onde aparece o menu depende do local onde o mouse foi clicado. Porque não usar um ActionListener como normalmente utilizado para um JButton. Ele não parece nem mais difícil, nem menos difícil.
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);
}
});
Isto posiciona o menu sobre o mesmo como um menu em um JMenuBar para mim, ea posição é consistente. Você poderia colocá-lo de forma diferente, modificando o x e y no menu.show ().
Eu acho que é o mesmo que em AWT.
Você deve colocar um ActionCommand sobre esse botão e quando ele é executado mostrar o menu pop-up de acordo com as coordenadas do mouse.
Veja a seção Trazendo um menu de contexto , em Como usar Menus .
Eu não tenho certeza que eu entendi corretamente, mas se você quiser saber como fazer barras de ferramentas no balanço verificar este
Aqui está uma classe simples e agradável
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) {}
});
}
}