0

我有一个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则会出现在屏幕上的任何位置(似乎是固定位置),完全独立于窗口位置。

4

2 回答 2

1

您可以简单地使用JComponent.setComponentPopupMenu来处理右键单击弹出菜单。这要简单得多,并且将为您处理所有接线代码。

您的代码的小示例:

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public class TestPanel extends JPanel {
    private static final long serialVersionUID = 1L;

    JPopupMenu activeDropdown;

    TestPanel() {
        setBackground(Color.GREEN);
        activeDropdown = new JPopupMenu();
        JMenuItem item = new JMenuItem("Eintrag 0");
        activeDropdown.add(item);
        setComponentPopupMenu(activeDropdown);
    }

    protected void initUI() {
        JFrame frame = new JFrame("Title");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTabbedPane tabpane = new JTabbedPane(JTabbedPane.TOP);
        tabpane.addTab("title", this);
        frame.add(tabpane);
        frame.setSize(200, 200);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestPanel().initUI();
            }
        });
    }
}

注意:避免使用static变量!

于 2013-06-16T15:25:02.500 回答
1

改变你的dropdown方法如下。这应该按预期工作。

 private void dropdown(MouseEvent e) {
    activeDropdown = new JPopupMenu();
    JMenuItem item = new JMenuItem("Eintrag 0");
    activeDropdown.add(item);

    this.add(activeDropdown);
    activeDropdown.show(this, e.getX(), e.getY());
 }

但是,我不明白您为什么要删除现有的JPopMenu并在每次鼠标右键单击时添加一个新的。

于 2013-06-16T14:59:13.773 回答