我要以下情况:
JPanel用作“绘图板”,用户可以在其中添加具有特定连接点的模块,这些模块可用于与其他模块互连(例如Simulink或labView).
块本身是带有按钮的JPanel对象,设置空布局后,将通过add()方法将其添加到绘图板上.可以在MouseMotionListener的帮助下拖动JPanels.
为了绘制连接,我重写了绘图板的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,因为其中不需要特殊的绘图.它仅包含一些JLabel和JButton.这些按钮用于在块之间创建连接.然后在上面提到的drawConnections中使用连接列表.
确实不止如此.
解决了:
确定,这是一个很小的细节.
在我使用的画线代码中
Graphics2D g2 = (Graphics2D) this.getGraphics();
代替
Graphics2D g2 = (Graphics2D) g;
我只是注意到引用不一样. D’oh
解决方法:
可行的方法可能是使这些行成为已添加到面板中的JComponents,并使它们自己重新绘制.将线逻辑和绘画计算隔离在线类中,而不是将其放在绘图板上也可能具有很好的效果.