views:

57

answers:

1

I'm attempting to create my own custom ToolTip for a program I've ported to Java, I'm trying to match the original programs ToolTips (it was written in Delphi). I've got some code that allows me to draw "inside" a ToolTip but for some reason, if I Override paint(Graphics g, JComponent c) and leave it blank it still draws a ToolTip, and anything I attempt to draw will be drawn "inside" this little boxed ToolTip and I can't draw "outside" of it.

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());
        }
    }
}

This is what I have, and like I said, even without the lines in paint it's drawing on it's own.

Any advice to get around this? Or a better way to go about what I'm trying to do?

CLARIFICATION: The first answer by Camickr was very helpful, however I should clarify my goal is to get the box that is automatically drawn from somewhere outside of paint to go away, or be invisible.

+1  A: 

The size of the tool tip is determined by the text. Add:

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

to the paint(...) method to see the size of the tool tip. You are trying to paint outside its bounds. If you want to override the default size then you need to set the preferred size yourself. I think you want:

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

Edit: A tooltip is a component with a border and a background. If you want to remove them you can use:

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

This will only work when to tooltip is fully contained withing the frame. When the tooltip is displayed outside the bounds of the frame, then the tooltip is added to a JWindow, in which case you will see the background of the window. I don't know how to disable this behaviour because all Swing components must be painted within the bounds of a top level container.

camickr
@camickr That clears up the sizing issue, however where in the code does it decide to draw below the mouse and what's drawing the box by default. I don't need or want that box.
izuriel
@izuriel, see edit.
camickr
@camickr Thanks a bunch again :D
izuriel