代码之家  ›  专栏  ›  技术社区  ›  Vivin Paliath

带有安全管理器的Swing应用程序导致奇怪的GUI刷新问题

  •  1
  • Vivin Paliath  · 技术社区  · 14 年前

    我有一个Swing应用程序(驻留在一个可执行的有签名的JAR中),它是一个客户机。该应用程序还连接到服务器。当满足某些条件时,我会刷新GUI(更具体地说,删除 JTree 然后重新填充)。当我按原样运行这个客户机(即,没有安全管理器,也没有驻留在可执行的签名JAR中)时,树会刷新和更新,而不会出现任何问题。

    但是,当我将客户机打包为已签名的JAR(使用适当的策略文件)时,我会遇到刷新问题。当应用程序启动时,我 树形结构 未展开。当我单击它一次时,它看起来已经展开,但是子节点没有显示。之后我必须单击它两次才能显示节点。另外,当我执行刷新(删除所有节点,然后重新填充)时,UI没有适当地刷新。我(再次)必须单击根节点两次以刷新GUI。

    private void buildTree() throws IOException, ClassNotFoundException {
        setVisible(false);
        tree.removeTreeWillExpandListener(this);
        tree.removeTreeSelectionListener(this);
    
        DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();
        root.removeAllChildren();
    
        root.setUserObject(base);
    
        Book[] bookArray = remoteLibraryService.getAllBooks();
        TreeBuilderService.buildTree(root, bookArray);
        treeModel.reload();
    
        for(int i = 0; i < tree.getRowCount(); i++) {
            tree.expandRow(i);
        }
    
        tree.addTreeSelectionListener(this);
        tree.addTreeWillExpandListener(this);
        setVisible(true);
    }
    

    categoryNode = new DefaultMutableTreeNode(book.getGenre());
    root.add(categoryNode);
    

    2 回复  |  直到 14 年前
        1
  •  2
  •   trashgod    14 年前

    正如在 Initial Threads ,必须在事件调度线程上创建Swing GUI组件。经验性地, JTree 在从另一个线程操作时特别容易失败。这个 SecurityManager 可能是不确定的;任何时间的改变,甚至是平台的改变,都可能暴露出这个缺陷。

        2
  •  2
  •   user268396    14 年前

    好吧,您在GUI刷新周期中执行IO,因此GUI线程可能因此被阻塞/暂停。 相反,考虑使用swingworker并通过其API异步填充树。

    推荐文章