【问题标题】:JTree with DefaultTreeModel, how to refresh visually after loading?JTree with DefaultTreeModel,加载后如何视觉刷新?
【发布时间】:2011-11-24 16:01:21
【问题描述】:

我一直在这里搜索并找到了这个问题的答案,但似乎无法让它们为我工作。基本上我有一个包含 JScrollPane 内的 JTree 的 GUI:

private void initComponents() {

        scroll = new javax.swing.JScrollPane();
        nodo padre = new nodo();
        modeloArbol modelo = new modeloArbol(padre);
        arbol = new arbolNodos(modelo);

我有以下课程:

public class arbolNodos extends JTree implements Serializable{

    public arbolNodos(TreeModel newModel) {


public class listenerModeloArbol implements TreeModelListener{

//Overriding treeNodes*(TreeModelEvent e)


public class modeloArbol extends DefaultTreeModel implements Serializable{

    public modeloArbol(TreeNode root) {
        super(root);
    }


public class nodo extends DefaultMutableTreeNode implements Serializable{

我还有 2 个按钮,它们使用 XMLEncoder 将 JTree(它们真正检索树的根节点)存储(botonGuardarArbol)和检索(botonCargarArbol)到具有相应 actionPerformed 侦听器的文件中:

private void botonGuardarArbolActionPerformed(java.awt.event.ActionEvent evt) {                                                  
// TODO add your handling code here:
    try {
        XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("C:\\borrar\\presupuesto")));
        encoder.writeObject(arbol.getModel().getRoot());
        encoder.close();



private void botonCargarArbolActionPerformed(java.awt.event.ActionEvent evt) {                                                 
// TODO add your handling code here:    
    try {
        XMLDecoder decoder = new XMLDecoder( new BufferedInputStream(new FileInputStream("C:\\borrar\\presupuesto")));

        nodo padre = (nodo) decoder.readObject();

        modeloArbol modelo = new modeloArbol(padre);

        decoder.close();

        modelo.setRoot(padre);

    arbolNodos arbolNuevo = null;

        if( modelo != null ){
            arbolNuevo = new arbolNodos(modelo);
            arbol = null;
            arbol = arbolNuevo;

            ((DefaultTreeModel)arbol.getModel()).reload();
        }
        else
            arbolNuevo = new arbolNodos();

问题是,当我检索存储的 JTree 时,我知道它被很好地检索了,因为我尝试在树的所有节点内打印属性并且它们没问题,但是当我尝试将它放在 Swing 中时它没有t 刷新和视图块(即,我无法在加载之前操作 JTree 中的任何内容)。我已经尝试了许多刷新/更新 JTree 的线程,但无法修复它。我该怎么做?

谢谢

【问题讨论】:

  • 请学习java命名约定并遵守它们

标签: java swing model jtree


【解决方案1】:
if( modelo != null )
{
    arbolNuevo = new arbolNodos(modelo); // 
    arbol = null;
    arbol = arbolNuevo;
    ((DefaultTreeModel)arbol.getModel()).reload();
}         
else
    arbolNuevo = new arbolNodos(); 

不要一直创建新的 JTree 对象。如果您想更改模型,只需使用:

tree.setModel(...);

另外,为什么要扩展 JTree、DefaultTreeModel、DefaultMutableTreeNode?如果出于某种原因您确实需要扩展这些类,那么请遵循这些类的标准 Java 命名约定。类以大写字符开头。

【讨论】:

  • 工作就像一个魅力!我还将检查类的 Java 命名约定...谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 2011-07-19
  • 1970-01-01
  • 2014-07-21
  • 2012-08-04
  • 2014-05-06
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多