【问题标题】:Using JPopupMenu as hover-over display still visible after alt-tabbing使用 JPopupMenu 作为悬停显示在 alt-tabbing 后仍然可见
【发布时间】:2016-04-15 17:29:12
【问题描述】:

我有一个页面,上面有对象。对象位置由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);
    }
}

【问题讨论】:

  • 请编辑您的问题以包含一个minimal reproducible example,该minimal reproducible example显示您描述的问题并确定受影响的平台。
  • 你在使用setComponentPopupMenu(),对于example
  • 您是否考虑过使用预先存在的工具提示功能?
  • 但是我想调用'Tooltip'的对象不是swing对象,它是一个带有矩形和一些其他非swing相关成员的类。如何在任意对象上使用工具提示功能?
  • 所以?它是否由像 JPanelJComponent 这样的 Swing 组件支持?即使您使用自定义绘画,您仍然可以使用工具提示。 This 示例展示了如何根据鼠标的位置自定义工具提示的文本,this 展示了如何设置工具提示的位置

标签: java swing


【解决方案1】:

我通过将顶部框架添加到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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2015-08-06
    • 2014-02-22
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多