gpt4 book ai didi

java - Swing 从容器中移除组件并重新绘制

转载 作者:行者123 更新时间:2023-11-29 07:06:59 25 4
gpt4 key购买 nike

我已经实现了一个扩展 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 中排队。

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

最佳答案

As far as I understand it a repaint() request should be enqueued in the EDT as soon as I revalidate the container.

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

关于java - Swing 从容器中移除组件并重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18615971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com