2013-05-12 33 views
0

好傢伙和夫人,創建的FormLayout行和列動態(在運行時)

因爲我讓了Eclipse的WindowBuilder創建我的JPanel用的FormLayout,我想使這個創作是動態的,因爲程序我寫作需要這樣才能避免長達1000行。我用下面的代碼:

JPanel pData = new JPanel(); 
pData.setBounds(10, 232, 381, 163); 


FormLayout fLayout= new FormLayout(new ColumnSpec[]{}, new RowSpec[]{}); 

int numCols = 5; 
int numRows = 10; 

for(int i=1;i<=numCols;i+=2) 
{ 
    fLayout.insertColumn(i, FormFactory.RELATED_GAP_COLSPEC); 
    fLayout.insertColumn(i+1, FormFactory.DEFAULT_COLSPEC); 
} 

for(int j=1;j<=numRows;j+=2) 
{ 
    fLayout.insertRow(j, FormFactory.RELATED_GAP_ROWSPEC); 
    fLayout.insertRow(j+1, FormFactory.DEFAULT_ROWSPEC); 
} 

pData.setLayout(fLayout); 
getContentPane().add(pData); 

但是在啓動程序,我得到的錯誤的堆疊的起始號碼:

「的列的索引1必須在範圍[1,0]」

更改for-loop(s)中的索引只會更改此錯誤文本中間的數字,但其餘部分保持不變。

我在做什麼錯?是否可以動態創建FormLayout?我真的很感謝你的幫助!

附加信息: 我使用FormLayout的原因是事實,列有不同的大小。我知道GridBagLayout也可以這樣做,但它需要更多的線條和數字才能獲得關於插圖和位置的相同結果。但如果它是唯一明智的選擇,我會接受它;只要它是動態的;-)

+1

1)爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 2)'pData.setBounds(10,232,381,163);'Java GUI可能必須在不同的屏幕分辨率下使用不同的PLAF在多個平臺上工作。因此,它們不利於組件的準確放置。對於可靠的GUI,改爲使用佈局管理器或它們的組合,以及用於空白的佈局填充和邊框來組織組件。 – 2013-05-12 17:04:47

+0

感謝Andrew的快速響應! 1)我會記得下次SSCCE!這是我的第一篇文章。我正在學習<:-) 1a)我怎樣才能讓這個SSCCE?我認爲這已經夠短了......我不知道如何讓這個問題變得更簡單,而不會讓問題變得更有價值。 2)pData.setBounds(...)是由WindowBuilder創建的。我沒有設置這個。但你是對的。我會讓它變得靈活。 – Stacky 2013-05-12 17:50:58

+0

這個['GroupLayout'](http://stackoverflow.com/a/14858272/230513)可以替代嗎? – trashgod 2013-05-12 17:58:44

回答

2

它與「insertRow()/ insertColumn()」的工作方式有關。要插入一些東西,你必須已經有行/列插入。你應該使用「.appendRow()/。appendColumn()」,它只是在現有行的底部或任何現有列的右側添加新的行或列。

EX:

int numCols = 2; 
int numRows = 10; 

for(int i=1;i<=numCols;i++) 
{ 
    fLayout.appendColumn(FormFactory.RELATED_GAP_COLSPEC); 
    fLayout.appendColumn(FormFactory.DEFAULT_COLSPEC); 
} 

for(int j=1;j<=numRows;j++) 
{ 
    fLayout.appendRow(FormFactory.RELATED_GAP_ROWSPEC); 
    fLayout.appendRow(FormFactory.DEFAULT_ROWSPEC);; 
} 
this.setLayout(fLayout); 

這將增加4列(2默認和2分相關的差距)和4行(2默認和2分相關的差距)到任何已經存在。

相關問題