我正在尝试创建一个可以根据事件动态插入组件的面板。该面板基于行,每行具有可变数量的组件。但是,我在现有组件之间插入组件时遇到问题。
例如,如果我有以下布局(线代表MigLayout单元格):
+----+----+----+
| X1 | X2 | X3 |
+----+----+----+----+
| Y1 | Y2 | Y3 | Y4 |
+----+----+----+----+
是否可以在行X和Y之间创建一个单元格,以获得:
+----+----+----+
| X1 | X2 | X3 |
+----+----+----+
| Z1 |
+----+----+----+----+
| Y1 | Y2 | Y3 | Y4 |
+----+----+----+----+
我尝试content.add(component, "cell 1 0, wrap");
,但它将组件插入Y1
单元格。
到目前为止,我唯一的解决办法是致电content.add(component, "wrap", index);
。但是,这要求我知道前面组件的总数。
答案 0 :(得分:2)
“hidemode”约束帮助你:
new MigLayout("hidemode 3","","[][][]")
答案 1 :(得分:1)
没有直接的方法来插入新组件,但是删除并重新添加所有现有组件而不使用copy-pasta非常简单。其中最重要的部分是,无论原始组件布局完成在哪里都不必是可访问的,并且您不必在多个位置拥有所有布局代码。
Map<Component,Object> constraintMap = migLayout.getConstraintMap();
Component[] allComps = jPanel.getComponents();
jPanel.removeAll();
for (Component c : allComps) {
if ( condition_to_insert ) {
jPanel.add(insertComponent, new CC());
}
jPanel.add(c, constraintMap.get(c));
}
migLayout.invalidateLayout(jPanel);
答案 2 :(得分:1)
您可以在migLayout中为您的单元格使用“绝对”定位,而不是使用“单元格”概念,并通过引用相邻单元格的坐标将单元格粘合在一起。您需要为单元格命名,以便在migLayout中引用它们。
然后,您可以通过更改单元格坐标中的名称引用随时重新排列单元格,您只需要为受影响的单元格调用setComponentConstraints(...)。
f.i。你为insertige cell Z,你
请参阅miglayout演示应用程序。 一些代码可能如下所示:
myPanel.add(createCell("X1"), "pos 0 0 100 100");
myPanel.add(createCell("X2"), "pos X1.x2 0 200 X1.y2");
等等。
插入单元格“Z”时,
myPanel.add(createCell("Z"), "pos 0 X1.z2 200 100");
你只需要将Y1的y引用从X1.y2更改为Z.y2。
我做了......类似于创建一种多分割窗格,它似乎运作良好。答案 3 :(得分:0)
我不确定这是否是最佳解决方案,但您可以重新铺设整个容器,包括新组件。我认为没有办法按照你想要的方式插入组件。
希望我错了。但这样做不应该花费太多开销,并且会让用户快速注意到它!
答案 4 :(得分:0)
Panels和Swing组件通常不是为动态重组而设计的,所以我认为psanton的解决方案可能是最安全和最简单的方法。您可以在使用现有代码重新添加元素之前调用removeAll()
重用该面板。
如果您自己使用索引的建议也有效,那么我会继续这样做 - 跟踪模型中的前面行应该很容易实现,重组组件会快一点,尽管不太可能除非你有数百个子元素,否则你会有所不同。