MouseMoved上的Java重绘会导致延迟

时间:2010-10-31 12:26:19

标签: java repaint lag

我试图在每次移动鼠标时重新绘制我的java应用程序,以便当用户移动到图表上时更新屏幕( - >显示图表的名称)以及当用户不移动时图表( - >不显示图表的任何名称)。但是这会在运行应用程序时造成很大的延迟(我看到屏幕被重新绘制得非常缓慢,滞后,屏幕在重新绘制之前每次都是白色空白;需要很长时间才能重新绘制)。

这些是代码的部分内容:

 public void mouseMoved(MouseEvent e) {
  this.checkDiagramHovered(e.getX(),e.getY());
 }

调用一个函数来检查图表是否悬停并设置变量是否图表是否悬停,如果是这样的话:哪个图表悬停(要显示的名称,要做的x和y位置)然后重新绘制应用程序。因此,每次进行鼠标移动时,它都会基本重新绘制应用程序,以确保仅在用户移动时显示图表的名称。但是这会导致屏幕滞后很多,不连贯的重新粉刷。

现在我想知道:解决这个问题的最佳方法是什么?我是否应该实施某种延迟来检查鼠标移动或者是否可以做到这一点?

提前致谢,

Skyfe。

3 个答案:

答案 0 :(得分:1)

我假设你正在使用Java Swing。

您必须从用户界面线程中取出checkDiagramedHovered方法,以便UI保持响应。

public void mouseMoved(MouseEvent e) {
   Thread thread = new Thread(new Runnable()
       public void run() {
           this.checkDiagramHovered(e.getX(),e.getY());
       }
    );
    thread.start();
}

如果checkDiagramedHovered有任何UI方法,则必须在UI线程中运行它们。

SwingUtilities.invokeLater(new Runnable()
    public void run() {
        (UI method call)
    }
);

答案 1 :(得分:0)

好吧,我会使用Swing,而不是AWT。 Swing是AWT的扩展,现在每个人都在使用它。然后你可以使用Tool Tip。您需要覆盖显示图像的组件的getToolTipText(...)方法。

答案 2 :(得分:0)

在swing和awt中,所有事件(鼠标,键盘)和绘画都在同一个线程中发生。 当你调用重绘时,你向该线程提交一个新的工作,最终实际上会调用paint。 如果paint函数花费的时间太长,那个线程(AWT事件队列线程)太忙而无法处理鼠标事件而你会看到滞后。 你所描述的闪烁问题也表明油漆功能缓慢。

你可以做几件事: 1.使用双缓冲。这将解决闪烁而不是滞后。 2.在不同的线程中进行实际渲染,并让awt线程绘制由该线程准备的屏幕外图像。这将解决这两个问题。

简而言之,双缓冲意味着您创建一个屏幕外图像并对其进行绘制,然后使用Graphics.drawImage()

立即绘制整个图像。