0

当用户移过图表(-> 显示图表的名称)和用户没有移过图表(- > 不显示图表的任何名称)。但这会在运行应用程序时导致巨大的延迟(我看到屏幕被重新绘制非常缓慢,滞后,每次重新绘制之前屏幕都是白色的空白;重新绘制需要很长时间)。

这些是它所涉及的代码部分:

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

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

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

提前致谢,

斯凯菲。

4

3 回答 3

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)
    }
);
于 2010-10-31T14:15:50.980 回答
0

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

于 2010-10-31T16:05:26.230 回答
0

在 swing 和 awt 中,所有事件(鼠标、键盘)和绘画都发生在同一个线程中。当您调用 repaint 时,您向该线程提交了一个新作业,这实际上最终会调用paint。如果绘制函数花费的时间太长,那么该线程(AWT 事件队列线程)就会变得太忙而无法处理鼠标事件并且您会看到延迟。您描述的闪烁问题也表明绘制功能缓慢。

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

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

于 2010-10-31T16:20:42.017 回答