我试图在控制器类中使用此代码创建一个跟踪鼠标移动的JavaFX应用程序:
new Thread(new Runnable() {
@Override public void run() {
while (Main.running) {
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
label.setText(MouseInfo.getPointerInfo().getLocation().toString());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}).start();
但它使我的申请延迟了很长时间。 我该如何解决这个滞后问题?
谢谢我修好了:
new Thread(new Runnable() {
@Override public void run() {
while (Main.running) {
Platform.runLater(new Runnable() {
@Override
public void run() {
label.setText(MouseInfo.getPointerInfo().getLocation().toString());
}
});
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
答案 0 :(得分:2)
您正在做的是让Javafx应用程序线程Thread.sleep(1000);
< -wait
任何长期行动你都应该放弃JFX-AT。并且只更新你的ui组件。
new Thread(()->{
while(Main.running){
Platform.runLater(()->{
//updateui component
//this is updating on FXAT
});
Thread.sleep(time)//This way you dont let JFXAT wait
}
}).start();
//不确定格式化和花括号是否正确。希望你能理解。确定你知道哪个线程让你等待。否则你将无法接收暂停的jfxat中的事件。
答案 1 :(得分:0)
您应该将Thread.sleep()
调用放入while循环而不是Runnable
,否则循环会不断发布大量runLater
任务,这些任务会使事件线程停止1000ms更新鼠标位置后
答案 2 :(得分:0)
您在将在UI线程上执行的Runnable中调用Thread.sleep(long)
。如果线程处于休眠状态,除了在那里睡觉之外它无法做任何事情。如果您希望标签每1000毫秒更新一次,则可以使用java.util.Timer
类来实现。