我有一个JFrame
包含JTabbedPane
一个JPanel
选项卡中的一个。在此JPanel
,我希望JPopupMenu
在单击鼠标右键时显示在鼠标位置。为此,我使用该show(invoker, x, y)
方法。我的问题:JPopupMenu
有一个非常奇怪的行为;有时它显示时不包含所有内容(只是一个灰色框),有时它显示在左上角Panel
,完全符合预期。
代码:
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
class Testframe extends JFrame {
public static JFrame frame;
private static final long serialVersionUID = 1L;
public Testframe(String string) {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle(string);
setSize(200,200);
setVisible(true);
}
public static void main(String[] args) {
frame = new Testframe("Title");
JTabbedPane tabpane = new JTabbedPane(JTabbedPane.TOP);
tabpane.addTab("title", new TestPanel());
frame.add(tabpane);
tabpane.setVisible(true);
}
}
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
public class TestPanel extends JPanel implements MouseListener {
private static final long serialVersionUID = 1L;
JPopupMenu activeDropdown;
TestPanel() {
setBackground(Color.GREEN);
setVisible(true);
addMouseListener(this);
}
private void dropdown(MouseEvent e) {
activeDropdown = new JPopupMenu();
JMenuItem item = new JMenuItem("Eintrag 0");
activeDropdown.add(item);
activeDropdown.show(Testframe.frame, e.getX(), e.getY());
this.add(activeDropdown);
}
@Override
public void mouseClicked(MouseEvent e) {
if(SwingUtilities.isRightMouseButton(e)) {
if (activeDropdown != null)
this.remove(activeDropdown);
dropdown(e);
}
}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
}
如果我尝试将其JTabbedPane
放入一个单独的类中,JPopupMenu
则会出现在屏幕上的任何位置(似乎是固定位置),完全独立于窗口位置。