我正在尝试为文件浏览器制作一组导航按钮。我希望这样,如果用户单击专用历史记录按钮,就会出现 JPopupMenu。但是,我还希望当用户右键单击或将光标向下拖动到后退或前进按钮时出现完全相同的菜单。 如何让不同手势的多个 GUI 组件显示完全相同的 JPopupMenu(不是副本,而是完全相同的 JPopupMenu)?
到目前为止,我已尝试以下操作:
histButton.addMouseListener(new MouseAdapter()
{
@Override public void mouseClicked(MouseEvent e)
{
showPopup(e);
}
@Override public void mouseDragged(MouseEvent e)
{
showPopup(e);
}
private void showPopup(MouseEvent e)
{
histPopupMenu.show(e.getComponent(), e.getX(), e.getY());
}
});
forwardButton.addMouseListener(new MouseAdapter()
{
@Override public void mouseClicked(MouseEvent e)
{
if (e.isPopupTrigger())
showPopup(e);
}
@Override public void mouseDragged(MouseEvent e)
{
showPopup(e);
}
private void showPopup(MouseEvent e)
{
histPopupMenu.show(e.getComponent(), e.getX(), e.getY());
}
});
backButton.addMouseListener(new MouseAdapter()
{
@Override public void mouseClicked(MouseEvent e)
{
if (e.isPopupTrigger())
showPopup(e);
}
@Override public void mouseDragged(MouseEvent e)
{
showPopup(e);
}
private void showPopup(MouseEvent e)
{
histPopupMenu.show(e.getComponent(), e.getX(), e.getY());
}
});
所有组件均已添加并正确显示,调试显示它们注册了事件,但没有出现菜单。
最佳答案
Bringing Up a Popup Menu显示了使用 mousePressed()
、mouseReleased()
和 isPopupTrigger()
的传统实现。请注意,“打开弹出菜单的确切手势因外观和感觉而异。”您可以将显示的内容与您的实现进行比较,您的实现使用 mousePressed()
。
附录:作为引用,@mKorbel 记忆了这个 client property这可能有用。
import java.awt.Component;
import java.awt.event.*;
import javax.swing.*;
/** @author mKorbel */
public class ComboBoxAction extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private JComboBox comboBox;
private JFrame frame;
public ComboBoxAction() {
comboBox = new JComboBox();
comboBox.addActionListener(this);
comboBox.addItem("Item 1");
comboBox.addItem("Item 2");
comboBox.addItem("Item 3");
comboBox.addItem("Item 4");
for (Component component : comboBox.getComponents()) {
if (component instanceof AbstractButton) {
if (component.isVisible()) {
comboBox.remove(component);
}
}
}
//This prevents action events from being fired when the
//up/down arrow keys are used on the dropdown menu
comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
comboBox.firePopupMenuWillBecomeVisible();
frame = new JFrame();
frame.add(comboBox);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(comboBox.getSelectedItem());
//make sure popup is closed when 'isTableCellEditor' is used
comboBox.hidePopup();
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ComboBoxAction();
}
});
}
}
关于java - 如何在单击、右键单击或拖动 3 个 JButton 中的任何一个时显示 JPopupMenu?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860648/