2011-11-22 47 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