如何根据 java 中的鼠标位置制作字符串描述弹出窗口

how to make an String description popup based on mouse position in java

问题很简单。我想创建一个框,然后在鼠标附近弹出一个小字符串,指示当前鼠标位置是框的 "Inside" 或 "Outside"。虽然解决方案对我来说并不明显。我不想要一个大的对话框组件,只想要像文本本身一样小的东西,而且寿命很短。

谁能告诉我 class 可以做到这一点?

尝试将 Tooltip 设置为框组件,将另一个工具提示设置为背景。

例如:

public class Test {

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                final JFrame jf = new JFrame();
                jf.setSize(800, 600);
                jf.setTitle("Test");
                jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jf.getContentPane().setLayout(new BorderLayout());
                final JPanel panel = new JPanel();
                panel.setBackground(Color.red);
                jf.getContentPane().add(panel, BorderLayout.CENTER);
                jf.setVisible(true);

                final JPanel box = new JPanel();
                box.setPreferredSize(new Dimension(100, 100));
                box.setBackground(Color.black);

                panel.add(box, BorderLayout.CENTER);
                box.setToolTipText("Inside");
                panel.setToolTipText("Outside");
            }
        });
    }
}

在这种情况下,这是在面板上绘制的点附近或外部设置工具提示的示例:

public class Test {

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                final JFrame jf = new JFrame();
                jf.setSize(800, 600);
                jf.setTitle("Test");
                jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jf.getContentPane().setLayout(new BorderLayout());
                final int px = 200;
                final int py = 200;
                final int delta  = 10;
                final JPanel panel = new JPanel(){
                    @Override
                    protected void paintComponent(final java.awt.Graphics g) {
                        super.paintComponent(g);
                        final Color c = g.getColor();
                        g.setColor(Color.yellow);
                        g.fillOval(px - delta/2, py - delta/2, delta, delta);
                        g.setColor(c);
                    }
                };
                panel.setBackground(Color.red);

                panel.addMouseMotionListener(new MouseAdapter() {
                    @Override
                    public void mouseMoved(final MouseEvent e) {
                        final int x = e.getX();
                        final int y = e.getY();
                        if (Math.abs(x - px) < delta && Math.abs(y - py) < delta){
                            panel.setToolTipText("Point!");
                        }else{
                            panel.setToolTipText("Outside");
                        }
                    }
                });

                jf.getContentPane().add(panel, BorderLayout.CENTER);
                jf.setVisible(true);
            }
        });
    }
}