2017-01-25 3 views
0

Я здесь с моим приложением JavaFx.Обновление TextFlow из другого класса JavaFx

У меня есть два класса:

Я начала эти занятия в двух разных Thread. Потому что сервер блокируется.

  • My UI class (Called Main (Я знаю, что мне нужно это изменить)).
  • Класс сервера (Called Serveur)).

В моем классе сервера, когда я получаю байты с ServerSocket.

Мне нужно обновить TextFlow (называемый flowMessafe) в моем классе пользовательского интерфейса: с flowMessage.getChildren(). Add(); Я могу обновить этот TextFlow без проблем в своем классе пользовательского интерфейса. Но я мой класс сервера я не могу.

EDIT: Я пробую все, но я думаю, что нашел большую проблему. Я обновляю неправильный экземпляр моего приложения javafx. Изменить код с текущим кодом

Он является частью моего кода сервера

My Server Constructor 
public Serveur(Mediator med){ 
    this.med=med; 
    try { 
     lancer(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 


Loop to catch message or file. 
for(;;){ 
     try { 
      Thread.sleep(1L); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("Attente de communication ..."); 

     try { 
      socket = serverSocket.accept(); 
     } catch (IOException ex) { 
      System.out.println("Can't accept client connection. "); 
     } 

     try { 
      in = socket.getInputStream(); 
     } catch (IOException ex) { 
      System.out.println("Can't get socket input stream. "); 
     } 

     byte[] bytes = new byte[16*1024];   
     while ((count = in.read(bytes)) > 0) {} 

     String mode = new String(bytes); 
     String[] split = mode.split(";"); 
     if(split[0].compareTo("Message")==0){ 
      recevoirMessage(); 
     } else if(split[0].compareTo("Fichier")==0){ 
      recevoirFichier(split[2]); 
     }  
     in.close(); 
     socket.close(); 

    } 

Когда я получаю сообщение я иду к этой функции:

public void recevoirMessage() { 
    output = new ByteArrayOutputStream(); 
    try { 
     socket = serverSocket.accept(); 
    } catch (IOException ex) { 
     System.out.println("Can't accept client connection. "); 
    } 
    try { 
     in = socket.getInputStream(); 
    } catch (IOException ex) { 
     System.out.println("Can't get socket input stream. "); 
    } 
    byte[] bytes = new byte[16*1024]; 
    try { 
     while ((count = in.read(bytes)) > 0) {} 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    System.out.println("Message reçus"); 
    String recu = "Message : "+new String(bytes); 
    System.out.println(recu); 
    Platform.runLater(() -> { 
     Label mes = new Label(new String(bytes)); 
     med.cli.flowMessage.getChildren().add(mes); 
    }); 
    try { 
     in.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

И в моей основной я есть только пустой конструктор как

public Main(){} 

в моем классе UI у меня есть это, чтобы создать свой App:

'@Override 
public void start(Stage primaryStage) { 
    try { 
     this.pStage = primaryStage; 
     this.pStage = new Stage(); 
     idPane = new BorderPane(); 
     Parent page; 
     page = FXMLLoader.load(getClass().getResource("/application/application.fxml")); 
     this.pStage.setTitle("Messagerie"); 
     Scene scene = new Scene(page); 
     flowMessage = new TextFlow(); 
     idContenuMessage= new ChoiceBox<String>(); 
     scrollPane= new ScrollPane(); 
     //flowMessage = new TextFlow(); 
     String css = this.getClass().getResource("application.css"). 
toExternalForm(); 
       scene.getStylesheets().clear(); 
       scene.getStylesheets().add(css); 
     this.pStage.setScene(scene); 
     this.pStage.setResizable(false); 
     this.pStage.show(); 
     this.pStage.setOnCloseRequest(event -> { 
      Serveur.close(); 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}' 

И я не знаю, как обновить свой пользовательский интерфейс TextFlow в моем классе сервера.

Я видел разные вещи, такие как шаблон посредника, я пробовал это, но это не сработало (может быть, я что-то не так).

Я начинаю мое приложение с этим классом:

package communication; 

import application.Main; 
import javafx.application.Application; 
import javafx.stage.Stage; 

public class Mediator extends Application implements Runnable { 

private Serveur serv; 

public Main cli; 

public Thread thread; 

private Stage primaryStage; 

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

public Mediator(){ 
    cli = new Main(); 
    thread = new Thread(this,"serv"); 
    thread.start(); 
} 

@Override 
public void run() { 
    setServ(new Serveur(this)); 
} 

@Override 
public void start(Stage stage) throws Exception { 
    primaryStage = stage; 
    cli.start(primaryStage); 
} 

public Serveur getServ() { 
    return serv; 
} 

public void setServ(Serveur serv) { 
    this.serv = serv; 
} 
} 

Спасибо за помощь.

ответ

0

Я бы использовал Platform.runLater(), чтобы внести изменения в графический интерфейс в поток приложений Javafx, например.

public void recevoirMessage() { 
output = new ByteArrayOutputStream(); 
try { 
    socket = serverSocket.accept(); 
} catch (IOException ex) { 
    System.out.println("Can't accept client connection. "); 
} 
try { 
    in = socket.getInputStream(); 
} catch (IOException ex) { 
    System.out.println("Can't get socket input stream. "); 
} 
byte[] bytes = new byte[16*1024]; 
try { 
    while ((count = in.read(bytes)) > 0) {} 
} catch (IOException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 
System.out.println("Message reçus"); 
String recu = "Message : "+new String(bytes); 
System.out.println(recu); 

//inserted here 
Platform.runLater(new Runnable() { 
     @Override public void run() { 
      //HERE I WANT TO UPDATE MY TEXTFLOW 
     } 
    }); 


try { 
    in.close(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

}

+0

Спасибо я пойти попробовать это. – Wariie

+0

Я думаю, вы могли бы получить доступ к TextFlow, как это. 'Mediator.cli.flowMessage.getChildren(). Add()' – Nash

+0

Это не обновляет хороший экземпляр Main: /. – Wariie

0

Во-первых TextFlow не имеет свойства текста, так что вы не можете установить это значение для него. Добавить Text объект в поток текста:

Text text = new Text();  
flowMessage = new TextFlow(text); 

Затем создайте StringProperty, привязать его к Text компоненте textProperty и обновить это значение в классе Server.

класс Применение:

public class Mediator extends Application implements Runnable { 

    private Serveur serv; 

    public Main cli; 

    private StringProperty textProperty = new SimpleStringProperty("text"); 

    public Thread thread; 

    private Stage primaryStage; 

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

    public Mediator(){ 
     cli = new Main(this,textProperty); 
     thread = new Thread(this,"serv"); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     serv = new Serveur(this,textProperty); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 
     primaryStage = stage; 
     cli.start(primaryStage); 
    } 
} 

Pass textProperty к Main и Serveur классы.

cli = new Main(this, textProperty); 
serv = new Serveur(this, textProperty); 

Bind текст свойство Text компонента:

text.textProperty().bind(textProperty); 

Наконец обновление textProperty в JavaFX Application Thread в вашем Serveur классе:

public void recevoirMessage() { 
    output = new ByteArrayOutputStream(); 
    try { 
     socket = serverSocket.accept(); 
    } catch (IOException ex) { 
     System.out.println("Can't accept client connection. "); 
    } 
    try { 
     in = socket.getInputStream(); 
    } catch (IOException ex) { 
     System.out.println("Can't get socket input stream. "); 
    } 
    byte[] bytes = new byte[16*1024]; 
    try { 
     while ((count = in.read(bytes)) > 0) {} 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    System.out.println("Message reçus"); 
    String recu = "Message : "+new String(bytes); 
    System.out.println(recu); 

    //inserted here 
    Platform.runLater(new Runnable() { 
      @Override public void run() { 
       //HERE I WANT TO UPDATE MY TEXTFLOW 
       textProperty.setValue(new String(bytes)); 
      } 
     }); 


    try { 
     in.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
+0

Да, но в моем приложении я использую ярлык для вставки в свой textFlow, это тоже работает? Спасибо, я попробую, когда у меня будет время. – Wariie

+0

Вы также можете использовать «Ярлык». – MBec

+0

Я стараюсь, но ничего не происходит. – Wariie

Смежные вопросы