【问题标题】:Drawing on a jPanel that has sub-panels在具有子面板的 jPanel 上绘图
【发布时间】:2013-11-01 02:26:09
【问题描述】:

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

【问题讨论】:

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

标签: java swing netbeans line draw


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 100k 恭喜:-)
  • 谢谢,花了很长时间。其他人到达那里的速度要快得多。
  • 非常感谢,这正是我所需要的。当孩子们被拖着走的时候,我想我需要做点什么,但无论出于什么原因,我都没有想到重新粉刷。并且使用 paintChildren() 而不是 paintComponent() 可以使线条也显示在其他面板的顶部。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多