从另一个线程访问JavaFX gui按钮操作

从另一个线程访问JavaFX gui按钮操作,java,multithreading,button,javafx-2,javafx,Java,Multithreading,Button,Javafx 2,Javafx,我正在从另一个类启动JavaFXGUI应用程序,即StartClient 公共类StartClient扩展应用程序{ 专用表gui; @凌驾 public void start(Stage)引发异常{ gui=新表(); gui.启动(阶段); 我启动一个任务,通过该任务连接到服务器并接收服务器分配的轮次,我使用平台在gui中设置轮次。稍后运行 Task Task=新任务(){ @凌驾 受保护的Void调用()引发异常{ connectToServer();//连接到服务器,设置套接字,i/

我正在从另一个类启动JavaFXGUI应用程序,即
StartClient

公共类StartClient扩展应用程序{
专用表gui;
@凌驾
public void start(Stage)引发异常{
gui=新表();
gui.启动(阶段);
我启动一个
任务
,通过该任务连接到服务器并接收服务器分配的轮次,我使用
平台在gui中设置轮次。稍后运行

Task Task=新任务(){
@凌驾
受保护的Void调用()引发异常{
connectToServer();//连接到服务器,设置套接字,i/o流
对象读取=inputStream.readObject();
如果(读取字符串的实例){
turn=//parseInt from read
Platform.runLater(新的Runnable(){
公开募捐{
gui.setPlayerID(turn);
}
});
}
}
};//任务结束
我的问题是,如果轮到玩家,我想让玩家移动,然后将其发送回服务器,执行如下操作:

if(networkClientID == gui.getState().getTurn()){
    do {
        action = Table.getAction(); //static getAction returns the move from the table if there was one
    } while (action == -1);

    outputStream.writeObject(action + ""); // write out turn
}
我是否在后台
线程中执行此操作(我正在从gui读取静态变量,还是应该在javaFX线程中执行此操作,即在
平台中执行此操作。runLater
,我已经尝试过,但没有成功,我的程序卡住了。)


任何关于如何解决此问题的建议、帮助、建议欢迎。谢谢!

我认为最好的方法是将您的数据(即:回合数)放在单独的班级中

记住JavaFX是一个MVC模型。您可以使用模型类来保存此信息并引用此信息。如果要将对模型类的引用传递给另一个线程,则必须同步此引用

这样你就可以把事情分开。你的控制器将只控制场景在做什么。你的模型将存储信息

为如何实现这一点提供了一个很好的起点

例如,我有一个任务(文件监视程序),我按如下所示调用它。下面是我的控制器的快速快照:

public class myController {
    private Context context;
    private Executor executor;

    ...

    myBtn.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent event) {
            task = new ResultFileWatcher(context);  //context is my singleton model class
            executor.execute(task);
        }
    }

    ...

}

希望这有帮助!

我认为最好的方法是将你的数据(即:回合数)放在一个单独的类中

记住JavaFX是一个MVC模型。您可以使用模型类来保存此信息并引用此信息。如果要将对模型类的引用传递给另一个线程,则必须同步此引用

这样你就可以把事情分开。你的控制器将只控制场景在做什么。你的模型将存储信息

为如何实现这一点提供了一个很好的起点

例如,我有一个任务(文件监视程序),我按如下所示调用它。下面是我的控制器的快速快照:

public class myController {
    private Context context;
    private Executor executor;

    ...

    myBtn.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent event) {
            task = new ResultFileWatcher(context);  //context is my singleton model class
            executor.execute(task);
        }
    }

    ...

}

希望这能有所帮助!

非常感谢您的回复。我会试一试。@blo0p3rCan我也可以实现MVC模型,即使我没有FXML。我只是通过扩展应用程序来创建JavaFX gui。ResultFileWatcher是控制器吗?我有点困惑。或者它只是侦听更改的任务。是的,您仍然可以实现tMVC模型,即使您不使用FXML。在这种情况下,行可能会变得有点模糊,因为分离代码有点困难,但它是可以做到的。
ResultFileWatcher
只是我对
任务的实现。
我将更新答案以更好地显示这一点。非常感谢您的帮助。我现在已经实现了该控件ler类,它工作起来很有魅力。非常感谢你的回复。我会试一试。@blo0p3rCan我也可以实现MVC模型,即使我没有FXML。我只是通过扩展应用程序来创建JavaFXGUI。ResultFileWatcher是控制器吗?我有点困惑。或者它只是侦听更改的任务。是的,你仍然可以即使不使用FXML,也要实现MVC模型。在这种情况下,行可能会变得更模糊,因为分离代码有点困难,但它是可以做到的。
ResultFileWatcher
只是我对
任务
的实现。我将更新答案以更好地显示这一点。非常感谢你的帮助。我现在已经实现了t控制器类,它的工作方式很有魅力。