2017-06-27 8 views
0

私はJava Swingを使用しています。最初はファイル(かなり大きい)を読みたいと思っています。したがって、ファイルが完全に終わったらフレームが表示されます。一方、フレームを最初にロード(表示)してから、ファイルを読み込む必要があります。JFrameが表示されてからJavaでファイルを読み込む方法は?

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();     

      } 
     }); 
    } 
} 

フレームが表示された後でファイルを読み取るにはどうすればよいですか?

答えて

3

JFrameはすぐに表示されるはずなので、問題はありません。問題は、Swingイベントスレッドのファイルを読み込んでいるため、JFrameを表示する機能がブロックされていることです。解決策は、SwingWorkerなどのバックグラウンドスレッドでファイルを読み込む代わりに、これを行わないことです。このようにして、JFrameは妨げられずに表示でき、ファイルの読み込みはSwingの機能を妨げません。

ので、ファイルの読み取りが簡単なバックグラウンドスレッドを使用、Swingコンポーネントの状態を変更しない場合:読み取りが発生したとして読んでは、再び、使用するGUIの状態を変更する場合は

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(); 

をSwingWorkerです。

問題点:nullレイアウトを使用しないでください。

+0

なぜコードの最初の行に " - >"がありますか? – user5155835

+0

@ user5155835:Java 8のラムダ構文の一部。 [Javaで矢印演算子 ' - >'は何ですか?](https://stackoverflow.com/questions/15146052/what-does-the-arrow-operator-do-in-java) –

+0

を読んでください。 Pre Java 8を教えてください。 – user5155835

関連する問題