2017-08-04 7 views
1

J'ai une application javaFx simple qui recherche du texte et des éléments de structures html. Il a une petite fenêtre, une scène. Le programme peut s'exécuter correctement, mais pendant que le programme est en cours d'exécution, la scène (fenêtre javaFx) ne répond pas, elle gèle. Je pensais que je devrais exécuter ma scène dans un nouveau fil, mais cela n'a pas fonctionné. C'est la partie mentionnée de mon programme. Comment puis-je exécuter mon programme sans gel de la fenêtre?Pourquoi ma scène ne répond pas pendant que le programme fonctionne? (java fx)

public class Real_estate extends Application implements Runnable { 
    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
     stage.getIcons().add(new Image("http://icons.iconarchive.com/icons/paomedia/small-n-flat/1024/house-icon.png")); 
     stage.setTitle("Simple program 0.8"); 
     stage.setWidth(300); 
     stage.setHeight(300); 
     stage.setResizable(false); 

     HtmlSearch htmlSearch = new HtmlSearch(); 
     htmlSearch .toDatabase("http://example.com"); 

    } 

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

    @Override 
    public void run() { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

Répondre

4

exécuter le code qui prend beaucoup de temps pour exécuter (probablement htmlSearch.toDatabase(...)) dans un fil de fond. Vous pouvez le faire avec

public class Real_estate extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
     stage.getIcons().add(new Image("http://icons.iconarchive.com/icons/paomedia/small-n-flat/1024/house-icon.png")); 
     stage.setTitle("Simple program 0.8"); 
     stage.setWidth(300); 
     stage.setHeight(300); 
     stage.setResizable(false); 

     HtmlSearch htmlSearch = new HtmlSearch(); 
     new Thread(() -> htmlSearch.toDatabase("http://example.com")).start(); 

    } 

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

Cela suppose que htmlSearch.toDatabase(...) ne modifie pas l'interface utilisateur; Si c'est le cas, vous devrez envelopper le code qui modifie l'interface utilisateur dans Platform.runLater(...). Voir, par exemple. Using threads to make database requests pour une explication plus détaillée du multithreading dans JavaFX.

+0

Merci, ça a marché! :) – Kovoliver