如何解决如何从事件处理程序向 Java FX 主线程发送信号?
我正在开发一个国际象棋游戏应用程序,我决定让主游戏循环等待用户选择一个字段。为此,我创建了一个 java.util.concurrent.locks.Condition
对象,主应用程序线程在该对象上等待,一旦用户单击某处,事件处理程序就会发出信号。
然而,点击处理程序永远不会运行,因此,整个程序都被冻结,因为条件永远不会发出信号。有没有办法确保处理程序运行,或者在主线程等待某个条件时不检查事件?
(几乎)最小的例子:
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.util.concurrent.locks.*;
public class EventHandlerLockExample extends Application {
public static final Lock lock = new ReentrantLock();
public static final Condition availableClick = lock.newCondition();
public static int x,y;
@Override
public void start(Stage primaryStage) throws InterruptedException{
Canvas can = new Canvas(128,128);
Scene scene = new Scene(new Group(can));
scene.setOnMouseClicked(event -> {
lock.lock();
try{
x = (int) event.getSceneX();
y = (int) event.getSceneY();
availableClick.signal();
}finally{
lock.unlock();
}
});
primaryStage.setTitle("Chess Game");
primaryStage.setScene(scene);
primaryStage.show();
lock.lock();
try{
availableClick.await();
can.getGraphicsContext2D().setFill(Color.RED);
can.getGraphicsContext2D().fillOval(x,y,5,5);
System.out.printf("Click[x=%d,y=%d]%n",x,y);
}finally{
lock.unlock();
}
}
public static void main(String[] args){
launch(args);
}
}
解决方法
我建议您使用多线程将 UI、计算机和播放器分开。
如果您暂停其线程,JavaFX GUI 将被冻结并可能导致问题(例如侦听点击),因此我要做的是为计算机播放器创建一个线程并为实际播放器创建一个线程。这样您就可以根据需要锁定/解锁这些线程,并且 GUI 不会被冻结。
要实现多线程,您可以使用以下代码:
private ScheduledExecutorService scheduledExS;
private ScheduledFuture<?> scheduled;
/* Start thread to periodically execute getData() with 0ms starting delay every 500ms */
scheduledExS = Executors.newScheduledThreadPool(1);
scheduled = scheduledExS.scheduleAtFixedRate(getData,500,TimeUnit.MILLISECONDS);
/* Stop thread when finished */
scheduledExS.shutdownNow();
其中 getData
是一个可运行的函数
Runnable getData = () -> { /* Do something */ };
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。