Java JTree не обновляется

У меня проблемы с JTree. Когда я создаю свою DefaultTreeModel в том же классе, JFrame обновляется нормально. Однако я хочу вызвать метод обновления из другого класса, и когда я это делаю, JTree остается пустым. JTree находится в графическом интерфейсе класса и хранится таким же образом в другом классе, называемом хранилищем.

public static GUI UI = new GUI();

...

UI.init();
UI.buildJTree(xml);

Однако это ничего не дает. Однако я внутри графического интерфейса класса я вызываю:

buildJTree(xml);

Все работает нормально. У кого-нибудь есть идеи, почему может быть проблема?

Метод построения дерева выглядит следующим образом:

public void buildTree(String xml) {
    try {
        Console.output("Building tree");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(XML.wrap(xml.trim())));
        Document doc = db.parse(is);
        NodeList xml_packet = doc.getElementsByTagName("packet");
        NodeList channels = xml_packet.item(0).getChildNodes().item(0).getChildNodes();

        Element start = (Element) xml_packet.item(0).getFirstChild();
        this.status_txt.setText(start.getAttribute("connected") + ", connected.");
        MutableTreeNode root = new DefaultMutableTreeNode(start.getAttribute("server"));

        for (int n = 0; n < channels.getLength(); n++) {
            Element fstElmnt = (Element) channels.item(n);
            Console.output("CHANNEL::" + fstElmnt.getAttribute("name"));
            DefaultMutableTreeNode userss = new DefaultMutableTreeNode(fstElmnt.getAttribute("name"));
            root.insert(userss, n);

            NodeList users = channels.item(n).getFirstChild().getChildNodes();

            for (int usr = 0; usr < users.getLength(); usr++) {
                userss.insert(new DefaultMutableTreeNode(users.item(usr).getFirstChild().getNodeValue()), usr);
            }
        }


        model = new DefaultTreeModel(root);

        this.trees.setModel(model);

        for (int t = 0; t < this.trees.getRowCount(); t++) {
            this.trees.expandRow(t);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}

Спасибо заранее.


person Hugh    schedule 04.02.2010    source источник
comment
Пожалуйста, добавьте больше кода. Реализация GUI buildJTree() была бы хорошим началом.   -  person akf    schedule 04.02.2010


Ответы (1)


В вашем вопросе слишком мало информации, чтобы быть уверенным, но возможно, что вы нарушаете требование о том, что вся работа по изменению Swing должна выполняться в потоке событий.

Так, например:

final Runnable swingTask = new Runnable() {
    public void run() {
        UI.init();
        UI.buildJTree(xml);
    }
};
if (EventQueue.isDispatchThread()) {
    swingTask.run();
} else {
    EventQueue.invokeAndWait(swingTask);
}
person Jonathan Feinberg    schedule 04.02.2010
comment
Браво. Ты был прав. Я не видел, чтобы Netbeans обернул класс в свой собственный Runnable. Блестящий. Спасибо - person Hugh; 04.02.2010