在多个JPanels之间绘制图形

3
我有以下情况:
一个JPanel被用作“画板”,用户可以添加具有特定连接点的块,这些连接点可以用于与其他块进行互连(类似于Simulink或labView)。
这些块本身是带有按钮的JPanel对象,在设置了null布局后通过add()方法添加到画板上。可以通过MouseMotionListener帮助拖动JPanels。
为了绘制连接,我重写了画板paintComponent()方法,并调用g.drawLine()(在调用super.paintComponent之后)。这个方法是有效的,但是一旦移动块,连接就会重叠在一起,变成一团糟。
因此,在用户移动块时,我调用drawingBoard.repaint()。这样做的效果是,线条在拖动过程中闪烁可见,然后立即消失。
显然,父级JPanel中JPanel的绘制会相互干扰。
我该怎么解决呢?
编辑:代码片段:
画板:
public void paintComponent(Graphics g){
    g.clearRect(0, 0, getWidth(), getHeight());
    super.paintComponent(g);
    drawConnections(g);//Contains g.drawLine calls
}

块通过JPanel.add()方法添加到绘图板中。以下是这样一个“块”JPanel的MouseMotionListener。

public void mouseDragged(MouseEvent e)
{
    pt = SwingUtilities.convertPoint(movingPanel, e.getX(), e.getY(), movingPanel.getParent());
    movingPanel.setBounds(pt.x - clickX, pt.y - clickY, movingPanel.getWidth(), movingPanel.getHeight());
    e.consume();

    movingPanel.getParent().repaint();
}

块级面板JPanel没有覆盖paintComponent方法,因为它里面没有需要特殊绘制的内容。它只包含一些JLabels和JButtons。这些按钮用于在块之间创建连接。然后,在上面提到的drawConnections中使用连接列表。

实际上,就没有比这更多的了。

已解决:

好的,正如预期的那样,这只是一个非常小的细节。

在线条绘制代码中,我使用了

Graphics2D g2 = (Graphics2D) this.getGraphics();

替代

Graphics2D g2 = (Graphics2D) g;

我刚刚注意到参考文献不一致了。呃


很难在没有看到你的代码以及你尝试了什么/如何尝试的情况下说出任何东西。 - mKorbel
它似乎可以工作,但是如果窗口没有焦点并且另一个窗口覆盖在其上方(重叠),那么这些线会保留。 - KlaasDC
为什么你要使用 g.clearRect(0, 0, getWidth(), getHeight()) 语句? - salman.mirghasemi
如果我不添加调用 clearRect(),移动块时旧的线条会留下来。然后看起来就像一团糟 :) - KlaasDC
好的,我不明白。我准备了一段代码从我的项目中复制/粘贴到这里。当我运行它时,它可以正常工作...现在正在重新检查所有内容。 - KlaasDC
显示剩余3条评论
2个回答

2

一种方法是将线条制作成JComponents并添加到面板中,让它们自行重绘。这样做还有一个好处,就是将线条逻辑和绘制计算隔离到一个线条类中,而不是在绘图板上处理。


重新考虑后,这是一个好主意,因为它将使得具有复杂连接形状的设计变得更加容易,而不仅仅是直线。 - KlaasDC

1
如果 JDesktopPane 是一个可接受的“画板”,您可以尝试这里所示的方法here

非常有用!这个想法很相似。谢谢! - KlaasDC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接