делаю чат на java, но столкнулся с ошибкой и не понимаю, как ее решить.
Ошибка:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at sample.ClientServer.lambda$run$0(ClientServer.java:25)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:835)
Я получаю на сервер сообщение, которое должен распечатать в TextArea
, но получаю ошибку NullPointerException
при попытке вывода текста в TextArea
с помощью TextArea.appendText(msg)
.
Код сервера:
package sample;
import javafx.fxml.FXMLLoader;
import javafx.scene.text.Text;
import sample.Controller;
import sample.chatcontroller;
import javafx.application.Platform;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
class ClientServer extends chatcontroller implements Runnable {
@Override
public void run() {
FXMLLoader loader = new FXMLLoader();
chatcontroller ctrl = loader.getController();
while (true) {
try (ServerSocket serverSocket = new ServerSocket(ClientPort)) {
Socket socket = serverSocket.accept();
Scanner scanner = new Scanner(socket.getInputStream());
ServerPort = Integer.parseInt(scanner.nextLine());
String msg = scanner.nextLine();
Platform.runLater(()->ctrl.TextArea.appendText(msg)); //тут ошибка
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Код от Controller.java
package sample;
public class chatcontroller{
public static String name = "client";
public static int ClientPort = 6777;
public static int ServerPort = 7777;
@FXML
private TextField messagefield;
@FXML
private Button sendbutton;
@FXML
private Button exitbutton;
@FXML
private Button configbutton;
@FXML
private Button onlyadminbutton;
@FXML
public TextArea TextArea;
@FXML
void initialize() {
new Thread(new ClientServer()).start();
exitbutton.setOnAction(event -> {
exitbutton.getScene().getWindow().hide();
FXMLLoader loader1 = new FXMLLoader(); //выход из чата
loader1.setLocation(getClass().getResource("sample.fxml"));
try {
loader1.load();
} catch (IOException e) {
e.printStackTrace();
}
Parent root1 = loader1.getRoot();
Stage stage1 = new Stage();
stage1.setScene(new Scene(root1));
stage1.showAndWait();
});
sendbutton.setOnAction(e -> {
String input = messagefield.getText();
if (!input.isEmpty()) {
SendMSG(input);
Platform.runLater(()->TextArea.appendText("Пользователь " + name + " написал " + input + "\n"));
messagefield.clear();
}
});
}
}
Код chat.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.chatcontroller">
<children>
<TextField fx:id="messagefield" layoutX="25.0" layoutY="332.0" prefHeight="26.0" prefWidth="457.0" promptText="Введите ваше сообщение" />
<Button fx:id="sendbutton" layoutX="503.0" layoutY="332.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="71.0" text="Send" />
<Text layoutX="257.0" layoutY="40.0" strokeType="OUTSIDE" strokeWidth="0.0" text="AMchat">
<font>
<Font size="24.0" />
</font>
</Text>
<Button fx:id="exitbutton" layoutX="221.0" layoutY="367.0" mnemonicParsing="false" text="Exit" />
<Button fx:id="configbutton" layoutX="25.0" layoutY="367.0" mnemonicParsing="false" text="Configuration" />
<Button fx:id="onlyadminbutton" layoutX="129.0" layoutY="367.0" mnemonicParsing="false" text="Only Admin" />
<TextArea fx:id="TextArea" editable="false" layoutX="29.0" layoutY="46.0" prefHeight="280.0" prefWidth="546.0" />
</children>
</AnchorPane>
Решение проблемы - передать контроллер классу сервера,
static Chatcontroller ccr;
initialize()
у контроллера, передать контроллер через класс ClientServer.ccr = this
ccr.textarea.appendText(msg);
Спасибо пользователю @PerfectVoyage за решение проблемы.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В флекс каталоге есть меню и товары, как закрепить меню в правом верхнем углу так, чтобы товары обтекали его слева и снизу? https://jsfiddlenet/4roj2ced/
Есть текст на странице, у него opacity стоит 0, и как только пользователь его увидит (к примеру прокрутит страницу) то у него должна стать opacity 1 с неким...