Cześć!
Piszę projekt zaliczeniowy na uczelnie, w skrocie gre w oczko online. W prywatnej klasie klient chce dodac do jednego z HBox-ów element. Problem z tym jest taki, że javafx wyrzuca błąd java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-5. Przeszukując internet jedyne rozwiązanie jakie znalazłem to uzycie Platform.runLater. Jednak jak wrzuce w tą funkcje pogrubioną linijke:
Platform.runLater(new Runnable() {
@Override public void run() {
**kartyGracza.getChildren().addAll(talia.rysujKarte(indexKarty));**
}
});
to przy jej wykonaniu okienko się freezuje i jest "not responding". Rownież niektórym na stacku pomagało dopisanie do kodu "Platform.setImplicitExit(false);" jednak u mnie to nic nie zmienia. Cały dzień się męcze z tym problemem. Próbowałem modyfikować program tak aby nie musieć w ten sposób dodawać elementu do tego boxa jednak nie obejdę się bez tego i stoję w miejscu. Jak mogę rozwiązać ten problem?
Poniżej znajduje się "skrócony kod".
public class Lobby extends Application {
HBox kartyGracza = new HBox(20);
...
private class Klient extends Thread {
private Scanner in ;
private PrintWriter out;
private String line;
private Socket socket;
public Klient(Socket socket) {
this.socket = socket;
}
@Override
public void run(){
try {
in = new Scanner(socket.getInputStream());
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
while (czyPolaczony) {
if ( in .hasNextLine()) {
line = in .nextLine();
if (line.startsWith(ChatProtocol.KLIENT_RYSUJ_KARTE_COMMAND.toString())) {
indexKarty = Integer.parseInt(line.substring(ChatProtocol.KLIENT_RYSUJ_KARTE_COMMAND.toString().length()));
**kartyGracza.getChildren().addAll(talia.rysujKarte(indexKarty));**
}
}
}
} catch (IOException ex) {
Logger.getLogger(LobbyKlient.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}