在JPanel之间绘图

时间:2011-06-29 09:40:06

标签: java swing drawing jpanel paintcomponent

我必须遵循以下情况:

JPanel用作“绘图板”,用户可以在其中添加具有特定连接点的块,这些块可用于与其他块互连(例如Simulink或labView)。

块本身是带有按钮的JPanel对象,在设置空布局后通过add()方法添加到绘图板。 JPanels可以借助MouseMotionListener拖动paintComponent()

要绘制连接,我会覆盖绘图板super.paintComponent方法并调用g.drawLine()(在调用drawingBoard.repaint()之后)。这样可行,但是一旦移动一个块,这些线就会相互重叠,变成一团糟。 因此,在用户移动块的过程中,我会调用JPanels。这样的效果是在拖动过程中线条会闪烁,然后立即消失。

显然,父JPanelpublic void paintComponent(Graphics g){ g.clearRect(0, 0, getWidth(), getHeight()); super.paintComponent(g); drawConnections(g);//Contains g.drawLine calls } 的绘图相互干扰。

我该如何解决这个问题?

编辑:代码的一些片段:

绘图板:

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.add()方法将块添加到绘图板中。下面是这样一个“块”JPanel的MouseMotionListener。

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

块JPanel不会覆盖paintComponent,因为它不需要特殊的绘图。它只包含一些JLabel和JButtons。这些按钮用于在块之间创建连接。然后在上面提到的drawConnections中使用连接列表。

真的没有比这更多了。

解决:

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

在我使用的线条图代码中

Graphics2D g2 = (Graphics2D) g;

而不是

{{1}}

我刚注意到引用不一样。 D'哦

2 个答案:

答案 0 :(得分:2)

接近方法可能是将这些行设置为已添加到面板并让它们自己重绘的JComponents。这也可能具有很好的效果,可以在行类中隔离线逻辑和绘制计算,而不是将它放在绘图板上。

答案 1 :(得分:1)

如果JDesktopPane是可接受的“绘图板”,您可以尝试here显示的方法。