Ich habe eine GUI zu meiner Client-Anwendung hinzugefügt und versucht, die Socket-Nachrichten an sie weiterzuleiten. Ich verspottete den Client, um ein Singleton bis jetzt zu sein, , so dass ich es von der Application
Thread, zugreifen konnte, aber jetzt möchte ich mehrere Clients auf ihre GUI zugreifen. Ich weiß fxml
hat Eigenschaft Listener aber gebunden Ich will es so einfach wie möglich. Um direkt mit den Threads zu arbeiten. Wie würde ich machen Platform.runLater()
Referenz Szene Instanz, wenn Application.launch()
Konstrukte eigene? Ich habe ziemlich ausführlich gelesen, aber Lösungen überall entpuppen sich, eine fxml
Schnittstelle zu hebeln, die die Arbeit überspringt, die ich nicht mögen würde. Control-Klasse (vereinfacht, die Ausgabe auf der Leitung 9):Ändern JavaFX-Anwendungsszene aus anderen Thread?
public class Client {
private Socket socket = new Socket("127.0.0.1",4444);
private BufferedReader incoming = new BufferedReader(new InputStreamReader(socket.getInputStream()));
private Browser browser = new Browser();
public static void main(String[] arguments) throws IOException {
Application.launch(browser.class);
while(socket.isConnected()) {
Platform.runLater(new Runnable(){
@Override public void run(){
try{browser.bubble(incoming.readLine());}
catch(IOException fail){fail.printStackTrace();}
}
});
}
}
}
Benutzeroberfläche (vereinfacht):
public class Browser extends Application {
private Stage stage;
private Scene scene;
private BorderPane layout = new BorderPane();
private VBox history = new VBox();
@Override public void start(Stage stage) throws Exception {
layout.setCenter(history);
scene = new Scene(layout);
stage = stage;
stage.setScene(scene);
stage.show();
}
public void bubble(String message){
VBox record = new VBox();
Label label = new Label(message);
record.getChildren().add(label);
history.getChildren().add(record);
}
}
In der überwiegenden Mehrheit der Fälle sollten Sie 'Application.launch()' nicht von irgendwo aufrufen, außer einer Hauptmethode, und sollten nichts anderes in der Hauptmethode tun. Mach das anders herum; I.e. Erstellen Sie Ihre 'Client'-Instanz von Ihrer' start() 'Methode und rufen Sie die Methode auf, die den von Ihnen geposteten Code enthält (in einem Hintergrundthread). Sie haben weiterhin Threading-Probleme - Sie blockieren den fx-Anwendungsthread mit dem 'readLine()' -Aufruf. –
Ja, tut mir leid, ich habe vergessen, die psvm-Methode zu integrieren, korrigiert. Ich mag die Prinzipien, die Du zeichnest, nichts anderes in der Hauptmethode und instanziierst von der Anwendung ... Das Versenden dieser Instanz an einen dritten Thread könnte das Blockierungsproblem ebenso lösen, könnte es nicht ... Ich werde wahrscheinlich auf diese Weise gehen. – bpstrngr