4

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

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

4

5 回答 5

2

“hidemode”约束帮助你:

new MigLayout("hidemode 3","","[][][]")
于 2011-02-17T14:14:21.423 回答
1

没有直接插入新组件的方法,但是无需复制粘贴即可删除和重新添加所有现有组件相当简单。其中重要的部分是,原始组件布局不必在任何地方都可以访问,并且您不必将所有布局代码放在一个以上的位置。

  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);
于 2011-01-15T00:16:54.657 回答
1

您可以在 migLayout 中为您的单元格使用“绝对”定位,而不是使用“单元格”概念,并通过引用相邻单元格的坐标将单元格粘合在一起。您需要为单元格命名,以便在 migLayout 中引用它们。

然后,您可以随时通过更改单元格坐标中的名称引用来重新排列单元格,您只需为受影响的单元格调用 setComponentConstraints(...) 即可。

fi you for 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。

我做了某事。类似于创建一种多拆分窗格,并且似乎效果很好。

于 2011-02-02T06:22:20.813 回答
0

我不确定这是否是最好的解决方案,但您可以重新铺设整个容器,包括您的新组件。我认为没有办法以您想要的方式插入组件。

希望我错了。

但这样做应该不会有太多开销,而且用户会很快注意到!

于 2010-11-25T21:21:30.647 回答
0

一般来说,面板和 Swing 组件并不是真正为动态重组而设计的,所以我认为 psanton 的解决方案可能是最安全和最简单的方法。removeAll()您可以通过在使用现有代码重新添加元素之前调用面板来重用面板。

如果您自己对使用索引的建议也有效,那么我会同意 - 跟踪模型中的前几行应该很容易实现,并且重组组件会更快一些,尽管您不太可能除非你有数百个子元素,否则你会感觉到不同。

于 2010-12-15T12:25:22.950 回答