2013-08-07 59 views
6

首先我为我的英语忽视道歉,我会解释我的所有问题。如何在JTable中添加JCheckBox?

首先我想JCheckBox的JTable中我有。

我取回学生证和学生的名字从数据库中列索引0和1。我想第三栏应该是缺席/当前初期将采取学生是否是JCheckBox的价值存在或不存在。

我这里JTable的值码:

Attendance.java

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package shreesai; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.util.Vector; 

/** 
* 
* @author Admin 
*/ 
public class Attendance{ 

    Connection con = Connectdatabase.ConnecrDb(); 
    public Vector getEmployee()throws Exception 
    { 

     Vector<Vector<String>> employeeVector = new Vector<Vector<String>>(); 

     PreparedStatement pre = con.prepareStatement("select studentid,name from student"); 
     ResultSet rs = pre.executeQuery(); 
     while(rs.next()) 
     { 

      Vector<String> employee = new Vector<String>(); 
      employee.add(rs.getString(1)); //Empid 
      employee.add(rs.getString(2));//name 
      employeeVector.add(employee); 

     }   
     if(con!=null) 
     con.close(); 
     rs.close(); 
     pre.close(); 

     return employeeVector; 
    } 
} 

此代码为取值从数据库中保存它为矢量

AttendanceGUI.java

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package shreesai; 

import static java.awt.Frame.MAXIMIZED_BOTH; 
import java.util.Vector; 
import javax.swing.JOptionPane; 

/** 
* 
* @author Admin 
*/ 
public class AttendanceGUI extends javax.swing.JFrame { 

    /** 
    * Creates new form AttendanceGUI 
    */ 
    private Vector<Vector<String>> data; 
    private Vector<String> header; 
    public AttendanceGUI() throws Exception { 

     this.setLocationRelativeTo(null); 
     setExtendedState(MAXIMIZED_BOTH); 
     Attendance att = new Attendance(); 
     data = att.getEmployee(); 

     header = new Vector<String>(); 
     header.add("Student ID"); 
     header.add("Student Name"); 
     header.add("Absent/Present"); 
     initComponents(); 
    } 
    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jScrollPane1 = new javax.swing.JScrollPane(); 
     AttendanceT = new javax.swing.JTable(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     AttendanceT.setModel(new javax.swing.table.DefaultTableModel(
      data,header 
     )); 
     jScrollPane1.setViewportView(AttendanceT); 

     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(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(397, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(89, Short.MAX_VALUE)) 
     ); 

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

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try{ 
        new AttendanceGUI().setVisible(true); 
       } 
       catch(Exception e){ 
        JOptionPane.showMessageDialog(null,e); 
       } 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.swing.JTable AttendanceT; 
    private javax.swing.JScrollPane jScrollPane1; 
    // End of variables declaration     
} 

我的问题是,我无法在每个我看过JTabel模型,渲染器和所有学生的前面添加一个JCheckBox,但我什么也没得到。我想是这样的......

enter image description here

我搜索了这个东西几个星期,但如果添加Boolean值数据为根本机器人得到适合这个

+2

请不要喊叫 – Dahaka

+0

我的叫喊?我正在解释我的问题。 – JavaTweaker

+1

+1代码和截图。 –

回答

8

开始How to use tables

你的表模型需要几件事情。

  1. 它需要从getColumnClass方法返回Boolean.class适当的列。您将需要重写此方法。
  2. 方法isCellEditable需要返回true为表列要进行编辑(因此用户可以更改列的值)
  3. 你表模型将需要能够保持对价值列
  4. 确保你通过了该行的boolean列有效的值,否则将被null

更新了简单的例子

enter image description here

import java.awt.EventQueue; 
import java.util.Vector; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class TableTest { 

    public static void main(String[] args) { 
    new TableTest(); 
    } 

    public TableTest() { 
    startUI(); 
    } 

    public void startUI() { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      ex.printStackTrace(); 
     } 

     MyTableModel model = new MyTableModel(); 
     model.addRow(new Object[]{0, "Brian", false}); 
     model.addRow(new Object[]{1, "Ned", false}); 
     model.addRow(new Object[]{2, "John", false}); 
     model.addRow(new Object[]{3, "Drogo", false}); 
     JTable table = new JTable(model); 

     JFrame frame = new JFrame("Testing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     } 
    }); 
    } 

    public class MyTableModel extends DefaultTableModel { 

    public MyTableModel() { 
     super(new String[]{"ID", "Name", "Present"}, 0); 
    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     Class clazz = String.class; 
     switch (columnIndex) { 
     case 0: 
      clazz = Integer.class; 
      break; 
     case 2: 
      clazz = Boolean.class; 
      break; 
     } 
     return clazz; 
    } 

    @Override 
    public boolean isCellEditable(int row, int column) { 
     return column == 2; 
    } 

    @Override 
    public void setValueAt(Object aValue, int row, int column) { 
     if (aValue instanceof Boolean && column == 2) { 
     System.out.println(aValue); 
     Vector rowData = (Vector)getDataVector().get(row); 
     rowData.set(2, (boolean)aValue); 
     fireTableCellUpdated(row, column); 
     } 
    } 

    } 

} 

的PS我会强烈建议你避免表格编辑,直到你有一个更好的了解摇摆如何工作 - 恕我直言

+0

@mKorbel我真的,真的不喜欢'DefaultTableModel' – MadProgrammer

+0

可以吗有可能不做任何抽象模型? – Krishna

+1

不是真的,该表要求该列的类类型为布尔值才能使其工作 – MadProgrammer

1

好东西表格模型DefaultCellRendered将自己渲染为checbox,那么问题出在哪里?

+2

不是。除非'TableModel#getColumnClass'返回'Boolean.class',表格将使用值'toString'作为要渲染的值.... – MadProgrammer