1

我已经实现了一个扩展 JTree 的导航树。每点击一个节点,删除前一个表单后,会显示该节点提供的表单。

如果节点没有提供表单,则简单地删除旧表单。

我的问题是显示第一个表单的部分有效,但是当我单击没有表单(null)的节点时,旧表单仍在显示,直到我调整窗口大小。

这是我的代码:

public class NavigationTree extends EncoTree {

private Container target = null;

public NavigationTree(Color from, Color to, Container trg) {
    super(from, to);
    this.target = trg;

    this.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent me){
            TreePath tps = getSelectionPath();
            if(tps != null){
                cstmMutableTreeNode node = (cstmMutableTreeNode) getLastSelectedPathComponent();
                target.removeAll();     
                if(node.form != null){
                    node.form.construct();
                    node.form.setPreferredSize(new Dimension(200, target.getSize().height));

                    target.add(node.form, BorderLayout.PAGE_START);

                }
                target.validate();
            }
        }
    });
}

}

据我了解repaint(),一旦我重新验证容器,就应该在 EDT 中排队请求。

那么,为什么无需调整窗口大小就可以显示第一个表单,而简单地删除组件却不行呢?

4

1 回答 1

6

据我了解,一旦我重新验证容器,repaint() 请求就应该在 EDT 中排队。

使用 Swing 时,您应该在目标容器上使用revalidate()(而不是验证)和。repaint()重绘可能不会自行发生,因为听起来您正在用相同大小的组件替换现有组件,因此 Swing 认为没有任何变化并且不会进行重绘。

于 2013-09-04T14:41:54.890 回答