创建类似JToolTip的组件

时间:2012-11-01 18:56:24

标签: java swing

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

看起来这些问题有一些解决方法,但它们相当复杂和不优雅,所以我认为一个好的解决方案就是创建我自己的组件,填写相关信息并自己显示。但是,这需要是某种顶级组件,因为它需要能够稍微超出父组件的边界,甚至包含JFrame,并且可以覆盖其他所有组件。我知道的唯一具有JToolTip之外的功能的对象是JFrame和JDialog,它们具有我不想要的标题和关闭按钮的边界。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

一种选择是使用玻璃窗格。在这种情况下,您的工具提示将无法移出框架,但您可以轻松地将其相对于框架侧面的距离进行定位。一些示例代码,用于绘制跟随鼠标的气泡(可以在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);
    }

}