2014-01-29 183 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