2013-08-07 48 views
6

Trước hết tôi xin lỗi vì bỏ bê tiếng Anh của tôi rằng tôi sẽ giải thích mọi vấn đề của tôi.Làm thế nào để thêm JCheckBox trong JTable?

Đầu tiên tôi muốn JCheckBox trong JTable tôi có.

Tôi đang truy xuất id sinh viên và tên sinh viên từ cơ sở dữ liệu trong chỉ mục cột 0 và 1. Tôi muốn cột thứ ba nên vắng mặt/hiện tại, ban đầu sẽ xem liệu sinh viên có mặt hay vắng mặt bằng giá trị JCheckbox.

Ở đây mã của tôi cho các giá trị 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; 
    } 
} 

MÃ NÀY dành GIÁ TRỊ TỪ CƠ SỞ DỮ LIỆU TIẾT KIỆM CNTT VÀO VECTOR

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     
} 

Vấn đề của tôi là tôi không thể thêm JCheckBox trước mỗi học sinh tôi đã thấy mô hình JTabel, trình kết xuất đồ họa và tất cả nhưng tôi không nhận được gì. Tôi muốn một cái gì đó như thế này ...

enter image description here

Tôi đã tìm kiếm các công cụ này cho một vài tuần nhưng đã bot được bất cứ điều gì phù hợp cho điều này

+2

VUI LÒNG KHÔNG hét – Dahaka

+0

đâu tôi đang la hét? Tôi đang giải thích vấn đề của mình. – JavaTweaker

+1

+1 cho mã và ảnh chụp màn hình. –

Trả lời

8

Bắt đầu với How to use tables.

Mô hình bảng của bạn cần nhiều thứ.

  1. Cần trả lại Boolean.class từ phương thức getColumnClass cho cột thích hợp. Bạn sẽ cần phải ghi đè phương thức này.
  2. Phương pháp isCellEditable sẽ cần phải trả lại true cho cột bảng bạn muốn chắc có thể chỉnh sửa (vì vậy người dùng có thể thay đổi giá trị của cột)
  3. Bạn mô hình bảng đang sẽ cần phải có khả năng giữ giá trị cho cột
  4. Hãy chắc chắn rằng bạn vượt qua một giá trị hợp lệ cho cột boolean cho hàng, nếu không nó sẽ được null

cập nhật với ví dụ đơn giản

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 Tôi rất muốn giới thiệu bạn tránh được các biên tập viên hình thức cho đến khi bạn có một sự hiểu biết tốt hơn về Swing làm việc như thế nào - IMHO

+0

@mKorbel Tôi thực sự không thực sự thích' DefaultTableModel' – MadProgrammer

+0

. có thể được mà không cần thực hiện bất kỳ Mô hình trừu tượng nào ?? – Krishna

+1

Không thực sự, bảng yêu cầu loại lớp cho cột được Boolean để cho nó hoạt động – MadProgrammer

1

Vâng, nếu bạn thêm Boolean giá trị như dữ liệu vào mô hình bảng, DefaultCellRendered sẽ hiển thị nó dưới dạng checbox của chính nó, vậy đâu là vấn đề?

+2

Không thực sự. Trừ khi 'TableModel # getColumnClass' trả về' Boolean.class', bảng sẽ sử dụng các giá trị 'toString' làm giá trị được hiển thị .... – MadProgrammer