2010-11-22 99 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","","[][][]") 
相關問題