我试图在每次移动鼠标时重新绘制我的java应用程序,以便当用户移动到图表上时更新屏幕( - >显示图表的名称)以及当用户不移动时图表( - >不显示图表的任何名称)。但是这会在运行应用程序时造成很大的延迟(我看到屏幕被重新绘制得非常缓慢,滞后,屏幕在重新绘制之前每次都是白色空白;需要很长时间才能重新绘制)。
这些是代码的部分内容:
public void mouseMoved(MouseEvent e) {
this.checkDiagramHovered(e.getX(),e.getY());
}
调用一个函数来检查图表是否悬停并设置变量是否图表是否悬停,如果是这样的话:哪个图表悬停(要显示的名称,要做的x和y位置)然后重新绘制应用程序。因此,每次进行鼠标移动时,它都会基本重新绘制应用程序,以确保仅在用户移动时显示图表的名称。但是这会导致屏幕滞后很多,不连贯的重新粉刷。
现在我想知道:解决这个问题的最佳方法是什么?我是否应该实施某种延迟来检查鼠标移动或者是否可以做到这一点?
提前致谢,
Skyfe。
答案 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()
立即绘制整个图像。