我有以下情况:
一个JPanel被用作“画板”,用户可以添加具有特定连接点的块,这些连接点可以用于与其他块进行互连(类似于Simulink或labView)。
这些块本身是带有按钮的JPanel对象,在设置了null布局后通过add()方法添加到画板上。可以通过MouseMotionListener帮助拖动JPanels。
为了绘制连接,我重写了画板paintComponent()方法,并调用g.drawLine()(在调用super.paintComponent之后)。这个方法是有效的,但是一旦移动块,连接就会重叠在一起,变成一团糟。
因此,在用户移动块时,我调用drawingBoard.repaint()。这样做的效果是,线条在拖动过程中闪烁可见,然后立即消失。
显然,父级JPanel中JPanel的绘制会相互干扰。
我该怎么解决呢?
编辑:代码片段:
画板:
一个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;
我刚刚注意到参考文献不一致了。呃
g.clearRect(0, 0, getWidth(), getHeight())
语句? - salman.mirghasemiclearRect()
,移动块时旧的线条会留下来。然后看起来就像一团糟 :) - KlaasDC