【发布时间】:2013-11-01 02:26:09
【问题描述】:
我有一个 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 的类,并尝试使用它来处理绘图,但我根本无法让它工作。
【问题讨论】:
-
看看this example。这会将线条绘制在顶部,但您可以将“连接”窗格放在主面板下方(使顶部面板透明)以获得类似的结果......
-
另一种选择可能是将连接渲染到缓冲图像并将其直接绘制到组件的背景上,当布局或组件本身发生变化时更新图像......
-
如果您不向要连接的面板添加 GUI 组件(按钮等),您应该考虑将它们绘制为填充矩形。对于这类事情,您将拥有更灵活的功能。不幸的是,没有一种“默认”方式可以在子组件之上进行绘制。在父对象上绘图显式地在它们下面绘制。
-
也可能是因为它只是试图重绘脏区而不是整个面板。
标签: java swing netbeans line draw