我在与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现在根据我在列表中选择的文件正确更新。
答案 0 :(得分:2)
来自Component.add
API文档。
注意:如果已添加组件 一个已经显示的容器, 必须调用validate 容器显示新的 零件。如果是多个组件 被添加,你可以改善 通过仅调用验证来提高效率 一旦完成所有组件之后 已被添加。
您已在未显示的组件上调用repaint
和validate
,这将无效。您需要在mainPanel
之后的add
上调用这些方法。此外,revalidate
往往优于validate
,因为它有效地合并。
答案 1 :(得分:1)
我不确定我是否理解你的问题,但我会尝试......
正确的做法应该是,恕我直言:
在伪代码中,它看起来像那样:
File newContent = getSelectedByUser(...);
TreeModel newModel = new MyFileBasedTreeModel(newContent);
//this next part must be done in the EventDispatcherThread
myTree.setModel(newModel);
然后将更新JTree,无需重新调用等等。
希望有所帮助