Я хочу создать панель инструментов в своем приложении. Если вы нажмете кнопку на этой панели инструментов, появится всплывающее меню, как на панели инструментов Eclipse. Я не знаю, как это сделать в Swing. Может кто-то помочь мне, пожалуйста? Я пробовал Google, но ничего не нашел.
Как создать JButton с меню?
Ответы (6)
В Swing это намного сложнее, чем должно быть. Поэтому вместо того, чтобы указывать вам на учебники, я создал полностью рабочий пример.
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);
}
}
Я не понимаю, почему это сложнее, чем должно быть, или почему вы должны использовать MouseListener. Решение Стива МакЛеода работает, но то, где появляется меню, зависит от того, где была нажата мышь. Почему бы просто не использовать ActionListener, как обычно для JButton. Это не кажется ни труднее, ни менее трудным.
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);
}
});
Это позиционирует меню примерно так же, как меню в JMenuBar для меня, и положение соответствует. Вы можете разместить его по-другому, изменив x и y в menu.show().
menu.show(button, 0, button.getHeight())
.
- person Nand; 18.08.2020
Я думаю, что это то же самое, что и в AWT.
Вы должны поместить ActionCommand на эту кнопку, и когда она будет выполнена, отобразите всплывающее меню в соответствии с координатами мыши.
См. раздел Вызов всплывающего меню в Как пользоваться меню.
Я не уверен, что правильно вас понял, но если вы хотите узнать, как создавать панели инструментов в Swing, проверьте это
Учебники по Java: использование панелей инструментов и это
Учебники по Java: использование действий
Вот простой и приятный класс
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) {}
});
}
}