java - 在具有子面板的 jPanel 上绘图

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

最佳答案

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(),以便在尝试绘制线条之前完成默认绘制。

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

关于java - 在具有子面板的 jPanel 上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19719884/

相关文章:

java - 调整 JFrame 的大小以适应添加的组件

java - 为什么调用 fail() 在使用 JUnit 的 Java 类中编译

netbeans - 删除缩进指导线

java - 可用性:如何为我的用户提供并轻松部署(最好是基于 Node.js + MongoDB 的)服务器后端?

java - 如何从另一个应用程序打开 Instagram 启动器 Activity

java - 我可以在 Javafx TableView 中对行进行分组吗?

java - 从 JFrame 返回一个值到 main()

java - 如何处理 Canvas 中的多个元素

java - 使用 Netbeans 6.5 分析器分析远程 Web 应用程序?

java - 如何编写启动画面?