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