2010-11-22 64 views
4

我正在尝试创建一个可以根据事件动态插入组件的面板。该面板是基于行的,每行可变数量的组件。但是,在现有插件之间插入组件时遇到问题。有没有办法在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);。但是,这要求我知道前面组件的总数。

回答

1

而不是使用“细胞”的概念,你可以用你的细胞在migLayout“绝对”的定位,并参照相邻小区的坐标胶细胞一起。你需要给单元格命名,以便在migLayout中引用它们。

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

f.i.你为插入单元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"); 

你只需要改变从X1.y2 Y1的y参考Z.y2。

我做了某事。类似于创建一种多分裂面板,并且它似乎运作良好。

0

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

希望我错了。

但是这样做不应该有太多的开销,它会发生在用户注意的时候!

0

面板和Swing组件通常不是专为动态重构而设计的,所以我认为psanton的解决方案可能是最安全和最简单的方法。您可以通过调用removeAll()来重新使用面板,然后使用现有代码重新添加元素。

如果你自己的使用索引的建议也适用,那么我愿意这样做 - 跟踪模型中前面的行应该很容易实现,重构你的组件会更快一些,尽管它是除非你有数百个子元素,否则你不会感觉到它的不同。

+0

我有再次中继所有组件的问题是,当部件被删除并重新添加可滚动区的视图转变。我似乎无法找到一种可靠的方法来回滚到相同的可见边界。 – 2010-12-17 10:13:57

+0

我发现你可以通过保存视图矩形的值来做到这一点,例如Rectangle savedViewport = pane.getViewport()。getViewRect();.稍后可以通过调用text.scrollRectToVisible(savedViewport)来加载它; (在这种情况下,'text'是一个JTextArea,它是窗格内的组件)。 – BoffinbraiN 2010-12-17 13:02:29

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); 
2

“hidemode”限制可帮助您:

new MigLayout("hidemode 3","","[][][]") 
相关问题