java-在JPanels之间绘图

我要以下情况:

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,并使它们自己重新绘制.将线逻辑和绘画计算隔离在线类中,而不是将其放在绘图板上也可能具有很好的效果.

上一篇:c# – 使用System.Drawing更改形状


下一篇:WPF(C#)中Bitmap与BitmapImage相互转换