我有一个jPanel,它包含许多可以拖动的子面板。我想要做的是绘制连接其中一些子面板的线条。
然而,虽然看起来这应该很简单,但事实证明这非常令人沮丧。我得到的最好的是覆盖原始jPanel中的paintComponent函数:
panCharDisplay = new javax.swing.JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
paintLines(g);
}
};
然后画出这样的线条:
public void paintLines(Graphics g) {
g.setColor(Color.BLUE);
for (Character c : characters) {
if (c.female && c.spouse != null) {
g.drawLine(c.display.getX(), c.display.getY(), c.spouse.display.getX(), c.spouse.display.getY());
}
}
}
这在某种意义上起作用,因为它在技术上绘制线条,在正确的位置,正确的颜色,等等,但只有当我滚动线应该在哪里,然后向后滚动。每当我在它周围拖动一个组件时会导致奇怪的图形错误,因为它只绘制了部分线并且之前没有删除它们。这些线条也显示在子面板下方而不是它们之上,使它们在很多时候都隐藏起来。
我认为这样做的原因是我在错误的时间画线,并且需要在绘制子面板后绘制它们,并确保每次面板都重新绘制它们被拖了。
是否还有其他地方可以放置覆盖以使线条更加一致?我尝试的另一种方法是创建一个扩展JPanel的类,并尝试使用它来处理绘图,但我根本无法使用它。
答案 0 :(得分:2)
每当我在其周围拖动一个组件时会导致奇怪的图形错误,因为它只绘制部分线并且不会删除之前的部分。
当您拖动面板时,您可能需要在面板的父级上调用repaint()。
线条也显示在子面板下方而不是它们之上,使它们在很多时候都隐藏起来。
您应该能够覆盖paint()
或paintChildren()
方法而不是paintComponent()方法。无论您覆盖哪种方法,都要先确保调用super.XXX(),以便在尝试绘制线条之前完成默认绘画。
我个人喜欢在组件下方绘制的线条,如在trashgod的GraphPanel示例中所示。该示例为形状进行自定义绘制,但我猜测组件的逻辑类似。
答案 1 :(得分:1)
您可以获取此JConnector项目并按原样使用或根据需要调整源代码。