Swing: Как создать собственный виджет, похожий на JToolTip, который перемещается с помощью мыши - PullRequest
8 голосов
/ 21 августа 2011

Java Swing вопрос.

У меня есть JPanel, которая отображает график. Когда я перемещаю мышь над этим графиком, я хочу, чтобы некоторая информация отображалась в виджете, похожем на подсказку, который перемещается с помощью мыши. Как я могу лучше всего реализовать это?

Я полагаю, что моя проблема будет решена, если я знаю, как разместить собственный JComponent абсолютно внутри JPanel, который действует как мой холст для рисования. Затем я могу перехватить событие перемещения мыши и переместить / обновить виджет. Любое другое решение (включая, возможно, прямое использование JToolTip) также будет очень кстати!

Извинения, если этот вопрос является немного основным. Прошло очень много времени с тех пор, как я последний раз использовал Swing, поэтому я все еще заново учусь работать с ним. Большое спасибо заранее!

1 Ответ

8 голосов
/ 21 августа 2011

Переопределить метод getToolTipText(MouseEvent) для динамической установки подсказки в зависимости от местоположения мыши.

Edit:

Если вы хотите, чтобы всплывающая подсказка постоянно перемещалась с помощью мыши, вам также необходимо переопределить метод getToolTipLocation().

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ToolTipPanel extends JPanel
{
    public ToolTipPanel()
    {
        setPreferredSize( new Dimension(200, 200) );
        setToolTipText("");
    }

    public void paintComponent(Graphics g)
    {
        g.setColor( Color.red );
        g.fillRect(0, 0, 100, 200);
        g.setColor( Color.blue );
        g.fillRect(100, 0, 100, 200);
    }

    public String getToolTipText(MouseEvent e)
    {
        if (e.getX() < 100)
            return "red";
        else
            return "blue";
    }

    public Point getToolTipLocation(MouseEvent e)
    {
        Point p = e.getPoint();
        p.y += 15;
        return p;
//      return super.getToolTipLocation(e);
    }

    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.getContentPane().add( new ToolTipPanel() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}
...