在具有子面板的jPanel上绘图

时间:2013-11-01 02:26:09

标签: java swing netbeans line draw

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

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

我个人喜欢在组件下方绘制的线条,如在trashgod的GraphPanel示例中所示。该示例为形状进行自定义绘制,但我猜测组件的逻辑类似。

答案 1 :(得分:1)

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