Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jtree未显示在JScrollPane上_Java_Swing - Fatal编程技术网

Java Jtree未显示在JScrollPane上

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

我试图在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 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都是低效的,就像在你准备好的时候做一个大的更新一样