2017-08-18 4 views
0

これは私の最初の投稿です。何か間違っていると、私はそれを修正しようとします。 私が扱っているテスト作業は、ファイルサーチャーにテキストなどをナビゲートする機能を持たせることです.1つのことを除いて、この部分は終了しました。アプリケーションは、ディレクトリ内のファイルを検索しているときに、ファイルサーチャー:メインスレッド実行中にJFrameを使用するには?

私はマルチスレッドについて多くのことを読んだことがありますが、これを行う方法はまだわかりません...これは、JFrame(「GUI」クラス)でユーザーが「Choose folder」を押したときに実行されるコードです。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    DefaultTreeModel model = (DefaultTreeModel) jTree1.getModel(); 
    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); 
    int j = jTree1.getRowCount() - 1; 
    final JFileChooser fc = new JFileChooser(); 
    FileNameExtensionFilter filter = new FileNameExtensionFilter(jComboBox1.getSelectedItem().toString() + " files", jComboBox1.getSelectedItem().toString()); 
    fc.setFileFilter(filter); 
    fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
    fc.setDialogTitle("Choose a folder to fing ." + jComboBox1.getSelectedItem().toString() + " files"); 
    jLabel4.setText("Searching files in folder, please wait"); 
    if (fc.showOpenDialog(jButton3) == JFileChooser.APPROVE_OPTION) { 
     root.setUserObject("Your root"); 
     jTextArea1.setText(""); 
     jTextField1.setText(""); 
     if (jTree1.getRowCount() > 0) { 
      for (int i = 0; i < j; i++) { 
       model.removeNodeFromParent((MutableTreeNode) model.getChild(root, 0)); 
      } 
     } 
     long startTime = System.currentTimeMillis(); 
     File f2 = new File(fc.getSelectedFile().getAbsolutePath()); 
     String name2 = "." + jComboBox1.getSelectedItem().toString(); 
     //FilenameFilter filter1 = (File dir, String name1) -> name1.endsWith(name2); 
     ArrayList<File> files = new ArrayList<>(); 
     new NewТhread(); 
     listf(f2, files, name2); 
     root.setUserObject(f2); 
     model.nodeChanged(root); 
     for (int i = 0; i < files.size(); i++) { 
      DefaultMutableTreeNode child = new DefaultMutableTreeNode(files.get(i).getAbsolutePath().replace(f2.toString(), "")); 
      root.add(child); 
      model.reload(); 
      jLabel4.setText("Done! Now type text to search and press \"Search files\""); 
     } 
     System.out.println("Time used for getting files: " + (System.currentTimeMillis() - startTime)/1000 + "sec"); 
     JOptionPane.showMessageDialog(null, "Directory opened:" + fc.getSelectedFile().getAbsolutePath()); 
     System.out.println("Main thread finished"); 
    } else if (fc.showOpenDialog(jButton3) == JFileChooser.CANCEL_OPTION) { 
     jLabel4.setText("Please, choose folder and extension to find files"); 
    } 
} 

LISTFはあまりにもすべてのサブディレクトリを確認するための方法である:

public ArrayList<File> listf(File directory, ArrayList<File> files, String extension) { 
    File[] flist = directory.listFiles(); 
    for (int i = 0; i < flist.length; i++) { 
     if (flist[i].isFile() && flist[i].getName().endsWith(extension) == true) { 
      files.add(flist[i]); 
     } else if (flist[i].isDirectory()) { 
      listf(flist[i], files, extension); 
     } 
    } 
    return files; 
} 

NewThreadは、私はまだでは得ることができないクラスで、今ではこのようになりますのために:。

class NewТhread extends Thread { 

NewТhread() { 
    super("Demo"); 
    start(); 
} 

public synchronized void run() { 
    try { 
     for (int i = 3; i > 0; i--) { 
      Thread.sleep(500); 
      System.out.println(i); 
      GUI gui = new GUI(); 
      gui.setVisible(true); 
     } 
    } catch (InterruptedException е) { 
     System.out.println("Interrupted"); 
    } 
} 

3-2-1カウント後、すべてのアクションを実行できるようにする新しいGUIオブジェクト(JFrame)が開きます。オブジェクトGUI GUIのすべての要素は、メインスレッドが実行されている間にフリーズされます(検索が終了したときにフリーズ解除されます)。 助けてください。

+1

あなたは何をしたいのか分からない。 [Swingの同時実行性](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/)についてお読みください。おそらくこれがあなたを助けるでしょう。 –

答えて

0

下図のようにあなたは、単にスレッドのrunメソッド内で、ユーザーの操作を必要としない唯一のコードを、置くことによってスレッドを起動することができますあなたの場合は

new Thread() 
{ 
    public void run() 
    { 
     // code which does not require user's interaction 
    } 
}.start(); 

をrunメソッドに配置するコード「jButton1ActionPerformed」アクションリスナーで記述されたコードになります。 :-)

0

ありがとうございます。私はExecutorServiceで決定を見つけました。データがロードされている間にプロジェクトをフリーズできません。

関連する問題