0

我有一个 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 的类,并尝试使用它来处理绘图,但我根本无法让它工作。

4

2 回答 2

2

每当我在它周围拖动一个组件时,它都会导致奇怪的图形错误,因为它只绘制线的一部分并且不会擦除之前的部分。

当您拖动面板时,您可能需要在面板的父级上调用 repaint()。

这些线条也显示在子面板下方而不是在它们上方,使它们在很多时候都隐藏起来。

您应该能够覆盖paint()orpaintChildren()方法而不是 paintComponent() 方法。无论您覆盖哪种方法,请确保首先调用 super.XXX() 以便在您尝试绘制线条之前完成默认绘制。

就我个人而言,我喜欢在组件下方绘制的线条,如垃圾神GraphPanel示例中所示。该示例对形状进行了自定义绘画,但我猜组件的逻辑将是相似的。

于 2013-11-01T03:17:56.833 回答
1

您可以获取此JConnector项目并按原样使用或根据需要调整源。

于 2013-11-01T06:06:48.083 回答