2014-01-29 178 views
1

我希望能夠將多個選項卡添加到我的程序中。這些選項卡將包含jTable組件。我希望能夠點擊添加一個新標籤,輸入一些信息,並向表中添加一些值,然後將其插入到tabbedPane中。下面我有SSCE這樣做,但是當你嘗試添加第二個時,表格不會顯示在對話框中。任何人都可以幫我弄清楚爲什麼? (供參考:我使用NetBeans和GUI設計)將值添加到表格並將其添加到主窗體

import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JTable; 


public class tabtest extends javax.swing.JFrame { 

    public tabtest() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     addTabDialog = new javax.swing.JDialog(); 
     titleTextBox = new javax.swing.JTextField(); 
     jLabel1 = new javax.swing.JLabel(); 
     addTabConfirmButton = new javax.swing.JButton(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTable1 = new javax.swing.JTable(); 
     jLabel2 = new javax.swing.JLabel(); 
     tabPane = new javax.swing.JTabbedPane(); 
     addTabButton = new javax.swing.JButton(); 

     addTabDialog.setBounds(new java.awt.Rectangle(0, 0, 400, 400)); 

     titleTextBox.setText("New Tab"); 

     jLabel1.setText("Tab Title"); 

     addTabConfirmButton.setText("Confirm"); 
     addTabConfirmButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       addTabConfirmButtonActionPerformed(evt); 
      } 
     }); 

     jTable1.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] { 
       {null, null, null}, 
       {null, null, null}, 
       {null, null, null}, 
       {null, null, null} 
      }, 
      new String [] { 
       "assignment", "points", "score" 
      } 
     ) { 
      Class[] types = new Class [] { 
       java.lang.String.class, java.lang.Integer.class, java.lang.Integer.class 
      }; 

      public Class getColumnClass(int columnIndex) { 
       return types [columnIndex]; 
      } 
     }); 
     jScrollPane1.setViewportView(jTable1); 

     javax.swing.GroupLayout addTabDialogLayout = new javax.swing.GroupLayout(addTabDialog.getContentPane()); 
     addTabDialog.getContentPane().setLayout(addTabDialogLayout); 
     addTabDialogLayout.setHorizontalGroup(
      addTabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(addTabDialogLayout.createSequentialGroup() 
       .addGap(87, 87, 87) 
       .addComponent(jLabel1) 
       .addGap(18, 18, 18) 
       .addGroup(addTabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(titleTextBox, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGroup(addTabDialogLayout.createSequentialGroup() 
         .addGap(6, 6, 6) 
         .addComponent(addTabConfirmButton))) 
       .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, addTabDialogLayout.createSequentialGroup() 
       .addContainerGap(43, Short.MAX_VALUE) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 314, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(32, 32, 32)) 
     ); 
     addTabDialogLayout.setVerticalGroup(
      addTabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(addTabDialogLayout.createSequentialGroup() 
       .addGap(77, 77, 77) 
       .addGroup(addTabDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(titleTextBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jLabel1)) 
       .addGap(18, 18, 18) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addComponent(addTabConfirmButton) 
       .addGap(212, 212, 212)) 
     ); 

     jLabel2.setText("This is a new Tab"); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     addTabButton.setText("add new tab"); 
     addTabButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       addTabButtonActionPerformed(evt); 
      } 
     }); 
     tabPane.addTab("+", addTabButton); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(tabPane, javax.swing.GroupLayout.PREFERRED_SIZE, 326, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(64, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(tabPane, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(111, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void addTabButtonActionPerformed(java.awt.event.ActionEvent evt) {            
     addTabDialog.setLocationRelativeTo(null); 
     addTabDialog.setVisible(true);   
    }            

    private void addTabConfirmButtonActionPerformed(java.awt.event.ActionEvent evt) {              
     JTable table=jTable1; 
     tabPane.insertTab(titleTextBox.getText(),null,new JScrollPane(table),"Hello",tabPane.getTabCount()-1); 
     //tabPane.addTab(titleTextBox.getText(),newTab); 
     tabPane.setSelectedIndex(tabPane.getTabCount()-1); 
     addTabDialog.setVisible(false); 
    }             

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new tabtest().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.swing.JButton addTabButton; 
    private javax.swing.JButton addTabConfirmButton; 
    private javax.swing.JDialog addTabDialog; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JTable jTable1; 
    private javax.swing.JTabbedPane tabPane; 
    private javax.swing.JTextField titleTextBox; 
    // End of variables declaration     
} 

而且...是它更好地使用javaFX2蕩然?它會使這樣的事情更容易嗎?和揮杆編碼有很大不同嗎?有很多東西需要學習嗎?

回答

4

您只創建一個JTable,然後嘗試在整個程序中重新使用它,並且由於組件只能在GUI中顯示一次,這意味着JTable只能在一個位置顯示。相反,當需要新的JTable時,您需要創建一個新的JTable。

由於概念證明,如果你在你的addTabConfirmButtonActionPerformed(...)方法改變這一行:

JTable table = jTable1; 

這樣:

// !!!!! changes 
    // JTable table = jTable1; 
    JTable table = new JTable(); //!! 
    table.setModel(jTable1.getModel()); //!! 
    // !!!!! end of changes 

你會看到新的JTable中。請注意,對於您的代碼,這不是一個體面的解決方案,因爲每個JTable現在將共享相同的模型,這是我認爲您不需要的東西。您應該創建另一個擴展了DefaultTableModel或AbstractTableModel的類,並將該類的實例提供給每個新的JTable。


編輯
你問評論:

對於同款即時通訊將創建一個AbstractTableModel上,但想不出我只是應用該模型jTable1在我的代碼,然後它會和表一樣嗎?

添加到jTable1的模型將應用於jTable1引用的對象,不多也不少。如果您希望所有JTable在每個單元格中顯示完全相同的信息,那麼它們都可以共享相同的模型。我懷疑你想要這個。

(我可能會感到困惑的表格模型是什麼,是當2列包含整型,列1包含字符串等?或者是它的所有數據在它嗎?)

表模型包含表格的數據以及其邏輯結構 - 列數,行數等。

請查看JTable Tutorial瞭解所有血淋淋的細節。

+0

謝謝。我知道這是這樣的。至於相同的模型即時創建一個AbstractTableModel,但我不能只在我的代碼中將該模型應用於jTable1,然後它將與表一樣? (我可能會對錶模型是什麼感到困惑,當列2包含int時,列1是否包含字符串等?或者它是否也包含所有數據?) – Sup3rb0wlz

+0

@ Sup3r_b0wlz:請參閱編輯以回答。 –

+0

你真棒。哈哈很好的解釋。 – Sup3rb0wlz