如何绘制自己的工具提示来代替Swing组件的默认值?

时间:2010-09-16 20:16:34

标签: java user-interface swing tooltip

我正在尝试为我移植到Java的程序创建自己的自定义工具提示,我正在尝试匹配原始程序ToolTips(它是用Delphi编写的)。我有一些代码允许我在工具提示“内部”绘制,但出于某种原因,如果我覆盖paint(Graphics g, JComponent c)并将其留空,它仍会绘制工具提示,我尝试绘制的任何内容都将被绘制为“内部“这个小盒装的工具提示,我不能画”外面“。

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicToolTipUI;

class MultiLineToolTipUI extends BasicToolTipUI {  

    @Override
    public void paint(Graphics g, JComponent c) {
        //int mY = 0;
        //int mX = 0;

        //int xPoints[] = {mX, mX, mX + 15};
        //int yPoints[] = {mY, mY + 25, mY + 25};
        //Polygon p = new Polygon(xPoints, yPoints, 3);
        //g.setColor(Color.BLACK);
        //g.fillPolygon(p);
        //g.fillRoundRect(mX, mY, 100, 50, 30, 30);
    }

    public static void main (String args[])
    {
        JButton button = new JButton ("Mouse Over ME!") {
            public JToolTip createToolTip() {
                MultiLineToolTip tip = new MultiLineToolTip();
                tip.setComponent(this);
                return tip;
            }
        };
        //JButton button = new JButton("Mouse Over ME!");
        button.setToolTipText("Hello, World");

        JFrame frame = new JFrame("Basic SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( button );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );

    }

    static class MultiLineToolTip extends JToolTip
    {
        public MultiLineToolTip()
        {
            setUI(new MultiLineToolTipUI());
        }
    }
}

这就是我所拥有的,就像我说的那样,即使没有paint中的线条,它也会自行绘制。

有什么建议来解决这个问题吗?或者更好的方式去做我想做的事情?

澄清:Camickr的第一个答案非常有用,但是我应该澄清一下,我的目标是让从paint以外的某个位置自动绘制的框消失,或者看不见。

1 个答案:

答案 0 :(得分:1)

工具提示的大小由文本决定。添加:

System.out.println( c.getSize() );

到paint(...)方法查看工具提示的大小。你试图在界外画画。如果要覆盖默认大小,则需要自己设置首选大小。我想你想要:

public Dimension getPreferredSize(JComponent c)
{
    return new Dimension(100, 50);
}

编辑:工具提示是具有边框和背景的组件。如果要删除它们,可以使用:

tip.setOpaque(false);
tip.setBorder(new javax.swing.border.EmptyBorder(0, 0, 0, 0));

这仅适用于工具提示完全包含框架的情况。当工具提示显示在框架的边界之外时,工具提示将添加到JWindow,在这种情况下,您将看到窗口的背景。我不知道如何禁用此行为,因为所有Swing组件都必须在顶级容器的边界内绘制。