2011-11-22 20 views
1

我有一個JTree,我將其用作文件樹。如果我選擇一個新文件,並選擇與已經選擇的文件相同的文件,則樹會因某種原因而凍結。它應該刪除包含該樹的舊JScrollPane並替換爲新的JScrollPane,如果我選擇了不同的文件,但不能使用相同的文件,它將正常工作。 GUI的其餘部分仍然有效,它只是凍結的樹。這裏是相關的代碼:Java JTree在重新選擇文件時會凍結

if ("browse".equals(e.getActionCommand())) { 
     returnVal = fc.showOpenDialog(DSAuto.this); 
     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      File file = fc.getSelectedFile(); 
      filename = file.getAbsolutePath(); 
      l1.setText("Job Location: " + filename); 
      c.fill = GridBagConstraints.BOTH; 
      c.weightx = 1.0; 
      c.gridx = 0; 
      c.gridy = 1; 
      c.gridwidth = 10; 
      c.gridheight = 9; 
      c.ipady = 0; 
      if (rm) 
       pane.remove(ft1); 
      else 
       pane.remove(sp1); 
      if (rm2) { 
       pane.remove(l3); 
       rm2 = false; 
      } 
      if (!(file.isDirectory() || file.isFile())) { 
       l3 = new JLabel("404 File Not Found"); 
       pane.add(l3, c); 
       rm2 = true; 
      } else { 
       ft1 = new FileTree(file); 
       ft1.all = allB; 
       pane.add(ft1, c); 
       rm = true; 
      } 
     } 

    } 

我也可以提供FileTree類的代碼,如果需要的話。

回答

3

應該刪除舊的框架,並用一個新的

您不能添加/刪除一個JFrame一個JFrame,所以我不知道這是什麼意見手段取代它。

不要刪除/添加組件?如果您想更新現有組件,請更改模型。那就是:

tree.setModel(...); 

或者如果你刪除/添加組件,那麼你需要使用:

panel.revalidate(); 
panel.repaint(); 
+0

對不起,我意識到後,我發帖說我說的框架,而不是窗格。在我編輯之前,您必須回覆。我從來沒有見過setModel()。好吧,添加重新驗證並重新繪製它的工作。我將學習如何使用setModel,以便下次可以做到這一點。謝謝您的幫助! – SaintWacko

+0

@SaintWacko,'它應該是刪除舊的JScrollPane包含樹,並用新的替換它'。在這種情況下,您不需要替換scrollPane。而是使用'scrollPane.setViewportView(tree)'。您很少需要刪除/添加新組件。 – camickr

+0

那麼,那就是scrollPane實際上是FileTree類的一部分。這樣做更有意義,因爲文件樹在滾動窗格之外真的不會有太多用處。不過,我會記住setViewportView的未來。 – SaintWacko