2017-08-25 42 views
-1

試圖在存在並使用netbeans設計創建的面板上創建文本框。這裏是代碼:在使用netbeans創建的現有面板中創建jtextfield

JTextField test1TextField = new JTextField(actTerm.getDescription().length()); 
test1TextField.setBorder(javax.swing.BorderFactory.createTitledBorder("TestField1"));  

term1TextField.setText(actTerm.getDescription()); 
openPanel.add(test1TextField); 
openPanel.validate(); 
openPanel.repaint(); 
openPanel.updateUI(); 

openPanel,正如我所說的是通過netbeans設計工具創建的。驗證,重繪和updateUI,我只是嘗試不同的事情,都失敗了。運行時,創建的文本字段不會顯示在面板上。不知道還有什麼要嘗試的。

添加以下對openPanel的引用。這是NetBeans的代碼不是我:

javax.swing.GroupLayout openPanelLayout = new javax.swing.GroupLayout(openPanel); 
     openPanel.setLayout(openPanelLayout); 
     openPanelLayout.setHorizontalGroup(
      openPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(openPanelLayout.createSequentialGroup() 
       .addGap(31, 31, 31) 
       .addGroup(openPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(openPanelLayout.createSequentialGroup() 
         .addComponent(saveOpenTermsButton) 
         .addGap(70, 70, 70) 
         .addComponent(deleteOpenTermsButton) 
         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
        .addGroup(openPanelLayout.createSequentialGroup() 
         .addGroup(openPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addComponent(jLabel1) 
          .addComponent(term1TextField, javax.swing.GroupLayout.PREFERRED_SIZE, 267, javax.swing.GroupLayout.PREFERRED_SIZE)) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 55, Short.MAX_VALUE) 
         .addComponent(term2TextField, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addGap(97, 97, 97)))) 
     ); 
     openPanelLayout.setVerticalGroup(
      openPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(openPanelLayout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jLabel1) 
       .addGap(34, 34, 34) 
       .addGroup(openPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(term1TextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(term2TextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 143, Short.MAX_VALUE) 
       .addGroup(openPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(saveOpenTermsButton) 
        .addComponent(deleteOpenTermsButton)) 
       .addGap(29, 29, 29)) 
     ); 

     rulesTabbedPanel.addTab("Open Rules", openPanel); 
+1

['openPanel.revalidate()'](https://docs.oracle.com/javase/7/docs/api/javax [ /swing/JComponent.html#revalidate())? – nullpointer

+1

@nullpointer:是的,我應該提到,因爲這比'validate()'更好。除非更改GUI的外觀,否則'updateUI()'幾乎不會被調用。對於像這樣的問題,最好發佈一個有效的[mcve]。 –

+0

好的,所以你**都是使用GroupLayout的 - 所以選擇一個不同的,看看它是怎麼回事。請查看下面對我的答案的編輯,如果您有任何問題,請發表評論。 –

回答

1

有幾個潛在的問題在這裏,但一個主要的問題可能是由於使用openPanel一些管理者更容易在飛行中添加新的組件時與之合作的佈局管理器比其他的,比如FlowLayout和GridLayout - 非常容易添加,與GroupLayout和null佈局 - 真正的熊。

找出在openPanel上使用哪種佈局,如有必要更改佈局,然後重試。

另一個潛在的問題是openPanel的大小 - 是否足夠大以至於無法看到並接受JTextField?在它周圍放一個邊框,看看自己。


編輯:由空指針指出的那樣,你應該就可以改變組件後呼籲的JPanel revalidate(),不validate()永不updateUI()除非你改變了圖形用戶界面的外觀和感覺後調用它。如果仍然卡住,並且上述建議無法解決您的問題,請創建併發布有效的mcve(請查看鏈接)。


編輯:OK,你發佈的代碼表明你已經給你的openPanel一個的GroupLayout佈局管理器,正如我上面提到,這個經理不適合當你想新的組件添加到容器非常寬容在飛行中。您聲明代碼是由NetBeans生成的,並且您是正確的,但佈局是由您選擇的,您可以(也應該)選擇不同的佈局。查看openPanel容器的屬性面板中可用的佈局,並選擇更加用戶友好的佈局。哪一個?這真的取決於你想要創建什麼類型的GUI。如果您只將一個組件添加到此JPanel,則最簡單的方法是使用FlowLayout,然後您可以嘗試使用該組件。也明白你可以嵌套JPanels,每個使用它自己的佈局管理器來創建在所有操作系統上都很好看的令人愉快和複雜的GUI。

您可以在這裏找到佈局管理器教程:Layout Manager Tutorial,您可以在這裏找到指向Swing教程和其他Swing資源的鏈接:Swing Info

+0

無論如何我的投票界限爲+1。 :) – nullpointer

0

有幾件事情可能會出錯,其中一個是字段大小和麪板佈局。您是否更改了openPanel的默認佈局(假設這是JPanel,FlowLayout是JPanel的默認佈局)? 您可以嘗試爲文本字段設置硬編碼值並僅爲測試刪除邊框

+0

FlowLayout是netbeans中的默認值。我嘗試不同的佈局,沒有太大的成功。我確實嘗試了對文本字段進行硬編碼,並刪除了其他內容的邊界... – wsteve

+0

@wsteve:correction:FlowLayout是Swing中JPanel的默認佈局。如果您嘗試過並且仍然卡住,請在您的問題中顯示更新的代碼。另外,請考慮閱讀並回答**所有**給出的答案,而不僅僅是這一個。 –

+0

感謝您的幫助。我花了太多的時間來完成這項工作。我想我會或者1)使用netbeans設計創建所有jtextField,然後在我的代碼運行時稍後填充它們。或者2)自己創建對話框/面板等,然後創建jtextfields。我知道這會工作,雖然我已經完成了一段時間。我只是想盡量避免所有這些工作,但在這一點上它可能是有意義的。我可以將整個文件發佈到stackoverflow上,看看是否有其他人可以弄清楚。 – wsteve