Java Jtree未显示在JScrollPane上
我试图在JFrame中的JScrollPane上显示JTree。代码如下:Java Jtree未显示在JScrollPane上,java,swing,Java,Swing,我试图在JFrame中的JScrollPane上显示JTree。代码如下: import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFileChooser
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.ext.DefaultHandler2;
public class TreeView {
private JFrame frame;
private JTree tree;
private DefaultMutableTreeNode root;
public TreeView() {
}
private void show() {
frame = new JFrame("TreeView");
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
JFrame.setDefaultLookAndFeelDecorated(true);
addComponents();
frame.setVisible(true);
}
private void addComponents() {
JDialog.setDefaultLookAndFeelDecorated(true);
JButton button = new JButton("Select File");
frame.add(button, BorderLayout.NORTH);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
JFileChooser fileChooser = new JFileChooser();
FileNameExtensionFilter xmlfilter = new FileNameExtensionFilter(
"xml files (*.xml)", "xml");
fileChooser.setFileFilter(xmlfilter);
int returnValue = fileChooser.showOpenDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
try {
showAsTree(selectedFile.getAbsolutePath());
tree = new JTree(root);
JScrollPane treeView = new JScrollPane(tree);
frame.add(treeView, BorderLayout.CENTER);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
});
}
private void showAsTree(final String file)
throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxparser = factory.newSAXParser();
saxparser.parse(file, new MyContentHandler());
}
public static void main(final String[] args) throws IOException {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TreeView treeView = new TreeView();
treeView.show();
}
});
}
private class MyContentHandler extends DefaultHandler2 {
@Override
public void startDocument() throws SAXException {
root = new DefaultMutableTreeNode("Root");
DefaultMutableTreeNode abc = new DefaultMutableTreeNode(
"abc");
DefaultMutableTreeNode de = new DefaultMutableTreeNode(
"de");
root.add(abc);
root.add(de);
}
}
}
当我尝试在JScrollPane
内的JTextPane
中添加文本时,一切正常。当我尝试在添加按钮之前在show()
方法或addComponents()
方法中显示树时,它也会显示出来
我到底做错了什么?调用
revalidate
和在框架和/或其contentPane
上重新绘制
showAsTree(selectedFile.getAbsolutePath());
tree = new JTree(root);
JScrollPane treeView = new JScrollPane(tree);
frame.add(treeView, BorderLayout.CENTER);
frame.revalidate();
frame.repaint();
就我个人而言,我在使框架可见之前创建了JTree
,并将其添加到框架中,然后在需要调用revalidate
和repaint
时,简单地更新它的TreeModel
。就我个人而言,我在使框架可见之前创建并将JTree
添加到框架中,然后在需要时简单地更新它的TreeModel
,但为什么需要这样做?当我将代码放入show()方法时,我不需要调用repaint或其他任何东西……因为API就是这样工作的。在show
方法中,您正在调用setSize
和setVisible
,这将导致容器失效和重新喷漆。Swing在更新UI时是懒惰的,因为在你做的每一个小改动上更新UI都是低效的,就像在你准备好的时候做一个大的更新一样