有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在有子面板的jPanel上绘图

我有一个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) 个答案

  1. # 1 楼答案

    Whenever I drag a component around it causes weird graphics errors, as it draws only parts of the line and doesn't erase the ones before.

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

    The lines also show up below the sub-panels instead of over them, making them hidden a lot of the time.

    您应该能够重写paint()paintChildren()方法,而不是paintComponent()方法。不管覆盖哪个方法,都要确保调用super。XXX()首先进行默认绘制,然后再尝试绘制线条

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

  2. # 2 楼答案

    你可以得到这个JConnector项目,按原样使用,或者根据需要调整源代码