使用JPopupMenu作为悬停显示在alt-tabbing后仍然可见

时间:2016-04-12 10:04:33

标签: java swing

我有一个包含对象的页面。对象位置由Rectangle2D.Double定义。当我移动鼠标时,我检查矩形是否包含鼠标点。 如果是,我想显示对象的悬停菜单(到目前为止只有文本)。

我在构造函数中拥有的是

annnotationPopupMenu = new JPopupMenu();
annotationTextArea = new JTextArea(5,20);
annotationTextArea.setLineWrap(true);
annnotationPopupMenu.add(annotationTextArea);

如果我在一个对象上运行这个

annotationTextArea.setText(annotation.getContent());
annnotationPopupMenu.setLocation(MouseInfo.getPointerInfo().getLocation().x+30, MouseInfo.getPointerInfo().getLocation().y);
annnotationPopupMenu.setVisible(true);

如果我离开对象

annnotationPopupMenu.setVisible(false);

正在运行。我现在遇到的问题是,当我退出应用程序并且鼠标悬停在一个对象上时,即使应用程序的其余部分现在位于我选中的窗口后面,JPopupMenu仍然可见。

我需要做的是,JPopup菜单要么不可见,要么至少没有优先于我选中的窗口。

在MWE下方,只打开一个PopupMenu,即使是alt-tabbing也能保持最佳状态:

package popupmenutest;

import javax.swing.JPopupMenu;
import javax.swing.JTextArea;

public class PopupMenuTest
{

    public static void main(String[] args)
    {
    JPopupMenu annotationPopupMenu = new JPopupMenu();
    JTextArea annotationTextArea = new JTextArea(5,20);
    annotationTextArea.setLineWrap(true);
    annotationPopupMenu.setLocation(500, 400);
    annotationPopupMenu.add(annotationTextArea);
    annotationPopupMenu.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:0)

我通过将顶部框架添加到WindowFocusListener然后再添加到windowLostFocus来修复此问题。我调用特定窗格并将JPopupMenu的可见性设置为false。

这样的事情:

package popupmenutest;

import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JFrame;

import java.awt.Dimension;
import java.awt.MouseInfo;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;

public class PopupMenuTest implements WindowFocusListener
{

    public PopupMenuTest()
    {

        frame = new JFrame();
        frame.setSize(800, 600);
        popupMenu = new JPopupMenu();
        JTextArea annotationTextArea = new JTextArea(5,20);
        JScrollPane scrollPane = new JScrollPane(annotationTextArea); 
        popupMenu.setPreferredSize(new Dimension(300, 120));
        annotationTextArea.setText("Dies hier ist ein Blindtext zum Testen von Textausgaben. Wer diesen Text liest, ist selbst schuld. Der Text gibt lediglich den Grauwert der Schrift an. Ist das wirklich so? "
            + " Ist es gleichgültig, ob ich schreibe: Dies ist ein Blindtext oder Huardest gefburn? Kjift – mitnichten! Ein Blindtext bietet mir wichtige Informationen. An ihm messe ich die Lesbarkeit einer Schrift, "
            + "ihre Anmutung, wie harmonisch ");

        annotationTextArea.setLineWrap(true);
        annotationTextArea.setWrapStyleWord(true);
        annotationTextArea.invalidate();
        scrollPane.setVisible(true);
        popupMenu.setLocation(MouseInfo.getPointerInfo().getLocation().x, MouseInfo.getPointerInfo().getLocation().y);
        popupMenu.add(scrollPane);
        popupMenu.pack();
        frame.add(popupMenu);
        frame.addWindowFocusListener(this);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    @Override
    public void windowGainedFocus(WindowEvent e)
    {

    }

    @Override
    public void windowLostFocus(WindowEvent e)
    {
        popupMenu.setVisible(false);

    }
    private JPopupMenu popupMenu;
    private JFrame frame;
}