我必须遵循以下情况:
JPanel
用作“绘图板”,用户可以在其中添加具有特定连接点的块,这些块可用于与其他块互连(例如Simulink或labView)。
块本身是带有按钮的JPanel
对象,在设置空布局后通过add()方法添加到绘图板。 JPanels
可以借助MouseMotionListener
拖动paintComponent()
。
要绘制连接,我会覆盖绘图板super.paintComponent
方法并调用g.drawLine()(在调用drawingBoard.repaint()
之后)。这样可行,但是一旦移动一个块,这些线就会相互重叠,变成一团糟。
因此,在用户移动块的过程中,我会调用JPanels
。这样的效果是在拖动过程中线条会闪烁,然后立即消失。
显然,父JPanel
中public 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'哦
答案 0 :(得分:2)
接近方法可能是将这些行设置为已添加到面板并让它们自己重绘的JComponents。这也可能具有很好的效果,可以在行类中隔离线逻辑和绘制计算,而不是将它放在绘图板上。
答案 1 :(得分:1)
如果JDesktopPane
是可接受的“绘图板”,您可以尝试here显示的方法。