Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rafraîchir composant IHM lors d'une task JAVAFX

un peu de technique :)

Sujet résolu
Anonyme
    19 août 2015 à 13:09:24

    Bonjour à vous les zéros (si on peu encore s’appeler comme ça :p ) !

    Aujourd'hui interrogation surprise sur JavaFX ! :-°

    Ce que je remarque :

    J'ai une fenêtre créé en FXML, avec une classe qui la contrôle. J'ai remarqué que les composants ne se mettaient à jour qu'une fois que la fonction exécuté par un événement était fini. Du coup si on clique sur un bouton du type "connecter", l'interface utilisateur va se geler, le temps que toute la procédure de connexion se fasse.

    Problématique :

    Mais voilà, comment alors éviter ce freeze afin de pouvoir mettre à jour un premier label qui va rendre compte de l'état de la connexion (connection, authentification, verification des droits etc ...), ainsi qu'un deuxième label qui se mettra à jour si une erreur survient, et enfin une progressbar qui affichera l'avancement de tout ça ?

    Axes de recherches :

    J'ai essayé de manière naturelle : créer un Thread basique et mettre dans la méthode run() la procédure de connexion avec modification des labels, progressbar etc ... Mais là : Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4

    Après des recherches sur internet (ahhh, l'anglais ...), j'ai vu que l'on ne pouvais pas mettre à jour des composants IHM dans un thread différent du controller, dé-gou-té ! j'ai commencé à voir quelques infos, comme l'utilisation d'une task où on définit ce que l'on veut faire, ensuite on créé un Thread avec pour paramètre la task, et on start tout ça.

    Le truc est de faire je sais pas quoi avec une certaine méthode bind, ce qui permet de pouvoir rafraîchir le texte d'un seul label et d'une seule progressbar.  Plutôt utile, mais voilà, moi j'ai 2 labels à devoir rafraîchir, et d'ailleurs, si l'opération de connexion se passe bien je devrait alors carrément m'occuper de fermer la fenêtre de connexion pour ouvrir la fenêtre avec l'app, mais comment faire ?! 

    J'ai vraiment besoin de trouver une solution pour rafraîchir plusieurs composants de ma fenêtre car en plus dans l'app il y a une connection indéfini avec le serveur qui envoi continuellement des données, et donc je devrait faire alors un thread qui lit le buffer et rafaîchit une partie de la fenêtre et un autre qui prend en compte les commandes utilisateur pour envoyer de la data au serveur...

    Si quelqu'un a une idée, je le remercie mille fois d'avance ! Merci d'avoir lu ^^

    Code actuelle de ma fonction onClickConnect() :

    Comme vous pouvez le voir, j'utilise correctement ma méthode updateMessage(), mais je veut avoir accès à un autre label de l'IHM pour afficher le type d'erreur comme vu dans la méthode onError().

    La Task est définie à la ligne 88.

    @FXML
    	private void onConnectClick(){
    		int portToConnect, portHere;
    		InetAddress adress;
    		// on controle chaque form avant de lancer une éventuelle co
    
    		// reset des erreurs...
    		for(Label label : allLabel){
    			label.setStyle(styleNormal);
    		}		
    
    		// test de l'adresse ip valide
    		try {
    			adress = InetAddress.getByName(ipServer.getText());
    		} catch (UnknownHostException e1) {
    			infoIpServer.setStyle(styleError);
    			infoRight.setStyle(styleError);
    			infoRight.setText("Error : \n can't resolve IP");
    			return;
    		}
    
    		// test si il y a des identifiants 
    		if(user.getText().equalsIgnoreCase("") || password.getText().equalsIgnoreCase("")){
    			infoRight.setStyle(styleError);
    			infoRight.setText("You must provide creditentials.");
    			infoUser.setStyle(styleError);
    			infoPassword.setStyle(styleError);
    			return;
    		}
    
    		// test du port correct server
    		try{
    			portToConnect = Integer.parseInt(portServer.getText());
    			if(portToConnect < 1){
    				throw new NumberFormatException("numberError");
    			}
    		}catch(NumberFormatException e){
    			infoRight.setStyle(styleError);
    			if(e.getMessage().equals("numberError")){
    				infoRight.setText("Error : \n Port must be between \n 1 to 65535");	
    			}else{
    				infoRight.setText("Error : \n Port Server not a valid number.");
    			}
    			infoPortServer.setStyle(styleError);
    			return;
    		}
    		// test du port correct ici
    		try{
    			portHere = Integer.parseInt(portClient.getText());
    			if(portHere < 1){
    				throw new NumberFormatException("numberError");
    			}
    		}catch(NumberFormatException e){
    			// si c'est pas possible de convertir, c'est peut être la valeur AUTO, si non, ben on lance l'erreur;
    			if(!portClient.getText().equalsIgnoreCase("auto")){
    				infoRight.setStyle(styleError);
    				if(e.getMessage().equals("numberError")){
    					infoRight.setText("Error : \n Port must be between \n 1 to 65535");	
    				}else{
    					infoRight.setText("Error : \n Port Server not a valid number.");
    				}
    				infoPortClient.setStyle(styleError);
    				portHere = -1;
    				return;
    			}
    			else {
    				portHere = 0;
    			}
    		}
    		// ici, on change des paramètres pour que la tentative d'authentification se passe correctement;
    
    		infoRight.setText("Wait...");
    		infoLoading.setText("Connecting ...");
    		// on disable les textFields
    		for(TextField textfield : allTextField){
    			textfield.setDisable(true);
    		}
    		validate.setDisable(true);
    		advencedParam.setDisable(true);
    		indicator.setVisible(true);
    		infoLoading.setVisible(true);
    
    		//lancement de la task de connexion.
    		//ici je suis obligé de faire ça, pk ? je sais pas...
    		int portHere2 = portHere;
    		
    		// ICI COMMENCE LES ENNUIS !! xD
    		Task<Boolean> connectServerTask = new Task<Boolean>() {
    			Socket socket;
    			@Override
    			protected Boolean call() throws Exception {
    				try{
    					updateMessage("Connection ...");
    					socket = new Socket(adress.getHostAddress(), portToConnect, null, portHere2);
    					PrintWriter send = new PrintWriter(socket.getOutputStream());
    					BufferedReader read = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    					// si ce n'est pas le message d'accueil mais un autre truc ...
    					if(!read.readLine().startsWith("1-")){
    						onError("Konsole plugin not found.");
    						return false;
    					}
    					// on lance la méthode d'auth
    
    					//on récupère la version, on check si elle est compatible avec la notre.
    					String response = read.readLine();
    					if(!response.startsWith("8-")){
    						// si ce n'est pas le protocol info : 
    						onError("Protocol error. \n Try to update the client & server !");
    						return false;
    					}
    					updateMessage("Checking protocol version ...");
    					//Code enlevé car inutile
    					
    					// [...]
    
    					// a ce stade, on communique avec le même language. On a plus qu"à s'identifier !
    
    					// comme vous pouvez le constater, on peut pas modifier les composants mais on peut les lire !
    					send.println("USER " + user.getText());
    					send.flush();
    					response = read.readLine();
    					if(!response.startsWith("2-")){
    						//si on a pas "bonne réception" alors erreur
    						onError("Error : Bad reception. Try to reconnect.");
    						return false;
    					}
    
    					updateMessage("Sending creditentials ...");
    					send.println("PASSWD " + password.getText());
    					send.flush();
    					response = read.readLine();
    
    					if(!response.startsWith("2-")){
    						//si on a pas "bonne réception" alors erreur
    						onError("Error : Bad reception. Try to reconnect.");
    						return false;
    					}
    
    					send.println("VALIDATE");
    					send.flush();
    
    					response = read.readLine();
    					if(!response.startsWith("5-")){
    					// [...]
    					}
    
    					updateMessage("Getting rights ...");
    
    					response = read.readLine();
    
    					//si pas d'info, erreur de protocole normalement...
    					if(!response.startsWith("8-")){
    						onError("Error : \n Protocol error");
    						return false;
    					}
    
    					try{
    						String[] firstSpliter = response.split(":");
    						String[] secondSpliter = firstSpliter[1].split("=");
    						updateMessage(secondSpliter[0] + " | " + secondSpliter[1]);
    					}catch(NullPointerException |ArrayIndexOutOfBoundsException e){
    						onError("Error: \n Protocol error");
    						return false;
    					}
    
    					updateMessage("Connected ! ");
    					updateProgress(100.00f,100.00f);
    					indicator.setLayoutY(indicator.getLayoutY() + 10);
    
    
    				}catch(IOException e){
    				// ce code ne marche pas pour exemple : il me met l'exeption ...
    					infoRight.setStyle(styleError);
    					infoRight.setText("Error while etablishing connection with server.");
    				} finally{
    
    				}
    
    				return true;
    			}
    			private void onError(String errorMessage){
    			// ce code ne marche pas pour exemple : il me met l'exeption ..
    				infoRight.setStyle(styleError);
    				infoRight.setText(errorMessage);
    				try{
    					socket.close();
    				}catch(IOException e){
    					JOptionPane.showInternalMessageDialog(null, e.toString(), "Fatal Auth", JOptionPane.ERROR_MESSAGE);
    				}
    			}
    		};
    
    		infoLoading.textProperty().bind(connectServerTask.messageProperty());
    		indicator.progressProperty().bind(connectServerTask.progressProperty());
    		new Thread(connectServerTask).start();
    	}



    -
    Edité par Anonyme 19 août 2015 à 13:12:22

    • Partager sur Facebook
    • Partager sur Twitter
      19 août 2015 à 13:44:22

      Bonjour Theadri1900,

      Si tu souhaites déclencher une opération graphique en dehors du thread graphique tu peux utiliser

      javafx.application.Platform.runLater(java.lang.Runnable)

      Cette méthode permet d'éxécuter le code du runnable par le thread graphique de JavaFX.

      Par exemple ta méthode updateMessage() pourrait ressembler à ceci :

      protected void updateMessage(String message) {
          Runnable command = new Runnable() {
              @Override
              public void run() {
                  // Le label étant le label JavaFX dont tu
                  // souhaites modifier le texte.
                  label.setText(message);
              }
          };
          if (Platform.isFxApplicationThread()) {
              // Nous sommes déjà dans le thread graphique
              command.run();
          } else {
              // Nous ne sommes pas dans le thread graphique
              // on utilise runLater.
              Platform.runLater(command);
          }
          
      }



      -
      Edité par Hadriel 19 août 2015 à 13:45:03

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        19 août 2015 à 15:57:52

        Hadriel, je ne saurait comment te remercier !

        Ton aide m'a été d'une très très grande utilité !

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          23 août 2015 à 22:21:13

          Alors voilà, j'ai suivit à la lettre ce que tu m'a dit et là ça ne marche pas .... :

          La méthode d'appel :

          	public void getKonsole(KonsoleType konsoleType, String[] args){
          		if(konsoleType == KonsoleType.SinceBegun){
          			sender.println("GET BEGUN");
          			sender.flush();
          			prepare();
          			Runnable toRun = new Runnable() {
          				
          				@Override
          				public void run() {
          					getMessages();	
          				}
          			};
          			Platform.runLater(toRun);		
          		}
          		else if(konsoleType == KonsoleType.NumberLastMessages){
          			int numberMessages = Integer.parseInt(args[0]);
          			sender.println("GET " + numberMessages);
          			sender.flush();
          			prepare();
          			Runnable toRun = new Runnable() {
          				
          				@Override
          				public void run() {
          					getMessages();	
          				}
          			};
          			Platform.runLater(toRun);
          		}
          		else if(konsoleType == KonsoleType.Now){
          			sender.println("GET NOW");
          			sender.flush();
          			ready();
          		}
          	
          	}

          Et la méthode getMessages() :

          	private void getMessages(){
          		try {			
          			// ici, message pour savoir combiens de messages vont être envoyés
          			String numberMessagesRaw = reader.readLine();
          			if(!numberMessagesRaw.startsWith("8- ")){
          				// si il n'y a pas le bon truc ...
          				JOptionPane.showInputDialog(null, "Protocol error :'(", "Protocol error", JOptionPane.ERROR_MESSAGE);
          				return;
          			}
          			numberMessagesRaw = numberMessagesRaw.substring(3); // on enlève le nombre du message et l'espace qu'il y a 
          			String[] grabNumberMessages = numberMessagesRaw.split(" ");
          			int numberMessages = Integer.parseInt(grabNumberMessages[0]);
          			int numberMessagesReceived = 0;
          			String message = null;
          
          			while(numberMessagesReceived < numberMessages){
          				infos.setText("Downloading " + numberMessagesReceived + " of " + numberMessages + " messages...");
          				message = reader.readLine();
          				if(message.startsWith("7- ")){
          				monitor.appendText(message.substring(3) + "\n");
          				numberMessagesReceived++;
          				progress.setProgress(numberMessagesReceived/numberMessages);
          				}
          			}			
          		} catch (IOException e) {
          			e.printStackTrace();
          		}
          		
          	}

          Ici pas de rafraîchissement ...


          • Partager sur Facebook
          • Partager sur Twitter
            24 août 2015 à 9:54:17

            Tout ce que tu fais dans un runLater() s'exécute dans le thread graphique, et peut donc potentiellement bloquer ton interface.

            Je pense que c'est ton while() dans ton getMessages() qui bloque.

            Il faut vraiment séparer ton "opération longue" et tes appels à l'interface graphique, à la place d'appeler getMessages() à l'intérieur du runLater() essaye de mettre chaque appel graphique de ta boucle dans un runLater(). Ca risque de rendre ton code un peu moins lisible cependant.

            while(numberMessagesReceived < numberMessages) {
                Platform.runLater(new Runnable() {
                    public void run() {
                        infos.setText("Downloading " + numberMessagesReceived
                                + " of " + numberMessages + " messages...");
                    }
                });
                message = reader.readLine();
                if(message.startsWith("7- ")) {
                    final String monitorText = message.substring(3) + "\n";
                    Platform.runLater(new Runnable() {
                        public void run() {
                            monitor.appendText(monitorText)
                        }
                    });
                    numberMessagesReceived++;
                    final int progressStatus = numberMessagesReceived/numberMessages;
                    Platform.runLater(new Runnable() {
                        public void run() {
                            progress.setProgress(progressStatus);
                        }
                    });
                }
            }


            Ou si tu préfères une version en Java 8 :

            while(numberMessagesReceived < numberMessages) {
                Platform.runLater(() -> {
                    infos.setText("Downloading " + numberMessagesReceived
                            + " of " + numberMessages + " messages...");
                });
                message = reader.readLine();
                if(message.startsWith("7- ")){
                    final String monitorText = message.substring(3) + "\n";
                    Platform.runLater(() -> monitor.appendText(monitorText));
                    numberMessagesReceived++;
                    final int progressStatus = numberMessagesReceived/numberMessages;
                    Platform.runLater(() -> progress.setProgress(progressStatus));
                }
            }

            Cette solution devrait fonctionner, même si ce n'est pas idéal.


            Je suppose qu'une meilleure solution serait de déclencher des événements lors de ton "opération longue" et ainsi de pouvoir mettre à jour ton interface en capturant ces événements dans le thread graphique. Ca doit être faisable en utilisant les différentes implémentations de Property, mais il faut bien penser les choses pour pouvoir ensuite le réutiliser dans toute ton application.

            -
            Edité par Hadriel 24 août 2015 à 9:56:23

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              25 août 2015 à 14:24:25

              Salut,

              regarde un peu, j'ai modifié comme tu me l'a dit mais les composants ne se rafraîchissent pas, et avec le débug j'ai vu que la variable "final avancement" restait à 0 (on a pas les virgules pourtant on est bien en double), ensuite on a des freeze sur l'IHM et un monitor qui ne veut pas faire sa fonction append ... :

              Méthode :

              	private void getMessages(){
              		try {			
              			// ici, message pour savoir combiens de messages vont être envoyés
              			String numberMessagesRaw = reader.readLine();
              			
              			if(!numberMessagesRaw.startsWith("8- ")){
              				// si il n'y a pas le bon truc ...
              				JOptionPane.showInputDialog(null, "Protocol error :'(", "Protocol error", JOptionPane.ERROR_MESSAGE);
              				return;
              			}
              			numberMessagesRaw = numberMessagesRaw.substring(3); // on enlève le nombre du message et l'espace qu'il y a 
              			String[] grabNumberMessages = numberMessagesRaw.split(" ");
              			int numberMessages = Integer.parseInt(grabNumberMessages[0]);
              			int numberMessagesReceived = 0;
              			String message = null;
              
              			while(numberMessagesReceived < numberMessages){
              				final String toSetText = "Downloading " + numberMessagesReceived + " of " + numberMessages + " messages...";
              				Platform.runLater(() -> infos.setText(toSetText));
              				message = reader.readLine();
              				if(message.startsWith("7- ")){
              				final String messageFinal = message.substring(3) + "\n";
              				Platform.runLater(() -> monitor.appendText(messageFinal));
              				numberMessagesReceived++;
              				final double avancement = numberMessagesReceived/numberMessages;
              				Platform.runLater(() -> progress.setProgress(avancement) );
              				}
              			}			
              		} catch (IOException e) {
              			e.printStackTrace();
              		}
              		Platform.runLater(() -> ready());
              		
              	}


              et la méthode où elle est appelée:

              	public void getKonsole(KonsoleType konsoleType, String[] args){
              		if(konsoleType == KonsoleType.SinceBegun){
              			sender.println("GET BEGUN");
              			sender.flush();
              			prepare();
              			// utilisation de lambdas
              			Thread thread = new Thread(() -> getMessages());
              			thread.start();
              		}
              		else if(konsoleType == KonsoleType.NumberLastMessages){
              			int numberMessages = Integer.parseInt(args[0]);
              			sender.println("GET " + numberMessages);
              			sender.flush();
              			Thread thread = new Thread(() -> getMessages());
              			thread.start();
              			prepare();
              		}
              		else if(konsoleType == KonsoleType.Now){
              			sender.println("GET NOW");
              			sender.flush();
              			ready();
              		}
              	
              	}




              -
              Edité par Anonyme 25 août 2015 à 14:24:56

              • Partager sur Facebook
              • Partager sur Twitter
                25 août 2015 à 21:33:16

                Ta variable "avancement" reste à zéro parce que tu fais une division entière, puis après la convertion en double se fait lors de l'affectation.
                Il faut que tu cast une des variables (numeroMessageReceived ou numberMessages) lors de la division.

                Pour ce qui est des blocages IHM il doit te rester des opérations dans le thread graphique qui te consomment trop de temps. Je ne peux que spéculer, il me faudrait avoir accès à plus de code pour avoir une meilleure idée.

                -
                Edité par Hadriel 25 août 2015 à 21:34:37

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  26 août 2015 à 0:22:29

                  C'est bizarre, car je ne vois pas de code pouvant paralyser le thread graphique... Je te passe la class entière si tu veux, de toute façon le code source sera disponible ^^

                  package com.minecraftnews.theadri1900.address.view;
                  
                  import java.io.BufferedReader;
                  import java.io.IOException;
                  import java.io.InputStreamReader;
                  import java.io.PrintStream;
                  import java.net.Socket;
                  
                  import javax.swing.JOptionPane;
                  
                  import com.minecraftnews.theadri1900.address.KonsoleType;
                  import com.minecraftnews.theadri1900.address.Konsole_Client;
                  
                  import javafx.application.Platform;
                  import javafx.fxml.FXML;
                  import javafx.scene.control.Button;
                  import javafx.scene.control.Label;
                  import javafx.scene.control.ProgressBar;
                  import javafx.scene.control.Slider;
                  import javafx.scene.control.TextArea;
                  import javafx.scene.control.TextField;
                  import javafx.scene.text.Font;
                  
                  public class KonsolePageController {
                  	
                  	private Konsole_Client mainApp;
                  	private Socket konsoleServer;
                  	private boolean canSendCommand;
                  	private PrintStream sender;
                  	private BufferedReader reader;
                  	
                  	@FXML
                  	private Button send;
                  	
                  	@FXML
                  	private TextField command;
                  	
                  	@FXML
                  	private TextArea monitor;
                  	
                  	@FXML
                  	private ProgressBar progress;
                  	
                  	@FXML
                  	private Label infos;
                  
                  	@FXML
                  	private Slider sizeChoice;
                  
                  	
                  	public void setMainApp(Konsole_Client mainApp){
                  		this.mainApp  = mainApp;
                  		mainApp.launchKonfiguratorKonsole();
                  	}
                  	
                  	
                  	
                  	@FXML
                  	private void initialize(){
                  		sizeChoice.valueProperty().addListener((observable, oldvalue, newvalue) -> onSizeChoiceChange());
                  	}
                  	
                  	public void manualInit(Socket socket, boolean canSendCommand){
                  		try{
                  		this.konsoleServer = socket;
                  		this.sender = new PrintStream(socket.getOutputStream());	
                  		this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                  		
                  		this.canSendCommand = canSendCommand;
                  		if(!canSendCommand){
                  		this.command.setDisable(true);
                  		this.command.setText("Sorry, you don't have the rights to send commands :'(");
                  		this.send.setDisable(true);
                  		}
                  		else {
                  			this.command.setDisable(false);
                  			this.command.setText("");
                  			this.send.setDisable(false);
                  		}
                  		}catch(IOException e){
                  			e.printStackTrace();
                  		}
                  	}
                  	
                  	public void getKonsole(KonsoleType konsoleType, String[] args){
                  		if(konsoleType == KonsoleType.SinceBegun){
                  			sender.println("GET BEGUN");
                  			sender.flush();
                  			prepare();
                  			// utilisation de lambdas
                  			new Thread(() -> getMessages()).start();
                  		}
                  		else if(konsoleType == KonsoleType.NumberLastMessages){
                  			int numberMessages = Integer.parseInt(args[0]);
                  			sender.println("GET " + numberMessages);
                  			sender.flush();
                  			new Thread(() -> getMessages()).start();
                  			prepare();
                  		}
                  		else if(konsoleType == KonsoleType.Now){
                  			sender.println("GET NOW");
                  			sender.flush();
                  			ready();
                  		}
                  	
                  	}
                  	
                  	private void getMessages(){
                  		try {			
                  			// ici, message pour savoir combiens de messages vont être envoyés
                  			String numberMessagesRaw = reader.readLine();
                  			
                  			if(!numberMessagesRaw.startsWith("8- ")){
                  				// si il n'y a pas le bon truc ...
                  				JOptionPane.showInputDialog(null, "Protocol error :'(", "Protocol error", JOptionPane.ERROR_MESSAGE);
                  				return;
                  			}
                  			numberMessagesRaw = numberMessagesRaw.substring(3); // on enlève le nombre du message et l'espace qu'il y a 
                  			String[] grabNumberMessages = numberMessagesRaw.split(" ");
                  			int numberMessages = Integer.parseInt(grabNumberMessages[0]);
                  			int numberMessagesReceived = 0;
                  			String message = null;
                  
                  			while(numberMessagesReceived < numberMessages){
                  				final String toSetText = "Downloading " + numberMessagesReceived + " of " + numberMessages + " messages...";
                  				Platform.runLater(() -> infos.setText(toSetText));
                  				message = reader.readLine();
                  				if(message.startsWith("7- ")){
                  				final String messageFinal = message.substring(3) + "\n";
                  				Platform.runLater(() -> monitor.appendText(messageFinal));
                  				numberMessagesReceived++;
                  				final double avancement = (double) numberMessagesReceived/ (double)numberMessages;
                  				Platform.runLater(() -> progress.setProgress(avancement) );
                  				}
                  			}			
                  		} catch (IOException e) {
                  			e.printStackTrace();
                  		}
                  		Platform.runLater(() -> ready());
                  		
                  	}
                  	
                  	private void prepare(){
                  		progress.setVisible(true);
                  		infos.setVisible(true);
                  		command.setVisible(false);
                  		send.setVisible(false);
                  	}
                  	
                  	public void ready(){
                  		progress.setVisible(false);
                  		infos.setVisible(false);
                  		command.setVisible(true);
                  		send.setVisible(true);
                  	}
                  	
                  	
                  	@FXML
                  	private void onSizeChoiceChange(){
                  		int newSize = (int)sizeChoice.getValue();
                  		monitor.setFont(new Font("Courier New", newSize));
                  	}
                  	
                  	@FXML
                  	private void onSendAir(){
                  		this.send.setStyle("-fx-background-color: #0087ff; -fx-border-color: #00ecf0;");
                  	}
                  
                  	@FXML
                  	private void onSendPressed(){
                  		this.send.setStyle("-fx-background-color: #03a4ec; -fx-border-color: #00ecf0;");
                  	}
                  
                  	@FXML
                  	private void onSendExit(){
                  		this.send.setStyle("-fx-background-color: #0087ff; -fx-border-color: #0550f9;");
                  	}
                  
                  	@FXML
                  	private void onSendRelease(){
                  		onSendExit();
                  	}
                  	
                  	
                  }
                  

                  N'hésites pas si tu as des questions sur le code ^^, et désolé si il y a des mégardes dans la programmation, je suis pas un pro ^^

                  -
                  Edité par Anonyme 26 août 2015 à 0:24:19

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    26 août 2015 à 14:31:40

                    Sa y est j'ai compris : en fait lorsque je débug il faut que je valide aussi les lignes du javafx thread ! J'avais laissé un point d'attente sur les lignes Platform.runlater(runnable), du coup il attendais que je valide au niveau du thread graphique en plus du thread qui s'occupe du download.

                    merci de ton attention hadriel :)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 août 2015 à 23:30:33

                      Content d'avoir pu aider.

                      Aussi, j'allais te dire que tu fais ton send sur la socket dans le thread graphique mais je doute que ca soit très consommateur de temps (surtout si tu testes en local).

                      Ensuite, si KonsoleType est une énumération, utiliser un switch est plus approprié que if/else if.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Rafraîchir composant IHM lors d'une task JAVAFX

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown