2017-06-27 5 views
0

J'utilise Java Swing. Au départ, je veux lire un fichier (qui est assez gros). Ainsi, le cadre est affiché après que le fichier est complètement. Alors que je veux d'abord charger le cadre (affiché), puis le fichier doit être lu.Comment lire un fichier en Java uniquement après l'affichage de JFrame?

class Passwd { 

    JFrame jfrm; 
    // other elements 

    Passwd() { 
     start(); 

     // Display frame. 
     jfrm.setVisible(true); 
    } 

    public void start() { 

     // Create a new JFrame container. 
     jfrm = new JFrame("Password Predictability & Strength Measure"); 

     // Specify FlowLayout for the layout manager. 
     //jfrm.setLayout(new FlowLayout()); 
     jfrm.setLayout(null); 

     // Give the frame an initial size. 
     jfrm.setSize(450, 300); 

     // align window to center of screen 
     jfrm.setLocationRelativeTo(null); 
     // Terminate the program when the user closes the application. 
     jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // some elements 

     File file = new File("file.txt"); 
     try (BufferedReader br = new BufferedReader(new FileReader(file))) { 
      String line; 
      while ((line = br.readLine()) != null) { 
       // operation 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void main(String args[]) { 

     // Create the frame on the event dispatching thread. 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 

       new Passwd();     

      } 
     }); 
    } 
} 

Comment lire le fichier après l'affichage du cadre?

Répondre

3

Le JFrame devrait s'afficher immédiatement, ce n'est donc pas un problème. Le problème est que vous lisez dans le fichier sur le thread d'événement Swing, ce qui bloque sa capacité à afficher le JFrame. La solution est de ne pas le faire, à la place de lire le fichier dans un thread d'arrière-plan, comme via un SwingWorker. De cette façon, le JFrame peut afficher sans entrave, et la lecture du fichier n'interférera pas avec le fonctionnement de Swing.

Donc, si la lecture de fichiers ne changera pas l'état des composants Swing, utilisez un simple fil de fond:

new Thread(() -> { 
    File file = new File("file.txt"); 
    try (BufferedReader br = new BufferedReader(new FileReader(file))) { 
     String line; 
     while ((line = br.readLine()) != null) { 
      // operation 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}).start(); 

Si la lecture en changera l'état de l'interface graphique que la lecture se produit, encore une fois, l'utilisation un SwingWorker.

Problème secondaire: évitez d'utiliser des dispositions nulles car elles reviendront vous mordre.

+0

Pourquoi y a-t-il "->" sur la première ligne de code? – user5155835

+0

@ user5155835: partie de la syntaxe lambda de Java 8. Veuillez lire [Que fait l'opérateur de flèche, '->' en Java?] (Https://stackoverflow.com/questions/15146052/what-does-the-arrow-operator-do-in-java) –

+0

Please pouvez-vous dire pour Pre Java 8? – user5155835