Как я могу нарисовать свою собственную подсказку вместо стандартных компонентов Swing? - PullRequest
0 голосов
/ 17 сентября 2010

Я пытаюсь создать свою собственную всплывающую подсказку для программы, которую я перенес на Java, я пытаюсь соответствовать оригинальной подсказке программ (она была написана на 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 оно опирается на свои собственные.

Любой совет, чтобы обойти это?Или лучший способ понять, что я пытаюсь сделать?

РАЗЪЯСНЕНИЕ: Первый ответ Камикра был очень полезен, однако я должен уточнить, что моя цель состоит в том, чтобы заставить ящик, который автоматически извлекается из-за пределов paint, уйти или быть невидимым.

1 Ответ

1 голос
/ 17 сентября 2010

Размер подсказки определяется текстом.Добавьте:

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

к методу рисования (...), чтобы увидеть размер кончика инструмента.Вы пытаетесь рисовать за его пределами.Если вы хотите переопределить размер по умолчанию, вам нужно установить предпочтительный размер самостоятельно.Я думаю, что вы хотите:

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 должны быть нарисованы в границах контейнера верхнего уровня.

...