在运行时重新加载JTree

时间:2009-04-16 18:27:58

标签: java swing awt jtree

我在与GUI类分开的类中创建了一个JTree和模型。 JTree的数据是从文件中提取的。

现在,在GUI类中,用户可以将文件系统中的文件添加到AWT列表中。用户单击列表中的文件后,我希望JTree更新。 JTree的变量名是schemaTree。

我在选择列表中的项目时有以下代码:

private void schemaListItemStateChanged(java.awt.event.ItemEvent evt) {
        int selection = schemaList.getSelectedIndex();
        File selectedFile = schemas.get(selection);
        long fileSize = selectedFile.length();
        fileInfoLabel.setText("Size: " + fileSize + " bytes");

        schemaParser = new XSDParser(selectedFile.getAbsolutePath());

        TreeModel model = schemaParser.generateTreeModel();
        schemaTree.setModel(model);
}

我已更新代码以对应于已接受的答案。 JTree现在根据我在列表中选择的文件正确更新。

2 个答案:

答案 0 :(得分:2)

来自Component.add API文档。

  

注意:如果已添加组件   一个已经显示的容器,   必须调用validate   容器显示新的   零件。如果是多个组件   被添加,你可以改善   通过仅调用验证来提高效率   一旦完成所有组件之后   已被添加。

您已在未显示的组件上调用repaintvalidate,这将无效。您需要在mainPanel之后的add上调用这些方法。此外,revalidate往往优于validate,因为它有效地合并。

答案 1 :(得分:1)

我不确定我是否理解你的问题,但我会尝试......

正确的做法应该是,恕我直言:

  • 获取文件
  • 从您的文件
  • 创建一个新的TreeModel
  • 将模型提供给JTree

在伪代码中,它看起来像那样:

File newContent = getSelectedByUser(...);
TreeModel newModel = new MyFileBasedTreeModel(newContent);
//this next part must be done in the EventDispatcherThread
myTree.setModel(newModel); 

然后将更新JTree,无需重新调用等等。

希望有所帮助