Я хочу создать vbox сообщений из входного потока с сервера - PullRequest
0 голосов
/ 06 апреля 2019

Я создаю своеобразное чат-приложение, и оно связывает множество клиентов, и я хочу сделать в чате VBox, но поскольку JAvaFX не позволяет использовать многопоточность, я не могу просто получить информацию из другого потока, поэтому я использую что-то подобное. recived.textProperty () связываются (task.messageProperty ());и это меняет только одну метку, но я хочу создать метки прокрутки, чтобы показать все сообщения до

Task task= new Task(){

                @Override
                protected Object call() throws Exception {

                while(true) {
                    str2 = null;
                    str2 = ClietnGui.input.readLine();
                    System.out.println(str2);
                   if(str2==null||str2.equals("")||str2.equals(" ")) continue;
                   updateMessage(str2);
                }
            }

        };
            recived.textProperty().bind(task.messageProperty());

        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();

, и я хочу создать множество сообщений, используя это]

private void createChildElement(String name){

        FXMLLoader loader =  new FXMLLoader(getClass().getResource("message.fxml"));
        UserControl  user = new UserControl(name);
        loader.setController(user);
        Pane pane = null;
        try{
            pane=loader.load();
            listofelementes.getChildren().add(pane);

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

, но яне могу поставить в задачу, пока цикл, и я не могу поместить в этот метод любой привязки

Я хочу просто прокрутить сообщения в чате

1 Ответ

0 голосов
/ 06 апреля 2019

Представьте простую модель для инкапсуляции данных, необходимых представлению (для хранения текста сообщений):

class Model {

    private final ObservableList<String> list;

    Model(){
        list = FXCollections.observableArrayList();
    }

    void addMessage(String msg){
        list.add(msg);
    }

    ObservableList<String> getMessages(){
        return list;
    }
}

Если вам нужно использовать более одного потока, сделайте Model потокобезопасным.

Используйте поток, чтобы обновить модель и отобразить ее содержимое, используя ListView:

import java.util.List;
import java.util.concurrent.TimeUnit;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.ListChangeListener;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class FxMain extends Application {

    private Model model;
    private ListView<Node>listView;

    private int counter = 0;

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

        model = new Model();
        //listen to changes in model, and respond
        model.getMessages().addListener(
                                (ListChangeListener<String>) c -> {
                                    c.next();
                                    createChildElement(c.getAddedSubList());
                                }
                            );

        //list view to display messages
        listView = new ListView<>();

        //button to fire thread
        Button start = new Button("Start");
        start.setOnAction(e-> {
            addMessages();
            start.setDisable(true);
        });

        BorderPane root = new BorderPane(listView);
        root.setBottom(start);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    //continuously update model using thread 
    private void addMessages() {

        Thread thread = new Thread(()->{
            while(true) {
                while(true){
                      Platform.runLater(() -> model.addMessage("message number "+ counter++));
                    try {
                        TimeUnit.MILLISECONDS.sleep(500);
                    } catch (InterruptedException ex) { ex.printStackTrace();   }
                }
            }
        });
        thread.setDaemon(true);
        thread.start();
    }

    private void createChildElement(List<? extends String> list){

        for(String msg : list){
            Pane pane = new Pane(new Label(msg)); //use fxml to construct pane 
            listView.getItems().add(pane);
        }
    }

    public static void main(final String[] args) {
        launch(args);
    }
}

enter image description here

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