gpt4 book ai didi

java - JPopupMenu.show 显示具有奇怪行为的弹出菜单(有时显示为灰色框)

转载 作者:行者123 更新时间:2023-12-02 06:57:26 26 4
gpt4 key购买 nike

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

最佳答案

更改您的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 并在每次单击鼠标右键时添加一个新菜单。

关于java - JPopupMenu.show 显示具有奇怪行为的弹出菜单(有时显示为灰色框),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17134481/

26 4 0