有没有办法在MigLayout中插入“单元格”?

时间:2010-11-22 16:06:48

标签: java swing miglayout

我正在尝试创建一个可以根据事件动态插入组件的面板。该面板基于行,每行具有可变数量的组件。但是,我在现有组件之间插入组件时遇到问题。

例如,如果我有以下布局(线代表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);。但是,这要求我知道前面组件的总数。

5 个答案:

答案 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()重用该面板。

如果您自己使用索引的建议也有效,那么我会继续这样做 - 跟踪模型中的前面行应该很容易实现,重组组件会快一点,尽管不太可能除非你有数百个子元素,否则你会有所不同。