【问题标题】:Drawing between JPanelsJPanel 之间的绘图
【发布时间】:2011-06-29 09:40:06
【问题描述】:

我必须以下情况:

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

块本身是带有按钮的JPanel 对象,在设置空布局后通过add() 方法添加到绘图板上。 JPanels 可以在 MouseMotionListener 的帮助下拖动。

为了绘制连接,我覆盖了绘图板paintComponent() 方法并调用 g.drawLine()(在调用super.paintComponent 之后)。这行得通,但是一旦你移动一个块,线条就会相互重叠,就会变得一团糟。 因此,我在用户移动块期间调用drawingBoard.repaint()。这样做的效果是线条在拖动过程中闪烁可见,然后立即消失。

显然,父JPanelJPanels的绘制相互干扰。

我该如何解决这个问题?

编辑:代码的一些sn-ps:

绘图板:

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 和 JButton。这些按钮用于在块之间创建连接。然后在上面提到的 drawConnections 中使用连接列表。

真的没有比这更多的了。

已解决:

好的,正如预期的那样,这是一个非常小的细节。

在我使用的画线代码中

Graphics2D g2 = (Graphics2D) this.getGraphics();

而不是

Graphics2D g2 = (Graphics2D) g;

我刚刚注意到引用不一样。呵呵

【问题讨论】:

  • 很难说什么,没有看到你的代码和你尝试了什么/如何尝试
  • 如果窗口没有焦点并且另一个窗口放在它上面(重叠),它似乎确实有效。然后线条停留。
  • 为什么会有g.clearRect(0, 0, getWidth(), getHeight())声明?
  • 如果我不添加对clearRect() 的调用,则在移动块时旧行会保留。那看起来像一团糟:)
  • 我猜你的代码有问题,这里没有出现。看这段代码:download.oracle.com/javase/tutorial/uiswing/painting/…。它的作用类似于您所做的,但它不调用 clearRect()

标签: java swing drawing jpanel paintcomponent


【解决方案1】:

方法可能是使这些行成为已添加到面板的 JComponents 并让它们自己重新绘制。这也可能具有将线条逻辑和绘制计算隔​​离在线条类中而不是将其放在绘图板上的良好效果。

【讨论】:

  • 转念一想这是个好主意,因为它可以让复杂的连接形状变得更容易,而不仅仅是直线。
【解决方案2】:

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

【讨论】:

  • 非常有用!这个想法是相似的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多