Java Swing 응용 프로그램을 시작할 때 XML 파일을 DefaultTreeModel로 읽고, 모델로 새 JTree를 만들고, JTrollPane에 jtree를 추가하고, Life는 Good입니다. 모든 작동합니다JTree : 새 모델을 다시 표시하지 않습니다
// Program initialization:
jarFilesDB = new JarFilesDB();
jarFilesDB.load(JarFilesDB.JAR_DB_FILENAME);
jtree = new JTree(jarFilesDB.getRootNode());
JScrollPane scrollPane = new JScrollPane (jtree);
contentPane.add(scrollPane, BorderLayout.CENTER);
을 나중에, 나는 새로운 XML 파일을 만들려면, 완전히 내 모델을 재 구축 할 수 있습니다. 이 작업을 수행 할 때 jtree에서 새 모델을 다시 표시 할 수 없습니다. 어느 나는 빈 창을 얻거나 이전 모델은 여전히 표시
// Completely regenerate XML file and Model
jarFilesDB.mkXmlFile (sPath); // Generate new XML file
jarFilesDB.load(JarFilesDB.JAR_DB_FILENAME); // Generate new Model
당 앤드류 톰슨의 요청, 내가 쓴 "(가능한 한) 짧은,자가 포함 된 (수정되지 않았거나 내가하지 않을 것입니다!) 예) 질문 :..의 끝에서
nodeStructureChanged(rootNode);
: 방법이 업데이트를 발생하지 않는
package com.rgb;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTree;
import javax.swing.JScrollPane;
import javax.swing.tree.*;
public class FrmMain extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmMain frame = new FrmMain();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmMain() {
setTitle("HelloJTree3");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JButton btnNewButton = new JButton("Click Me");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
doClick();
}
});
contentPane.add(btnNewButton, BorderLayout.NORTH);
jarFilesDB = new JarFilesDB();
jarFilesDB.load(isAlpha);
isAlpha = !isAlpha;
jtree = new JTree(jarFilesDB.getRootNode());
JScrollPane scrollPane = new JScrollPane (jtree);
contentPane.add(scrollPane, BorderLayout.CENTER);
}
private void doClick() {
jarFilesDB.load(isAlpha);
isAlpha = !isAlpha;
}
private JarFilesDB jarFilesDB;
private JTree jtree;
private boolean isAlpha = false;
}
class JarFilesDB extends DefaultTreeModel {
public JarFilesDB() {
super (null);
}
public void load (boolean isAlpha) {
if (rootNode == null)
rootNode = new DefaultMutableTreeNode("root");
else
rootNode.removeAllChildren();
String[] values;
if (isAlpha)
values = new String[] {"A", "A1", "A2", "B", "B1", "B2"};
else
values = new String[] {"10", "11", "12", "20", "21", "22"};
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (values[0]);
DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode (values[1]);
childNode.add(leafNode);
leafNode = new DefaultMutableTreeNode (values[2]);
childNode.add(leafNode);
rootNode.add(childNode);
childNode = new DefaultMutableTreeNode (values[3]);
leafNode = new DefaultMutableTreeNode (values[4]);
childNode.add(leafNode);
leafNode = new DefaultMutableTreeNode (values[5]);
childNode.add(leafNode);
rootNode.add(childNode);
}
public TreeNode getRootNode() {
return rootNode;
}
private DefaultMutableTreeNode rootNode = null;
}
더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –
트리를 초기화 할 때'jtree.setModel (jarFilesDB);'를 사용하지 않는 이유는 무엇입니까? – tenorsax
@Max - class jarFilesDB는 DefaultTreeModel에서 상속받습니다. 처음에는 jtree의 생성자로 모델의 루트 노드를 사용하기 때문에 처음에는 "setModel()"이 필요하지 않습니다. 삭제 한 응답은 정확합니다. removeAll() 또는 setModel()을 * 사용하면 안됩니다. 모든 제안은 분명히 고맙게 여길 것입니다. Thanx in advance ... – paulsm4