How to display floating tool tip text on a polygon

后端 未结 1 1058
被撕碎了的回忆
被撕碎了的回忆 2021-01-24 09:49

I have written a Java code to draw a polygon on an image. When I put my cursor inside the polygon it prints \"Inside\" otherwise \"Outside\". So the detection of the points insi

相关标签:
1条回答
  • 2021-01-24 10:28

    For this usage, How to Use Tool Tips suggests overriding the getToolTipText() method of the enclosing JComponent. This answer outlines the approach for JMapViewer and ChartPanel. In the example below, getToolTipText() simply returns the name of any Shape that contains() the triggering mouse event. For comparison, the JLabel at window's bottom gets a conventional too tip via setToolTipText().

    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Polygon;
    import java.awt.Shape;
    import java.awt.event.MouseEvent;
    import java.awt.geom.Ellipse2D;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.ToolTipManager;
    
    /**
     * @see https://stackoverflow.com/a/53609066/230513
     * @see https://stackoverflow.com/a/25944439/230513
     */
    public class ShapeToolTip {
    
        private static class ShapePanel extends JPanel {
    
            private final List<Shape> list = new ArrayList<>();
    
            public ShapePanel() {
                Polygon p = new Polygon();
                p.addPoint(500, 100);
                p.addPoint(500, 400);
                p.addPoint(200, 400);
                list.add(p);
                list.add(new Ellipse2D.Double(100, 100, 200, 200));
                ToolTipManager.sharedInstance().registerComponent(this);
            }
    
            @Override
            public String getToolTipText(MouseEvent e) {
                for (Shape shape : list) {
                    if (shape.contains(e.getX(), e.getY())) {
                        return shape.getClass().getName();
                    }
                }
                return "Outside";
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.blue);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setStroke(new BasicStroke(2));
                for (Shape shape : list) {
                    g2d.draw(shape);
                }
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        }
    
        private void display() {
            JFrame f = new JFrame("ShapeToolTip");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new ShapePanel());
            JLabel title = new JLabel("Shape Tool Tip", JLabel.CENTER);
            title.setToolTipText("Title");
            title.setFont(title.getFont().deriveFont(Font.BOLD, 24));
            f.add(title, BorderLayout.SOUTH);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new ShapeToolTip()::display);
        }
    }
    
    0 讨论(0)
提交回复
热议问题