我创建了ArrayList
个JLabel
个大小为n的JLabel
,并在JInternalFrame
经理的帮助下将GridBagLayout
放在JLabel
内,以便网格符合我的目的。
现在我想替换其中一些JLabel
甚至删除它们。
删除第k个innerframe.remove( ListOfLabels.get(k) );
ListOfLabels.remove(k);
确实适用于
JLabel
(顺便说一句,如果我只使用其中一个Checkboxe
没有从内部框架中删除 - 为什么?如果我删除其他对象,如innerframe.remove(ListOfCBoxes.get(k));
s,它就足够了只有JLabel
)
当我将JLabel
放置在周围JFrame
内时,即使其他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)) ;
。我正在尝试
JLabel
当然,之前对第k个JLabel
使用了相同的约束,但事实并非如此
删除此信息。我希望我能覆盖它。
然而,结果是我删除的{{1}}被删除了以及我想要删除的{{1}} 添加不显示。即使在“刷新”窗口之后。 Eclipse中也没有错误消息。
有人可以找到我的错误并解释如何将组件读入有希望的现有网格:/
答案 0 :(得分:2)
您要删除JLabel
而不说Component
您这样做了。您需要在添加/删除revalidate()
后立即调用Component
方法。
因此,如果innerframe
可见且您致电innerframe.remove(...)
,则需要致电:
innerframe.revalaidate();
然后innerframe
会注意到Component
已添加或删除的位置,并重新分配Component
中现在位于Component
的{{1}}(调用LayoutManager
,重新粉刷,...)。
答案 1 :(得分:2)
在复杂的布局中删除/添加组件是个坏主意。在这种情况下,我会提供一个完整的重新布局:清除容器(使用方法removeAll()
)并再次添加所有必需的组件。当然,您必须为最常更改的容器调用revalidate()
和repaint()
。