Java 在具有子面板的jPanel上绘制

Java 在具有子面板的jPanel上绘制,java,swing,netbeans,line,draw,Java,Swing,Netbeans,Line,Draw,我有一个jPanel,它包含许多可以拖动的子面板。我想做的是画一条线,把这些子面板连接在一起 然而,虽然看起来这应该很简单,但事实证明这非常令人沮丧。我得到的最好结果是重写原始jPanel中的paintComponent函数,如下所示: panCharDisplay = new javax.swing.JPanel() { @Override public void paintComponent(Graphics g) { super.paintComponent

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

每当我拖动一个组件时,它都会导致奇怪的图形错误,因为它只绘制部分线条,而不会删除之前的部分

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

线也显示在子面板下方,而不是子面板上方,这使得它们在很多时候被隐藏

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

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

每当我拖动一个组件时,它都会导致奇怪的图形错误,因为它只绘制部分线条,而不会删除之前的部分

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

线也显示在子面板下方,而不是子面板上方,这使得它们在很多时候被隐藏

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

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

每当我拖动一个组件时,它都会导致奇怪的图形错误,因为它只绘制部分线条,而不会删除之前的部分

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

线也显示在子面板下方,而不是子面板上方,这使得它们在很多时候被隐藏

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

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

每当我拖动一个组件时,它都会导致奇怪的图形错误,因为它只绘制部分线条,而不会删除之前的部分

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

线也显示在子面板下方,而不是子面板上方,这使得它们在很多时候被隐藏

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


就我个人而言,我喜欢部件下方绘制的线条,如垃圾神的示例所示。该示例对形状进行自定义绘制,但是我想组件的逻辑应该是类似的。

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

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

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

您可以获得此项目并按原样使用根据您的需要修改或修改源。

查看。这将在顶部绘制线条,但您可以将“连接”窗格放置在主面板下方(使顶部面板透明),以获得类似的结果…另一个选项可能是渲染连接到缓冲图像,并将其直接绘制到组件的背景,当布局或组件本身发生变化时,更新图像…如果不将GUI组件(按钮等)添加到正在连接的面板,则应考虑将其绘制为填充矩形。对于这类事情,您将拥有更灵活的功能。不幸的是,并没有一种“默认”的方式在子组件的顶部绘制。在父面板上绘制时,会显式地在其下方绘制。这也可能是因为它只是尝试重新绘制脏区域,而不是整个面板。请使用loo