บทความนี้เป็นบทความต่อเนื่องจากบทความ ตัวอย่างการใช้งาน JTable บน Netbeans ผู้เขียนขอแนะนำให้อ่านทำความเข้าใจบทความข้างต้นก่อนอ่านบทความนี้ครับ
ในกรณีที่เราต้องการให้คอลัมน์ใดๆใน JTable แสดงผลในรูปแบบ checkbox โดยใช้ โมเดลนั้น ข้อมูลในตำแหน่งดังกล่าวจะต้องเป็นข้อมูลชนิด boolean ในที่นี้ผมทำการแก้ไขคลาส Student จากตัวอย่างที่แล้วโดยเพิ่มแอทริบิวต์ใหม่คือ haveMobile และแก้ constructor ใหม่ดังนี้
public class Student { private String id; private String name; private double gpa; private boolean haveMobile; public boolean isHaveMobile() { return haveMobile; } public void setHaveMobile(boolean haveMobile) { this.haveMobile = haveMobile; } public Student(String id, String name,double gpa,boolean haveMobile ) { this.id = id; this.name = name; this.gpa = gpa; this.haveMobile = haveMobile; } public double getGpa() { return gpa; } public void setGpa(double gpa) { this.gpa = gpa; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
จากนั้นแก้ไขคลาส StudentModel ใหม่ เป็นดังนี้
public class StudentTableModel extends AbstractTableModel { ArrayList<Student> students ; String[] header={"ID","Name","GPA","Have Mobile"}; public StudentTableModel(){ students = new ArrayList<Student>(); initDatas(); } private void initDatas(){ students.add(new Student("s001", "Suchart",3.5 ,true)); students.add(new Student("s002", "Padping" ,3.4,false)); students.add(new Student("s003", "Lindum" ,1.25,true)); } @Override public String getColumnName(int columnId){ return header[columnId] ; } @Override public int getRowCount() { //return number of record return students.size(); } @Override public int getColumnCount() { //return number of field return header.length ; } @Override public Object getValueAt(int rowIndex, int columnIndex) { if( students.isEmpty() ){ return null; }else{ Student s = students.get(rowIndex); //if you have more field should specify more case here switch(columnIndex){ case 0 : // id first return s.getId() ; case 1 : return s.getName(); case 2 : return s.getGpa() ; case 3 : return s.isHaveMobile(); default : return null; } } } }
เมื่อเรารันคลาส StudentTable จะปรากฏผลลัพธ์ดังรูป
สิ่งที่สังเกตได้จาก table ดังกล่าวคือในคอลัมน์สุดท้ายแสดงข้อมูลเป็นค่าตัวแปรชนิด boolean ถ้าเราต้องการให้แสดงผลเป็น checkbox สามารถทำได้โดย override เมธอด getColumnClass ในคลาส StudentTableModel ดังนี้
@Override public Class getColumnClass(int column){ switch(column ){ case 2: return Integer.class; case 3: return Boolean.class; default: return String.class; } }
เมธอด getColumnClass ใช้เพื่อระบุว่าแต่ละคอลัมน์เป็นข้อมูลชนิดใดเพื่อที่จะได้กำหนดรูปแบบการแสดงผลให้ถูกต้อง โดยเราจะต้องระบุให้ตรงกับชนิดของข้อมูลที่เราต้องการแสดงด้วย ในที่นี้คอลัมน์ 2 และ 3 มีชนิดข้อมูลเป็น integer และ boolean จะรีเทิร์นค่าเป็น Integer.class และ Boolean.class ตามลำดับ ส่วนคอลัมน์ที่เหลือเป็น String.class
เมื่อเรา override เมธอดดังกล่าวจะได้ผลลัพธ์เป็น checkbox ตามที่เราต้องการในคอลัมน์สุดท้ายดังรูป
อย่างไรก็ตามโปรแกรมดังกล่าว เมื่อเราคลิ๊กที่ checkbox ค่าจะไม่มีการเปลี่ยนแปลง หากเราต้องการกำหนดให้มีการเปลี่ยนค่าเมื่อคลิ๊กที่ cell ดังกล่าว เราต้องทำการ override เมธอดเพิ่มอีก 2 ตัวในคลาส StudentTableModel คือ isCellEditable และ setValueAt ดังนี้
@Override public boolean isCellEditable(int rown,int column){ return column == 3 ; } @Override public void setValueAt(Object o,int rowIndex,int columnIndex){ if(columnIndex == 3){ Student s = students.get(rowIndex); s.setHaveMobile((Boolean)o); } }
ในที่นี้ผมกำหนดให้คอลัมน์ที่ 3 เท่านั้นที่สามารถแก้ไขข้อมูลได้ ถ้าผู้อ่านต้องการแก้ไขข้อมูลคอลัมน์อื่นๆ ก็สามารถทำได้ โดยกำหนดเงื่อนไขให้กับเมธอดทั้งสองครับ
สำหรับบทความของ JTable ในเรื่องการทำงานกับ checkbox ผมก็ขอจบไว้เพียงแค่นี้ พบกันใหม่ในบทความหน้าครับ