java - 连同画线一起创建标签

标签 java swing

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

我现在有这门课

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() 调用它,其中 mixed 是那个新的小部件......?

最佳答案

工具提示当然值得一看。其他选择包括 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();
            }
        });
    }
}

关于java - 连同画线一起创建标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5394364/

相关文章:

java - 为什么编译器不使用断言来优化?

java - 如何访问 JButton ActionListener 中的变量?

java - 使用 Java Swing 应用程序,如何将对话框面板中的值获取到主应用程序中?

java - 是否可以检测到焦点丢失在 jSpinner 的按钮上

java - JLayeredPane 不更新 JLabel 的移动

java - 更改所选 jbutton 的边框颜色而不命名按钮

java - 数据库连接错误

java - 通过 OnsharedPreferenceChangeListener 更新 TextView 中的文本

java - 使用 toArray() 方法引发的 ClassCastException

java - 如何调用自定义首选项