Java 在JPanel之间绘制

Java 在JPanel之间绘制,java,swing,drawing,jpanel,paintcomponent,Java,Swing,Drawing,Jpanel,Paintcomponent,我必须面对以下情况: JPanel被用作“绘图板”,用户可以在其中添加具有特定连接点的块,这些连接点可用于互连到其他块(想想Simulink或labView) 块本身是带有按钮的JPanel对象,在设置空布局后通过add()方法添加到绘图板。在MouseMotionListener的帮助下,可以拖动JPanels 为了绘制连接,我覆盖绘图板paintComponent()方法并调用g.drawLine()(在调用super.paintComponent之后)。这是可行的,但只要移动一个块,线就会

我必须面对以下情况:

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

块本身是带有按钮的
JPanel
对象,在设置空布局后通过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

块JPanel不替代paintComponent,因为其中不需要特殊图形。它只包含一些jlabel和jbutton。这些按钮用于创建块之间的连接。然后在上述drawConnections中使用连接列表

没有比这更多的了

解决了的: 好的,正如所料,这是一个非常小的细节

在我使用的线描代码中

Graphics2D g2 = (Graphics2D) this.getGraphics();
而不是

Graphics2D g2 = (Graphics2D) g;

我只是注意到参考资料不一样。D'oh

的方法可能是使线条成为添加到面板中的JComponents,并让它们自己重新绘制。这可能还有一个很好的效果,即在line类中隔离line逻辑和绘制计算,而不是将其放在绘图板上。

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

很难说,如果没有看到您的代码以及您尝试的内容/方式,那么它似乎确实可以工作,但是如果窗口没有焦点,并且另一个窗口位于其上方(重叠)。然后行保持不变。为什么有
g.clearRect(0,0,getWidth(),getHeight())
语句?如果我没有添加对
clearRect()
的调用,则在移动块时旧行保持不变。看起来很混乱:)我想你的代码有一些问题,这里没有出现。请看以下代码:。它的功能与您所做的类似,但它不调用
clearRect()
。非常有用!这个想法是相似的。谢谢仔细想想,这是一个好主意,因为这将使复杂的连接形状变得更容易,而不仅仅是直线。
Graphics2D g2 = (Graphics2D) g;