Olá. Neste tópico eu não gostaria de resolver um problema em específico, mas sim entender melhor o que está acontecendo por trás dos panos no meu projeto. Eu encontrei MUITAS exceções dizendo coisas do tipo: java.lang.IllegalStateException: Not on FX application thread;. Bem, essa exceção em particular já é auto explicativa, eu estou tentando alterar algo a partir de outra Thread. Porém eu não posso evitar isso. Mas eu me deparei com outras exceções também. E resolvi todas elas simplesmente colocando o código dentro dessa estrutura:
Platform.runLater(() -> {
});
Porém agora eu venho notando que muitos dos códigos que ficam dentro dessa estrutura demoram muito para ser executados ou até mesmo não são executados. E neste tópico eu gostaria de saber se alguém aqui sabe me explicar isso?
Editado
Eu citei o problema e citei também o que eu acho que está acontecendo. Bem, isso acontece em várias partes do meu programa, mas eu acho que mesmo assim vale a pena postar as partes do código aqui.
Problema 1:
Platform.runLater(() ->{
final HBox h = new HBox();
h.setAlignment(Pos.CENTER_LEFT);
h.getChildren().add(icon);
h.getChildren().add(new Label("Message"));
if(!alwaysOnTop){
AnchorPane anch = new AnchorPane();
Button bt = new Button();
bt.setGraphic(new ImageView(new Image(getClass().getResourceAsStream("/icons/cancel.png"))));
bt.setOnAction((ActionEvent) ->{
FadeOutLeftTransition f = new FadeOutLeftTransition(h);
f.play();
f.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(javafx.event.ActionEvent arg0) {
desktop.getChildren().remove(h);
}
});
});
bt.getStyleClass().add("button-with-icon");
anch.getChildren().add(bt);
anch.setRightAnchor(bt, 0.14);
anch.setTopAnchor(bt, 0.14);
h.getChildren().add(anch);
}
h.getStyleClass().add("notification");
h.setAlignment(Pos.CENTER_LEFT);
HBox.setHgrow(h.getChildren().get(0), Priority.SOMETIMES);
HBox.setHgrow(h.getChildren().get(1), Priority.ALWAYS);
if(!alwaysOnTop){
HBox.setHgrow(h.getChildren().get(2), Priority.SOMETIMES);
}
});
Problema 2
ActionListener a = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
switch(e.getActionCommand()){
case "Não perturbe":
Services.DO_NOT_DISTURB.set(!Services.DO_NOT_DISTURB.get());
break;
case "Desabilitar segundo plano":
setTrayIconEnabled(false);
tray.remove(trayIcon);
Save();
break;
case "Abrir janela":
try{
Platform.runLater(() ->{
System.out.println("Abrindo janela");
Start.m.show();
});
}catch(IllegalStateException ex){
ex.printStackTrace();
}
break;
case "Encerrar sessão":
Methods.logout();
break;
case "Sair":
System.exit(0);
}
}
};
Obs: Caso seja necessário, o objeto Start.m é da classe MainWindow
Problema 3
public static void logout(){
Platform.runLater(() ->{
Start.m.Close();
File f = new File(Methods.MakeProgramFolder().getAbsolutePath()+"/user.dat");
f.delete();
System.gc();
new Login().show();
});
}
Problema 4
public void addItem(long id, String title, String date, boolean constant, ArrayList<String> itens){
EvtItem child = new EvtItem(id, title, date, constant, itens);
System.out.println("Date: "+date);
System.out.println(date.substring(0,3));
String[] split = date.split("/");
child.setYear(Integer.parseInt(split[2]));
child.setMonth(Integer.parseInt(split[1]));
child.setDay(Integer.parseInt(split[0]));
if(!Methods.ArrayListContains(this.itens, child)){
this.itens.add(child);
Platform.runLater(() ->{
getChildren().add(child);
});
}
}
Problema 5
public void clear(){
itens.clear();
Platform.runLater(() ->{
getChildren().clear();
});
}
Obs: itens é um ArrayList
Problema 6
Button bt = new Button("Fazer");
bt.setOnAction((ActionEvent) -> {
Platform.runLater(() ->{
try {
ItemDAO.doEvent(idEvt);
} catch (SQLException e) {
e.printStackTrace();
}
((VBox)this.getParent()).getChildren().remove(this);
});
});