【问题标题】:Creating labels along with drawlines与绘制线一起创建标签
【发布时间】:2011-03-22 16:15:13
【问题描述】:

我问了一个关于自定义小部件的问题,但对我是否需要它以及应该如何进行感到困惑。

我目前有这门课

public class GUIEdge {

   public Node node1;
   public Node node2;
   public int weight;
   public Color color;
    public GUIEdge(Node node1, Node node2 , int cost) {
       this.node1 = node1;
       this.node2 = node2;
       this.weight = cost;
       this.color = Color.darkGray;
    }

    public void draw(Graphics g) {
        Point p1 = node1.getLocation();
        Point p2 = node2.getLocation();
        g.setColor(this.color);
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g.drawLine(p1.x, p1.y, p2.x, p2.y);

    }
}

目前这会在两点之间绘制一条边,但现在我希望同时创建一个成本标签。

我已经添加了节点和边的拖动处理,那么创建标签的最佳方法是什么

我需要为此制作一个自定义小部件吗?谁能解释一下假设通过从 JComponent 扩展来制作一个组件,然后我将通过 g.mixed() 调用它,其中混合是那个新的小部件......?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    工具提示当然值得一看。其他选择包括drawString()translate()TextLayout。有很多examples 可用。

    附录:下面的示例显示了@Catalina Island 所建议的drawString()setToolTipText()。对于simplicity,端点是相对于组件大小的,所以你可以看到调整窗口大小的结果。

    附录:setToolTipText() 的使用只是演示了这种方法。正如@camickr 所说的here,您应该覆盖getToolTipText(MouseEvent) 并在鼠标悬停在线或选择该线时更新提示。

    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Point;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    
    /** @see https://stackoverflow.com/questions/5394364 */
    public class LabeledEdge extends JComponent {
    
        private static final int N = 20;
        private Point n1, n2;
    
        public LabeledEdge(int w, int h) {
            this.setPreferredSize(new Dimension(w, h));
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            this.n1 = new Point(N, N);
            this.n2 = new Point(getWidth() - N, getHeight() - N);
            g.drawLine(n1.x, n1.y, n2.x, n2.y);
            double d = n1.distance(n2);
            this.setToolTipText(String.valueOf(d));
            g.drawString(String.valueOf((int) d),
                (n1.x + n2.x) / 2, (n1.y + n2.y) / 2);
        }
    
        private static void display() {
            JFrame f = new JFrame("EdgeLabel");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new LabeledEdge(320, 240));
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    display();
                }
            });
        }
    }
    

    【讨论】:

    • 感谢您的回答,但您能否解释更多,如翻译将如何提供帮助?并且还喜欢如果我使用 textLayout ......然后我有这个,因为当我拖动节点时边缘连接一个节点边缘也得到更新......但它的文本也需要更新......我该怎么做?跨度>
    • 我会在您的draw() 方法中以drawString() 开头,如example 所示。
    • 这样会移动节点(也改变边缘)沿着它拖动字符串?
    • 非常感谢....我相信对于 g.drawString 两者都应该是 + 并且您应该为之后查看它的人更正它,但它有很大帮助.... :)
    • 太棒了!这更好地拥抱边缘,也更简单。
    【解决方案2】:

    我认为你可以使用GUIEdge extends JComponent。这样您就可以自动获得工具提示标签。

    【讨论】:

    • 您能告诉我如何使用它吗?那么我可以直接将 GUIEdge 的工具提示设置为等于权重?
    • tutorial中有例子。我会在构造函数中执行此操作,其中设置了 weight
    • 你能帮忙吗?我在函数中使用边缘作为 e.draw() 来创建边缘......我在构造函数中添加了 e.setToolTipText() 以及绘制边缘的位置,以便重新绘制它可以再次设置工具文本.. ..但它没有发生......
    猜你喜欢
    • 2019-11-18
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多