JTree с DefaultTreeModel, как обновить визуально после загрузки? - PullRequest
0 голосов
/ 24 ноября 2011

Я искал здесь и нашел ответы на эту проблему, но не могу заставить их работать на меня.В основном у меня есть графический интерфейс, который содержит JTree внутри JScrollPane:

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 кнопки, которые хранят (botonGuardarArbol) и извлекают (botonCargarArbol) используя XMLEncoder JTree (они действительно извлекают корневой узел дерева) в файл с соответствующими слушателями 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, он не обновляется, и представление блокируется (т.е. я не могу ничего манипулировать вУ меня было до загрузки).Я пробовал многочисленные темы обновления / обновления JTree, но не смог это исправить.Как я могу это сделать?

Спасибо

1 Ответ

4 голосов
/ 24 ноября 2011
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 для этих классов. Классы начинаются с заглавной буквы.

...