บทความนี้เป็นบทความต่อเนื่องจากบทความ ตัวอย่างการใช้งาน 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 ผมก็ขอจบไว้เพียงแค่นี้ พบกันใหม่ในบทความหน้าครับ

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s