0

我在与 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 现在根据我在列表中选择的文件正确更新。

4

2 回答 2

2

来自Component.addAPI 文档。

注意:如果组件已添加到已显示的容器中,则必须在该容器上调用 validate 以显示新组件。如果要添加多个组件,您可以通过在添加所有组件后仅调用一次 validate 来提高效率。

您调用repaintvalidate一个未显示的组件,它不会生效。您需要mainPaneladd. 也revalidate往往比validate它有效地合并更好。

于 2009-04-16T18:53:59.260 回答
1

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

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

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

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

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

然后 JTree 将被更新,而无需任何重绘等调用。

希望能帮助到你

于 2009-04-17T13:27:55.120 回答