【发布时间】:2011-06-29 09:40:06
【问题描述】:
我必须以下情况:
JPanel 用作“绘图板”,用户可以在其中添加具有特定连接点的模块,这些连接点可用于与其他模块互连(例如 Simulink 或 labView)。
块本身是带有按钮的JPanel 对象,在设置空布局后通过add() 方法添加到绘图板上。 JPanels 可以在 MouseMotionListener 的帮助下拖动。
为了绘制连接,我覆盖了绘图板paintComponent() 方法并调用 g.drawLine()(在调用super.paintComponent 之后)。这行得通,但是一旦你移动一个块,线条就会相互重叠,就会变得一团糟。
因此,我在用户移动块期间调用drawingBoard.repaint()。这样做的效果是线条在拖动过程中闪烁可见,然后立即消失。
显然,父JPanel中JPanels的绘制相互干扰。
我该如何解决这个问题?
编辑:代码的一些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