我问了一个有关自定义窗口小部件的问题,但对我是否需要它以及应该如何进行感到困惑。
我目前有这堂课
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()来调用它,其中新的小部件是混合的…?
工具提示当然值得一看。其他选择包括drawString(),translate()或TextLayout。有许多可用的示例。
drawString()
translate()
TextLayout
附录:@Catalina Island建议,以下示例同时显示drawString()和setToolTipText()。为简单起见,端点是相对于组件大小的,因此您可以看到调整窗口大小的结果。
setToolTipText()
附录:的使用setToolTipText()仅说明方法。就像@camickr在这里指出的那样,getToolTipText(MouseEvent)当鼠标悬停在该行上或选中该行时,您应该覆盖并更新笔尖。
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(); } }); } }