Почему JTree не изображен (SAX) - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу создать JTree, используя данные XML. Если я создаю JTree и не использую функцию, которая выбирает элементы с идентификатором, JTree будет создан правильно. Но этот Jtree должен содержать узлы только с id. И когда я пишу функцию сортировки, JTree не отображается. Я думаю, что проблема в public void endElement: когда эта функция пуста, JTree содержит элементы с id, но они неверны (table и figure должны быть родителями, para должны быть детьми из table. Как я могу получить JTree с правильным изображением детей?

public JTree xmlJTree;
DefaultTreeModel treeModel;
DefaultMutableTreeNode base = new DefaultMutableTreeNode();
static TreeConstruct treeViewer = null;

public class TreeConstruct extends DefaultHandler {

        public void expandAll(JTree tree) {
            int row = 0;
            while (row < tree.getRowCount()) {
                tree.expandRow(row);
                row++;
            }
        }

        public class SimpleXMLFilter extends XMLFilterImpl {
            public void startElement(String uri, String localName, String tagName, Attributes attr)
                    throws SAXException {

                current = new DefaultMutableTreeNode(tagName);
                if (tagName != null && attr.getValue("id") != null) {
                    base.add(current);
                    base = current;
                }
            }

            public void endElement(String namespaceURI, String localName, String tagName) throws SAXException {

                base = (DefaultMutableTreeNode) base.getParent();
            }
        }

        public class SimpleXMLApplication extends DefaultHandler {
            public void startDocument() throws SAXException {
                super.startDocument();
                base = new DefaultMutableTreeNode();
                ((DefaultTreeModel) xmlJTree.getModel()).setRoot(base);
            }

            public void endDocument() throws SAXException {
                // Refresh JTree
                ((DefaultTreeModel) xmlJTree.getModel()).reload();
                expandAll(xmlJTree);
            }
        }

        public void xmlSetUp(String uri) {

            SAXParserFactory spf = SAXParserFactory.newInstance();
            spf.setValidating(true);
            SAXParser parser = null;
            try {
                parser = spf.newSAXParser();
            } catch (ParserConfigurationException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (SAXException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            XMLReader reader = null;
            try {
                reader = parser.getXMLReader();
            } catch (SAXException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            SimpleXMLFilter filter = new SimpleXMLFilter();

            filter.setParent(reader);

            SimpleXMLApplication app = new SimpleXMLApplication();
            filter.setContentHandler(app);
            filter.setErrorHandler(app);
            InputSource inputSource = new InputSource(uri);
            try {
                filter.parse(inputSource);
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        public void createUI() throws Exception {
            treeModel = new DefaultTreeModel(base);
            xmlJTree = new JTree(treeModel);

            xmlSetUp(currentUrl);

        }
}

Это JTree, когда я не использую функцию endElement enter image description here

...