【问题标题】:Calling Repaint() on Java onPaint()在 Java onPaint() 上调用 Repaint()
【发布时间】:2013-03-16 15:27:17
【问题描述】:

我目前正在用 Java 实现一个鼠标悬停脚本,用于一个带有完整图形的按钮(没有 JButton)。这是我的一段代码:

@Override
public void mouseMoved(MouseEvent e){
    if (btnExit.getBound().contains(e.getX(), e.getY())){
        btnExit.setStatus(BUTTON_STATE.HOVER);
    } else {
        btnExit.setStatus(BUTTON_STATE.IDLE);
    }
    System.getInstance().repaint();
}

当我的鼠标移动时,总是会调用 repaint 方法。

问题是 > 对于悬停动作来说这是一个好的实现吗?还是有更好的实现?因为我认为每次鼠标移动都调用 repaint() 计算量很大。

THX b4

【问题讨论】:

  • 为什么在鼠标悬停时调用重绘?有什么具体目的吗?
  • 如果我不调用它,按钮不会将图像更改为 hoverImage。它将停留在 idleImage....
  • 按钮上有图片吗?
  • 不,只是一个用 ImageIO 加载并通过paint(Graphics g) 方法绘制的图像
  • 为什么要保存当前状态,只在状态真正改变时才调用repaint()

标签: java graphics rendering mouseover graphics2d


【解决方案1】:

调用repaint() 并不意味着该组件将立即重新绘制。此调用只是将一个条目放入重绘请求队列中,在许多情况下该条目可能与其他条目合并。

如果您怀疑repaint() 可能被过于频繁地调用,请使用接受重绘对象后最长时间的版本。例如,如果您在同一秒内调用button.repaint(1000) 100 次,它只会重绘一次。您还可以指定应该重绘的区域(而不是整个屏幕),但这只有在您的实现对这种部分重绘确实做得较少时才有效。

此外,您可以在 btnExit 上调用 repaint,而不是在整个应用程序框架上调用。

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多