Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ObjectOutputStream在PlayerList.java中不可用-无法获取表的数据_Java_Multithreading_Networking_Javafx 8_Scenebuilder - Fatal编程技术网

ObjectOutputStream在PlayerList.java中不可用-无法获取表的数据

ObjectOutputStream在PlayerList.java中不可用-无法获取表的数据,java,multithreading,networking,javafx-8,scenebuilder,Java,Multithreading,Networking,Javafx 8,Scenebuilder,好的,再说一遍。这里有一个新的项目和相关的代码。正如您在textfield中看到的,即使initData应该初始化testVar变量,它也不会发生,并且initialize()中的变量为null。不过,我需要在那里获取变量,这样我就可以将网络连接中的数据获取到表中。代码如下: FXMLController.java: package de.freakyonline.testproject; import java.net.URL; import java.util.ResourceBundle

好的,再说一遍。这里有一个新的项目和相关的代码。正如您在textfield中看到的,即使initData应该初始化testVar变量,它也不会发生,并且initialize()中的变量为null。不过,我需要在那里获取变量,这样我就可以将网络连接中的数据获取到表中。代码如下:

FXMLController.java:

package de.freakyonline.testproject;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;

public class FXMLController implements Initializable {
    String testVar;

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private TextArea testTextArea;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
    // Here it's null    
        testTextArea.appendText("TestVar: " + testVar);

    }

    void initData(Remote remoteObj) {
        this.testVar = remoteObj.getVar();
    }    
}
MainApp.java:

package de.freakyonline.testproject;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class MainApp extends Application {
    Thread remote;
    Remote remoteObj;

    String testVar = new String("success");

    @Override
    public void start(Stage stage) throws Exception {

        FXMLLoader root = new FXMLLoader(
            getClass().getResource("/fxml/Scene.fxml")
        );

        try {
            remoteObj = new Remote(testVar);
            remote = new Thread(remoteObj);
        } catch (Exception ex) { ex.printStackTrace(); }
        remote.start();

        Scene scene = new Scene((Parent) root.load());
        FXMLController controller = root.<FXMLController>getController(); 
        controller.initData(remoteObj);

        scene.getStylesheets().add("/styles/Styles.css");

        stage.setTitle("TestProjects ...");
        stage.setScene(scene);
        stage.show();


    }

    /**
     * The main() method is ignored in correctly deployed JavaFX application.
     * main() serves only as fallback in case the application can not be
     * launched through deployment artifacts, e.g., in IDEs with limited FX
     * support. NetBeans ignores main().
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

加载FXML时,
FXMLLoader
调用控制器的
initialize()
方法,即在调用
load()
期间调用该方法。在示例代码中,在调用
load()
之后调用
initData()
,因此执行
initialize()
方法时,显然无法初始化
testVar
。由于示例代码中的控制器是由
fxmloader
创建的,因此在调用
initialize()
之前不能调用
initData(…)

(旁白:使用一些简单的调试技术,例如使用逐步调试程序,甚至在调用每个方法时只打印一条消息,都可以清楚地说明问题所在。)

最简单的修复方法是将依赖于
testVar
的代码移动到
initData()
方法(或在
testVar
初始化后调用的其他方法):


这里的一个小缺点是控制器的初始化分散在多个方法上,在控制器生命周期的不同点执行。其他选项包括在代码中设置控制器,而不是在FXML文件中指定控制器类,或使用控制器工厂。在代码中设置控制器的缺点是,如果使用工具(如场景生成器)设计FXML,它将不知道正在使用的控制器类。使用控制器工厂更复杂,但可以避免此问题。

加载FXML时,
FXMLLoader
调用控制器的
initialize()
方法,即在调用
load()
期间调用该方法。在示例代码中,在调用
load()
之后调用
initData()
,因此执行
initialize()
方法时,显然无法初始化
testVar
。由于示例代码中的控制器是由
fxmloader
创建的,因此在调用
initialize()
之前不能调用
initData(…)

(旁白:使用一些简单的调试技术,例如使用逐步调试程序,甚至在调用每个方法时只打印一条消息,都可以清楚地说明问题所在。)

最简单的修复方法是将依赖于
testVar
的代码移动到
initData()
方法(或在
testVar
初始化后调用的其他方法):


这里的一个小缺点是控制器的初始化分散在多个方法上,在控制器生命周期的不同点执行。其他选项包括在代码中设置控制器,而不是在FXML文件中指定控制器类,或使用控制器工厂。在代码中设置控制器的缺点是,如果使用工具(如场景生成器)设计FXML,它将不知道正在使用的控制器类。使用控制器工厂更为复杂,但可以避免此问题。

请将代码缩减到相关部分,因为没有人想阅读codedone:)谢谢。请尝试反向跟踪它的哪一点为空。您的代码太多了,没有足够的代码让任何人真正理解正在发生的事情。您应该尝试创建一个新的。(请阅读链接并理解它所说的内容。)这通常意味着从头开始创建一个新项目,该项目只包含您试图解决的问题的特征。您不断地说“不可用”,好像它意味着什么。没有。您的问题是什么?请将代码缩减到相关部分,因为没有人想阅读codedone:)谢谢。请尝试反向跟踪它上的哪一点是空的,因为您的代码太多了,没有足够的代码让任何人真正理解正在发生的事情。您应该尝试创建一个新的。(请阅读链接并理解它所说的内容。)这通常意味着从头开始创建一个新项目,该项目只包含您试图解决的问题的特征。您不断地说“不可用”,好像它意味着什么。没有。你的问题是什么?
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.freakyonline.testproject.FXMLController">
   <center>
      <TextArea fx:id="testTextArea" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </center>
</BorderPane>
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package de.freakyonline.testproject;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 *
 * @author uwe
 */
public class Remote implements Runnable {
    private String testVar;

    public Remote (String testVar) {
        this.testVar = testVar;
    }

    public String getVar() {
        return testVar;
    }

    public void run() {
    }
}
public class FXMLController implements Initializable {
    String testVar;

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private TextArea testTextArea;

    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }

    void initData(Remote remoteObj) {
        this.testVar = remoteObj.getVar();
        testTextArea.appendText("TestVar: " + testVar);
    }    
}