我创建了一个大小为 n 的 JLabel
的 ArrayList
,并将 JLabel
放置在 JInternalFrame
中:在 GridBagLayout
管理器的帮助下,网格符合我的目的。
现在我想替换其中一些 JLabel
甚至删除它们。
删除第 k 个 JLabel
确实可以很好地使用
innerframe.remove( ListOfLabels.get(k) );
ListOfLabels.remove(k);
(顺便说一句,如果我只使用其中一个,JLabel
不会从内部框架中删除 - 为什么?如果我删除其他对象,例如 Checkboxe
s,仅使用 innerframe.remove(ListOfCBoxes.get(k));
)
当我将 JLabel
放置在周围的 JFrame
内时,即使其他 JLabel
也停留在其位置,但也不起作用。
但编辑内容后我无法读取 JLabel
。我正在努力
//Initialization
ArrayList<JLabel> ListOfLabels = new ArrayList<JLabel>(n);
GridBagLayout GridBLayout_innerframe = new GridBagLayout();
GridBagConstraints GridBConstraints_innerframe = new GridBagConstraints();
JInternalFrame innerframe = new JInternalFrame();
innerframe.setLayout(GridBLayout_innerframe);
// Creating components of innerframe, arranging them in a grid and adding them.
// This seems to work.
innerframe.remove( ListOfLabels.get(k) );
ListOfLabels.remove(k);
labelk = new JLabel("New content");
ListOfLabels.add(labelk);
GridBConstraints_innerframe.gridy = k ;
GridBLayout_innerframe.setConstraints(ListOfLabels.get(n-1), GridBConstraints_innerframe) ;
innerframe.add(ListOfLabels.get(n-1)) ;
当然,之前第 k 个 JLabel
使用了相同的约束,但我没有
删除此信息。我希望我能覆盖它。
但是结果是我删除的 JLabel
仍然被删除,而我想要删除的 JLabel 仍然被删除
添加不出现。即使在“刷新”窗口之后也是如此。 Eclipse 也没有错误消息。
有人可以找到我的错误并解释如何将组件重新添加到希望已经存在的网格中吗:/
最佳答案
您正在删除JLabel
,但没有说明您执行此操作的Component
。当Component
已经可见时,您需要在添加/删除Component
之后立即调用revalidate()
方法。
因此,如果 innerframe
可见并且您调用了 innerframe.remove(...)
,则需要调用:
innerframe.revalaidate();
然后 innerframe
注意到添加或删除的 Component
并重新分配现在位于 Component 中的
(调用Component
LayoutManager
,重新绘制,...)。
关于java - GridBagLayout 读取组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502796/