2015-04-01 4 views
1

То, что я пытаюсь сделать, довольно просто, но сталкивается с некоторыми проблемами. У меня есть класс и я переопределяю toString() с некоторым значением.JTree, setUserObject(), toString()

public class AClass { 

@Override 
public String toString() { 
    int rand = 5 + (int) (Math.random() * 25); 
    return Integer.toString(rand); 
    } 
} 

У меня есть JTree и I`m добавления объекта класса к узлу с помощью setUserObject(). Дисплей на узле теперь имеет значение fromString().

  DefaultMutableTreeNode node = new DefaultMutableTreeNode(); 
      node.setUserObject(new AClass()); 
      fileTreeModel.insertNodeInto(node, (DefaultMutableTreeNode) rootNode, 0); 
      tree.setSelectionPath(new TreePath(fileTreeModel.getPathToRoot(node))); 
      tree.expandPath(new TreePath(rootNode.getPath())); 

Но, когда я нажимаю на узлах или попытаться добавить новый узел, тем ToString() значения меняются.

Что здесь происходит? Любая помощь приветствуется. Вот пример кода.

Main.java

import java.awt.Color; 
import java.awt.EventQueue; 

import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JSplitPane; 

import java.awt.BorderLayout; 

import javax.swing.JTree; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.TreePath; 
import javax.swing.tree.TreeSelectionModel; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

import javax.swing.JScrollPane; 


public class Main { 

private JFrame frame; 
private JTree tree; 
private DefaultMutableTreeNode rootNode ; 
private DefaultTreeModel fileTreeModel; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Main window = new Main(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the application. 
*/ 
public Main() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 450, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JSplitPane splitPane = new JSplitPane(); 
    splitPane.setResizeWeight(0.2); 
    frame.getContentPane().add(splitPane, BorderLayout.CENTER); 

    JScrollPane scrollPane = new JScrollPane(); 
    splitPane.setLeftComponent(scrollPane); 

    tree = new JTree(); 
    tree.setBackground(new Color(255, 235, 205)); 
    scrollPane.setViewportView(tree); 
    rootNode = new DefaultMutableTreeNode("Files"); 
    fileTreeModel = new DefaultTreeModel(rootNode); 
    tree.setModel(fileTreeModel); 
    tree.getSelectionModel().setSelectionMode(
      TreeSelectionModel.SINGLE_TREE_SELECTION); 
    tree.setRootVisible(true); 

    JDesktopPane desktopPane = new JDesktopPane(); 
    desktopPane.setBackground(new Color(255, 255, 0)); 
    splitPane.setRightComponent(desktopPane); 

    JButton btnNewButton = new JButton("New button"); 
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

      DefaultMutableTreeNode node = new DefaultMutableTreeNode(); 
      node.setUserObject(new AClass()); 
      fileTreeModel.insertNodeInto(node, (DefaultMutableTreeNode) rootNode, 0); 
      tree.setSelectionPath(new TreePath(fileTreeModel.getPathToRoot(node))); 
      tree.expandPath(new TreePath(rootNode.getPath())); 
     } 
    }); 
    btnNewButton.setBounds(122, 115, 89, 23); 
    desktopPane.add(btnNewButton); 

    } 

} 

AClass.java

public class AClass { 

@Override 
public String toString() { 
    int rand = 5 + (int) (Math.random() * 25); 
    return Integer.toString(rand); 
    } 

} 

ответ

4

Они меняются, потому что каждый раз, когда toString называется вы вычисляете новое случайное число ...

public String toString() { 
    int rand = 5 + (int) (Math.random() * 25); 
    return Integer.toString(rand); 
} 

Таким образом, каждый раз, когда таблица обновляется, в ответ, скажем, вы нажимаете на них или изменяете TreeModel, дерево задает каждому узлу его значение, которое возвращает новое случайное число.

Попробуйте предварительно рассчитать стоимость аванса.

node.setUserObject(new AClass(5 + (int) (Math.random() * 25))); 

Тогда просто возвращает это значение ...

public String toString() { 
    return Integer.toString(rand); 
} 
+0

Понял. Спасибо, MadProgrammer. Были внесены необходимые изменения и понимание поведения. –

+0

Рад, что это может помочь – MadProgrammer

 Смежные вопросы

  • Нет связанных вопросов^_^