我有一个简单的 JPanel
,用于显示图像。我想要一些功能,可以通过拖动来平移图像。我有这样的东西(注意我编译并正确运行的代码;下面的代码被严重截断,只是为了了解我在做什么):
public class Data2DPanel extends JPanel {
public Data2DPanel(Data2D data) {
// Set image
this.image = Data2D.data2DToBufferedImage(data);
// Set mouse listener
Data2DMouseAdapter data2DMouseAdapter = new Data2DMouseAdapter();
this.addMouseListener(data2DMouseAdapter);
this.addMouseMotionListener(data2DMouseAdapter);
}
private class Data2DMouseAdapter extends MouseAdapter {
@Override
public void mouseDragged(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
switch (actionState) {
case PAN:
xOffset = xOffsetInit + e.getX()-xPosInit;
yOffset = yOffsetInit + e.getY()-yPosInit;
paintComponent(getGraphics());
break;
}
}
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
// Paint image
g2.drawImage(image,x,y,width,height,this);
}
}
}
问题是有很多闪烁。我检查过 stackoverflow/google ,似乎很多闪烁问题都是因为人们重写了 paint
方法而不是 paintComponent
方法。我还检查了 isDoubleBuffered
并且它返回 true
。直觉上,我觉得也许 mouseDragged
方法更新太多,以至于 paintComponent()
无法跟上,但我认为双缓冲仍然应该防止闪烁的发生。我的问题是这种方法是否存在本质上的错误,以及是否有一个标准或优雅的解决方案。
最佳答案
paintComponent(getGraphics());
应该是 repaint()
。复杂的问题。
- 您永远不想调用
getGraphics()
来进行自定义绘制。用于绘制的唯一Graphics
对象应该是 Paint 方法中提供的对象。 - 您永远不应该调用
paintXxx
来尝试“强制”组件的重绘。您应该调用repaint()
并允许RepaintManager
处理所有更新和绘制周期
关于java - JPanel 使用 mouseMoved 方法闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25751022/