【问题标题】:java JTree not updatingjava JTree没有更新
【发布时间】:2010-02-04 00:28:33
【问题描述】:

我在使用 JTree 时遇到了一些问题。当我在同一个类中创建我的 DefaultTreeModel 时,JFrame 更新得很好。但是,我想从另一个类调用更新方法,当我这样做时,JTree 保持空白。 JTree 位于类 GUI 中,并像这样存储在另一个名为 store 的类中。

public static GUI UI = new GUI();

...

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

但是,这无济于事。然而,我在我调用的类 GUI 中:

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();
    }

}

非常感谢。

【问题讨论】:

  • 请添加更多代码。 GUIbuildJTree() 的实现将是一个好的开始。

标签: java swing jtree


【解决方案1】:

您的问题中的信息太少无法确定,但您可能违反了所有 Swing 变异工作必须在事件线程中完成的要求。

所以,例如:

final Runnable swingTask = new Runnable() {
    public void run() {
        UI.init();
        UI.buildJTree(xml);
    }
};
if (EventQueue.isDispatchThread()) {
    swingTask.run();
} else {
    EventQueue.invokeAndWait(swingTask);
}

【讨论】:

  • 好极了。你是对的。我没有看到 Netbeans 已经将该类包装在它自己的 Runnable 中。杰出的。谢谢
猜你喜欢
  • 2011-03-28
  • 2011-04-18
  • 2012-06-22
  • 2011-05-29
  • 1970-01-01
  • 2011-10-13
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多