在JPanels之间绘图



我有以下情况:

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

块本身是带有按钮的JPanel对象,这些对象在设置空布局后通过add()方法添加到绘图板中。CCD_ 3可以在CCD_ 4的帮助下被拖动。

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

显然,父JPanel中的JPanels的绘制相互干扰。

我该如何解决这个问题?

编辑:一些代码片段:

绘图板:

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和JButton。按钮用于在块之间创建连接。连接列表将在上述drawConnections中使用。

真的没有比这更多的了。

已解决:

好吧,不出所料,这是一个非常小的细节。

在划线代码中,我使用了

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

而不是

Graphics2D g2 = (Graphics2D) g;

我只是注意到参考文献不一样。D’oh

On方法可能是使行成为已添加到面板中的JComponent,并让它们自己重新绘制。这也可能有很好的效果,将行逻辑和绘制计算隔离在行类中,而不是将其放在绘图板上。

如果JDesktopPane是一个可接受的"绘图板",您可以尝试此处显示的方法。

最新更新