ตัวอย่างการใช้งาน JTable บน Netbeans

ตัวอย่างต่อไปนี้ผมจะใช้ JTable เพื่อแสดงข้อมูลของ Student ซึ่งในที่นี้ผมจะใช้ คลาส Student เพื่อใช้เก็บข้อมูลของออปเจคต์แต่ละตัว โดยคลาสนี้จะมีแอทริบิวต์อยู่ด้วยกัน 3 ตัวคือ id  name และ gpa ดังโค๊ดต่อไปนี้

// Student.java

public class Student {

    private String id;
    private String name;
    private double gpa;

    public Student(String id, String name,double gpa ) {
        this.id = id;
        this.name = name;
        this.gpa = gpa;
    }

    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;
    }
}

ขั้นตอนต่อไปคือการสร้างคลาส model ให้กับ JTable เพื่อใช้ในการแสดงผล ในที่นี้ผมใช้
ArrayList ชนิด Student เพื่อเก็บข้อมูลของนักเรียนทุกคน ดังตัวอย่างโค๊ดต่อไปนี้

//StudentTableModel.java

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class StudentTableModel extends AbstractTableModel {

    ArrayList<Student> students ;
    String[] header={"ID","Name","GPA"};

    public StudentTableModel(){
        students = new ArrayList<Student>();
        initDatas();
    }

    //กำหนดค่าเริ่มต้นให้กับข้อมูล
    private void initDatas(){
       students.add(new Student("s001", "Suchart",3.5 ));
       students.add(new Student("s002", "Padping" ,3.4));
       students.add(new Student("s003", "Lindum" ,1.25));
    }

    @Override
    public String getColumnName(int columnId){
        //return ชื่อของแต่ละ column ที่ต้องการแสดงใน table
        return header[columnId] ;
    }

    @Override
    public int getRowCount() {
        //return จำนวนแถวข้อมูลทั้งหมด
        return students.size();
    }

    @Override
    public int getColumnCount() {
        //return จำนวนของ column
        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() ;

                default : return null;
            }
        }
    }

}

ต่อไปผมแสดงวิธีการสร้าง JTable ด้วย Netbeans IDE และการกำหนดค่าให้กับ table โดยใช้ model จากคลาสข้างต้นครับ

ก่อนอื่นสร้างไฟล์ชนิด JFrame Form ด้วย Netbeans ขึ้นมาและเพิ่มคอมโพเนนต์ JTable ให้ได้ดังรูป

จากนั้น คลิ๊กขวาที่ table เลือกเมนู Customize Code (เมนูอันที่ 2 จากด้านล่าง) จะปรากฏไดอะล็อกให้แก้ไขโค๊ดในส่วน Initialization Code ส่วนที่ 2 ให้เลือกเป็น custom property จากนั้นแก้ไขโค๊ดให้เป็นดังรูป จากนั้นกดปุ่ม OK

เมื่อเรารันไฟล์ดังกล่าวจะปรากฏผลลัพธ์ดังรูป

เท่านี้เราก็สามารถปรับแต่งให้ JTable ในโปรแกรมของเรามีความยืดหยุ่นได้   ยกตัวอย่างเช่นเราสามารถแก้ไขโค๊ดให้โหลดข้อมูลจากไฟล์หรือดาต้าเบสได้จากคลาส model ครับ

หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่สนใจในการเขียนโปรแกรมภาษาจาวานะครับ แล้วพบกันใหม่ในบทความหน้าครับ : )

Advertisements

19 thoughts on “ตัวอย่างการใช้งาน JTable บน Netbeans

Add yours

    1. ครับ วิธีนี้เป็นรูปแบบง่าย ๆ สำหรับ 1 คลาส 1 table ครับ แต่ถ้าคุณต้องทำเยอะๆ ผมว่าก็เหนื่อยเหมือนกัน แค่ entity class ก็หนักแล้ว ไหนต้องทำ table model อีก
      แนะนำลองเขียนคลาสขึ้นมาสักตัว เพื่อสร้าง entity class และ table model จากตารางที่คุณมีก็ได้นะครับ ที่เหลือก็แค่เซ็ต property ใน netbeans

  1. ผมอยากจะสอบถามอีกนิดนึ่งครับ ในส่วนเมธอดนี้
    private void initDatas(){
    students.add(new Student(“s001”, “Suchart”,3.5 ));
    students.add(new Student(“s002”, “Padping” ,3.4));
    students.add(new Student(“s003”, “Lindum” ,1.25));
    }

    <>
    ถ้าเรามีข้อมูลมากกว่า 3 แถว เช่น มี 500 แถวมันก็จะสร้างออบเจ็กต์ 500 ครั้ง แล้วจะมีผลทำให้โปรแกรมทำงานช้าไหมครับ จะเป็นการสร้างออบเจ็กต์โดยสิ้นเปลืยงและใช้ทรัพยากรของเครื่องมากเกินไปหรือเปล่าครับ?

  2. ผมเขียนลักษณะนี้อ่ะครับแต่ผมไม่มั่นใจว่าวิธีนี้จะดีหรือเปล่าถ้านำเอาไปสร้างโปรเจ็กต์ระดับเล็ก-ระดับกลาง ไม่ค่อยแข็งแรงเรื่อง OOP เท่าไหร่ครับกลัวว่าบ้านที่สร้างอย่างสวยงามจะพังทลายลงสักวัน

    public class Province {
    private String ProvinceID;
    private String ProvinceName;

    public Province(String ProvinceID, String ProvinceName) {
    this.ProvinceID = ProvinceID;
    this.ProvinceName = ProvinceName;
    }

    public String getProvinceID() {
    return ProvinceID;
    }

    public void setProvinceID(String ProvinceID) {
    this.ProvinceID = ProvinceID;
    }

    public String getProvinceName() {
    return ProvinceName;
    }

    public void setProvinceName(String ProvinceName) {
    this.ProvinceName = ProvinceName;
    }

    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public class ProvinceTable {

    private Database db;

    public ProvinceTable(Database db) {
    this.db = db;
    }

    public List loadDB() {
    String sql = “Select * from Province Order by ProvinceID ASC”;
    List list = new ArrayList();//สร้างออบเจ็กต์อาเรย์ลิสของคลาส Province
    List<Map> result = db.queryList(sql);

    for (Map row : result) {
    Province pty = new Province(
    (String) row.get(“ProvinceID”),
    (String) row.get(“ProvinceName”));
    list.add(pty);
    }
    return list;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    public class Database {

    public List<Map> queryList(String sql) {
    ……………………………………….
    return list;
    }
    public void add(..) {

    }
    public void Update(..) {

    }
    public void Delete(..) {

    }
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //คลาสฟอร์ม
    //นำไปใว้ใน Constructor เพื่อโหลดข้อมูลให้ JTable
    private void loadDB() {
    Set.setNoTableEmtry(tbProvince);
    List result = pvtb.loadDB();
    for (Province productType : result) {
    model.addRow(new Object[]{productType.getProvinceID(), productType.getProvinceName()});
    }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ช่วยเสนอคำแน่ะนำหน่อยครับ ขอบคุณครับ

  3. โค๊ดก็โอเคเคลียร์ นะครับ ส่วนตรงฟอร์มนั้นผมเห็นว่าตอน addRow มีการสร้างออปเจคต์เพิ่มเติมด้วย ตรงนี้ไม่รู้ว่าจะทำให้เปลืองเมโมรีหรือเปล่านะครับ ลองเปรียบเทียบกับการทำ table model ดูนะครับ

ใส่ความเห็น

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

Up ↑

%d bloggers like this: