Как добавить AnchorPane в VBox из другого потока? - PullRequest
0 голосов
/ 31 декабря 2018

У меня проблема.У меня есть поток, который ожидает входящего сообщения из сокета:

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class Receiver implements Runnable {

    private Socket socket;
    private Thread thread;

    public Receiver(Socket socket){
        this.socket = socket;
        thread = new Thread(this, "Receiver");
        thread.start();
    }

    @Override
    public void run() {
        System.out.println("trfam ja, RECIVER");
        while(true) {
            try {
                DataInputStream input = new DataInputStream(socket.getInputStream());
                System.out.println(input.readUTF());

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

, и я хочу добавить поток AnchorPane сверху VBox, который находится в основном потоке JavaFX, но я не могу, потому что у меня естьошибка.Как решить мою проблему?Я слышал о Хронологии и Задачах, но не могу ее реализовать.Спасибо за помощь.

1 Ответ

0 голосов
/ 31 декабря 2018

Я сделал что-то подобное: Приемник:

package logic;

import window.classes.Window;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;

public class Receiver implements Runnable {

    private Socket socket;
    private Thread thread;
    private Window window;

    public Receiver(Socket socket, Window window) {
        this.window = window;
        this.socket = socket;
        thread = new Thread(this, "Receiver");
        thread.start();
    }

    @Override
    public void run() {
        System.out.println("trfam ja, RECIVER");
        while(true) {
            try {
                if (socket.isConnected() && socket.getKeepAlive()) {
                    try {
                        DataInputStream input = new DataInputStream(socket.getInputStream());
                        String inputString = input.readUTF();
                        window.setSomebodysMessageString(inputString);
                        window.startThread();

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } catch (SocketException e) {
                e.printStackTrace();
            }
        }
    }
}

И основной поток JavaFX:

    package window.classes;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import logic.Receiver;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Window extends Application {

    private Socket socket;
    private String somebodysMessageString = "";

    @FXML
    private VBox vBoxLeftPanel;

    @FXML
    private Button buttonSend;

    @FXML
    private TextField textFieldForWriteMessages;

    @FXML
    private VBox vBoxForMessages;

    @FXML
    private void messageSent(ActionEvent event) throws IOException {
        if (!textFieldForWriteMessages.getText().replaceAll(" ", "").equals("") &&
                socket.isConnected()) {
            String message = textFieldForWriteMessages.getText();
            MyMessage myMessage = new MyMessage(message);

            FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/window/fxmls/myMessage.fxml"));
            loader.setController(myMessage);
            AnchorPane anchorPane = loader.load();
            vBoxForMessages.getChildren().add(anchorPane);
            myMessage.setText(message);
            textFieldForWriteMessages.setText("");

            DataOutputStream output = new DataOutputStream(socket.getOutputStream());
            output.writeUTF(message);
        }
    }



    @Override
    public void start(Stage primaryStage) throws Exception {
        socket = new Socket("localhost", 9999);
        Receiver receiver = new Receiver(socket, this);

        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/window/fxmls/window.fxml"));
        loader.setController(this);
        AnchorPane anchorPane = loader.load();
        Scene scene = new Scene(anchorPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public void startThread() {
        ReceiverThread receivierThread = new ReceiverThread();
    }

    public void setSomebodysMessageString(String somebodysMessageString) {
        this.somebodysMessageString = somebodysMessageString;
    }



    protected class ReceiverThread {
        protected ReceiverThread() {
            Thread thread = new Thread(new Runnable() {
                @Override public void run() {
                    Platform.runLater(new Runnable() {
                        @Override public void run() {
                            SomebodysMessage somebodysMessage= new SomebodysMessage(somebodysMessageString);

                            FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/window/fxmls/somebodysMessage.fxml"));
                            loader.setController(somebodysMessage);
                            AnchorPane anchorPane = null;
                            try {
                                anchorPane = loader.load();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            vBoxForMessages.getChildren().add(anchorPane);
                            somebodysMessage.setText(somebodysMessageString);
                            textFieldForWriteMessages.setText("");
                        }
                    });
                }
            });
            thread.start();
        }
    }
}

и все работает.

Как проверить это сокетсоединение с сервером?Этот метод возвращает true при подключении сокета и false при отключении сокета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...