java - 创建类似 JToolTip 的组件

标签 java swing

我正在编写一个显示一些生物信息学数据的自定义组件,并且我希望能够显示有关当用户按住某个键时鼠标所在位置的附加信息。对于工具提示来说,这似乎是一项显而易见的工作,但有一些问题似乎阻止了它的工作。首先,我想让工具提示跟随鼠标并动态更改其文本。这在某种程度上是通过覆盖组件的 getToolTipText 和 getToolTipLocation 来实现的,但工具提示会随着鼠标位置的更新而闪烁,并且不会显示在子组件上(它是一个 JPanel,其中包含一些 JTextPanes)。我也不认为有任何方法可以使其在不调用 ToolTipManager 的情况下立即显示,我相信这会改变所有其他组件的延迟。

看起来其中一些问题有解决方法,但它们相当复杂且不优雅,所以我认为一个好的解决方案是创建我自己的组件,用相关信息填充它并亲自展示它。但是,这需要是某种顶级组件,因为它需要能够稍微超出父组件甚至包含 JFrame 的边界,并在其他所有组件上进行绘制。据我所知,在 JToolTip 之外具有此功能的唯一对象是 JFrame 和 JDialog,它们的边框带有我不想要的标题和关闭按钮。有什么办法可以实现这一点吗?

最佳答案

一种选择是使用玻璃板。在这种情况下,您的工具提示将无法超出框架,但您可以轻松地根据它与框架一侧的距离来定位它。一些绘制跟随鼠标的气泡(您可以在 Paint 方法中用文本填充)的示例代码。

    public static void main(String[] args)
{
    JFrame frame = new JFrame();
    frame.setSize(new Dimension(500, 500));

    JPanel glassPane = new JPanel();
    glassPane.setOpaque(false);
    glassPane.setLayout(null);

    frame.setGlassPane(glassPane);
    frame.getGlassPane().setVisible(true);


    final MyInfoBubble mib = new MyInfoBubble();
    mib.setBounds(10, 30, 100, 50);
    ((JPanel)frame.getGlassPane()).add(mib);

    frame.getContentPane().addMouseMotionListener(new MouseMotionAdapter() {

        public void mouseMoved(MouseEvent me) {
            mib.setBounds(me.getPoint().x, me.getPoint().y, 100, 50);
        }
    });

    ((JPanel)frame.getGlassPane()).validate();
    ((JPanel)frame.getGlassPane()).repaint();

    frame.setVisible(true);
}



static class MyInfoBubble extends JPanel
{
    public MyInfoBubble()
    {
        setVisible(true);
    }


    public void paintComponent(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(Color.BLUE);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20);
    }

}

关于java - 创建类似 JToolTip 的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13183703/

相关文章:

Java 继承/OOP - 仅使用父级句柄调用子类型特定方法

java - 如何阻止 Java 瘦客户端请求,直到 Ignite 集群中的数据预加载完成

java - 从 SCROLL_TAB_LAYOUT JTabbedPane 中删除选项卡后,将剩余选项卡滚动至可见

java - 如何在 Swing 应用程序中获得类似 Intellij Idea 的外观和感觉?

Java:Swing 中的 HTML/CSS,显示内联不起作用

java - getAllFonts() 在不同的机器上返回不同的名称

java - 从日期列表中获取所有缺失的日期(已排序)

java - Hibernate MS SQL 连接

java - 使用十六进制值定义枚举内部类

Java新手: Swing and displaying ASCII files