GridBagLayout读取组件

时间:2014-08-26 09:49:52

标签: java swing user-interface jlabel gridbaglayout

我创建了ArrayListJLabel个大小为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中也没有错误消息。

有人可以找到我的错误并解释如何将组件读入有希望的现有网格:/

2 个答案:

答案 0 :(得分:2)

您要删除JLabel而不说Component您这样做了。您需要在添加/删除revalidate()后立即调用Component方法。

因此,如果innerframe可见且您致电innerframe.remove(...),则需要致电:

innerframe.revalaidate();

然后innerframe会注意到Component已添加或删除的位置,并重新分配Component中现在位于Component的{​​{1}}(调用LayoutManager ,重新粉刷,...)。

答案 1 :(得分:2)

在复杂的布局中删除/添加组件是个坏主意。在这种情况下,我会提供一个完整的重新布局:清除容器(使用方法removeAll())并再次添加所有必需的组件。当然,您必须为最常更改的容器调用revalidate()repaint()