【发布时间】:2020-10-05 18:38:10
【问题描述】:
我想更改标签的文本,而不是从我声明控制器的类更改为 fxml 文件。
我想在主文件的 ClientAccept 类中更改它,但是当我尝试从 ClientAccept 获取 Controller 类并在 Controller 类中运行函数时,我得到 NullPointerException '因为“this.sStatus”为空'。我解决不了。
Main.java:
package sample;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.stage.Stage;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
public class Main extends Application {
ServerSocket ss;
HashMap clientColl = new HashMap();
@Override
public void start(Stage stage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Controller controller = new Controller();
loader.setController(controller);
Parent parent = loader.load();
Scene scene = new Scene(parent);
stage.setScene(scene);
stage.show();
try{
ss = new ServerSocket(8989);
}catch (IOException ioe){
System.out.println(ioe.getMessage());
}
ClientAccept cla = new ClientAccept();
cla.isWorking();
}
public static void main(String[] args) {
launch(args);
}
class ClientAccept extends Thread{
public void isWorking() throws IOException {
Controller controller = new Controller();
controller.setsStatus("test");
}
public void run(){
while(true){
try {
Socket s = ss.accept();
String i = new DataInputStream(s.getInputStream()).readUTF();
if(clientColl.containsKey(i)){
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF("Już jesteś Zarejestrowany");
}else {
clientColl.put(i, s);
Platform.runLater(()->{
controller.setsStatus("TextToLabel");
});
}
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
}
}
Controller.java:
package sample;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
public class Controller {
@FXML
Label sStatus;
@FXML
TextArea msgBox;
void setsStatus(String text){
sStatus.setText(text);
System.out.println(text);
}
}
sample.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TextArea fx:id="msgBox" layoutX="53.0" layoutY="67.0" prefHeight="278.0" prefWidth="512.0" />
<Label layoutX="67.0" layoutY="28.0" text="Server Status: " />
<Label fx:id="sStatus" layoutX="142.0" layoutY="28.0" text=".............." />
</children>
</AnchorPane>
我刚刚得到 NullPointerException。
【问题讨论】:
-
您需要在传递给
FXMLLoader的同一个Controller实例上调用该方法,而不是在新实例上。 -
但是我需要像我之前粘贴的那样做。有什么方法可以做到吗?
-
对不起,我不明白那个评论。正如我之前所说,只需调用您传递给
FXMLLoader的控制器实例上的方法。显然标签不会在你创建的新实例中初始化。