2011-03-14 231 views
3

我在我的Java應用程序上有一個表單,它基本上是向用戶提供來自DB查詢的數據列表。一個想法是使用一個表並用結果集中的數據填充每行。然而,在設計UI時,我的團隊決定它看起來不像我們想要的那樣流暢。所以我們認爲我們會考慮在面板中創建結果的自定義視圖。我們希望它看起來像這樣: Desired custom view動態添加JPanel到Jframe

因此,而不是一個表的行它將看起來像這樣與結果集上的每個查詢一個。

我遇到的問題是對此進行編碼。我花了很多時間試着研究如何將組件添加到JForm中。因爲NetBeans默認將UI設置爲組播組?所以我摸索出瞭如何使用添加1個面板:

javax.swing.JLabel idLbl; 
javax.swing.JLabel jLabel1; 
javax.swing.JLabel jLabel3; 
javax.swing.JLabel jLabel5; 
javax.swing.JLabel jLabel7; 
javax.swing.JPanel jPanel1; 
javax.swing.JLabel prefContactLbl; 
javax.swing.JLabel propertyLabel; 
    jPanel1 = new javax.swing.JPanel(); 
    jLabel1 = new javax.swing.JLabel(); 
    idLbl = new javax.swing.JLabel(); 
    jLabel3 = new javax.swing.JLabel(); 
    propertyLabel = new javax.swing.JLabel(); 
    jLabel5 = new javax.swing.JLabel(); 
    contactLabel = new javax.swing.JLabel(); 
    jLabel7 = new javax.swing.JLabel(); 
    prefContactLbl = new javax.swing.JLabel(); 

    jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); 

    jLabel1.setFont(new java.awt.Font("Tahoma", 1, 12)); 
    jLabel1.setText("Enquiry Id:"); 
    jLabel1.setName("jLabel"+i); 

    idLbl.setText("jLabel2"); 

    jLabel3.setFont(new java.awt.Font("Tahoma", 1, 12)); 
    jLabel3.setText("Property:"); 

    propertyLabel.setText("A property Address in some town with a postcode"); 

    jLabel5.setFont(new java.awt.Font("Tahoma", 1, 12)); 
    jLabel5.setText("Contact:"); 

    contactLabel.setText("A Persons Name (01010100011)"); 

    jLabel7.setFont(new java.awt.Font("Tahoma", 1, 12)); 
    jLabel7.setText("Prefered Contact:"); 

    prefContactLbl.setText("Email/Phone"); 

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
    jPanel1.setLayout(jPanel1Layout); 
    jPanel1Layout.setHorizontalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel1Layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(jPanel1Layout.createSequentialGroup() 
        .addComponent(jLabel1) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
        .addComponent(idLbl) 
        .addGap(18, 18, 18) 
        .addComponent(jLabel3) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
        .addComponent(propertyLabel)) 
       .addGroup(jPanel1Layout.createSequentialGroup() 
        .addComponent(jLabel7) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
        .addComponent(prefContactLbl) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
        .addComponent(jLabel5) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
        .addComponent(contactLabel))) 
      .addContainerGap(20, Short.MAX_VALUE)) 
    ); 
    jPanel1Layout.setVerticalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel1Layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(jLabel1) 
       .addComponent(idLbl) 
       .addComponent(jLabel3) 
       .addComponent(propertyLabel)) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(jLabel7) 
       .addComponent(prefContactLbl) 
       .addComponent(jLabel5) 
       .addComponent(contactLabel)) 
      .addContainerGap()) 
    ); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(10 , 10, 10) 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(100, Short.MAX_VALUE)) 
    ); 

    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(570, Short.MAX_VALUE)) 
    ); 

我面對的增加超過1動態我完全地不知道該如何去做所有我能找到的主要問題是要設置佈局不更新它。我無法設置多少.addcomponent作爲它的動態。真的很困惑如何去做這件事。

對不起,如果它很難找出我想要的更容易想到它,但把它放入文字是一場噩夢。

回答

8

通過封裝一些東西開始,會讓你的生活更輕鬆。創建一個JPanel的子類,它代表一個查詢條目的視圖:EnquiryPanelEnquiryPanel將在其中的代碼幾乎與上面粘貼的代碼相匹配,只不過它會從您傳入的構造函數參數中填充自身,它本身就是JPanel

public class EnquiryPanel extends JPanel { 
    public EnquiryPanel(Result dbResult) { 
    // your layout code from above, but this is the content pane and 
    // the fields are populated from the dbResult object 
    } 
} 

然後,您可以動態地添加的EnquiryPanel情況下,一個容器板,其佈局是垂直的BoxLayout。下面我稱這個容器面板爲ResultsPanel

public class ResultsPanel extends JPanel { 
    public ResultsPanel() { 
    // Layout our contents vertically 
    BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); 
    this.setLayout(layout); 
    } 
    // method to iterate over the results from the database 
    // construct an EnquiryPanel and add that EnquiryPanel to ourselves 
    public void layoutEnquiryResults(ResultCollection results) { 
    for (Result result : results) { 
     EnquiryPanel eqPanel = new EnquiryPanel(result); 
     add(eqPanel); 
    } 
    revalidate(); 
    } 
} 

最後你的ResultsPanel一個實例添加到您的JFrame

ResultsPanel resultsPanel = new ResultsPanel(); 
resultsPanel.layoutEnquiryResults(myResultSet); 
getContentPane().add(resultsPanel); 
+0

謝謝!這有助於大時間:) – Vade 2011-03-14 19:01:30

+0

@Vade很高興我能幫上忙。 – 2011-03-14 19:10:47

+0

謝謝。你的回答對我也很有幫助。 – prometheuspk 2012-04-11 11:43:57

1

請勿使用GroupLayout。這些限制通常過於混亂而無法手動設置。

相反,我可能會使用垂直BoxLayout。添加完每個面板後,請不要忘記重新驗證()父面板。

+0

netbeans似乎將它自動設置爲一個groupplayout,它只是一個像這樣的事情:BoxLayout layout = new BoxLayout(getContentPane()); getContentPane()。setLayout(layout)? – Vade 2011-03-14 18:38:20

+0

謝謝你在Boxlayout領導這個與其他anwser排序我的問題謝謝 – Vade 2011-03-14 19:01:58