ตัวอย่างการใช้งาน 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 ครับ

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

19 ตอบกลับไปที่ “ตัวอย่างการใช้งาน JTable บน Netbeans”

  1. […] Student ที่ได้กล่าวถึงในบทความที่แล้ว(ตัวอย่างการใช้ JTable บน Netbeans IDE) โดยปรับปรุงคลาส Student […]

  2. ปรัชพงษ์ บุญสุข Avatar
    ปรัชพงษ์ บุญสุข

    ขอบคุณครับ จะไปลองทำดู

    1. ด้วยความยินดีครับ : )

  3. วิธีนี้จะสะดวกไหมครับ ถ้าผมทำ binding ใน Table หลายๆ Table ก็ต้องสร้างคลาสลักษณะนี้ทุกคลาส
    เลยหรือครับ

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

  4. ขอบคุณมากครับ เดี๋ยวจะลองทำตามคำแน่ะนำดูครับ

  5. ผมอยากจะสอบถามอีกนิดนึ่งครับ ในส่วนเมธอดนี้
    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 ครั้ง แล้วจะมีผลทำให้โปรแกรมทำงานช้าไหมครับ จะเป็นการสร้างออบเจ็กต์โดยสิ้นเปลืยงและใช้ทรัพยากรของเครื่องมากเกินไปหรือเปล่าครับ?

  6. ถ้าข้อมูลมากขนาดนั้น แนะนำว่าให้ query มาเฉพาะที่เราจะแสดงผลใน page เดียวนะครับ(ใช้ตัวกรองช่วย)

  7. ขอบคุณครับ แต่ว่าผมเขียน App ครับ ในบ้างตารางต้อง query ออกมาแสดงใน JTable ทั้งหมดครับ

    1. ลองเขียนดูก่อนครับ ถ้ามีปัญหาเรื่อง memory ก็ลองมาแชร์กันนะครับ

  8. ผมเขียนลักษณะนี้อ่ะครับแต่ผมไม่มั่นใจว่าวิธีนี้จะดีหรือเปล่าถ้านำเอาไปสร้างโปรเจ็กต์ระดับเล็ก-ระดับกลาง ไม่ค่อยแข็งแรงเรื่อง 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()});
    }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ช่วยเสนอคำแน่ะนำหน่อยครับ ขอบคุณครับ

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

  10. ขอบคุณมากนะครับสำหรับคำแน่ะนำ

  11. แล้วจะเรียงลำดับทำอย่างไรครับ

  12. เป็นไงบ้างครับ ทักทายครับผม..

    1. สบายดีครับ ขอโทษที่ตอบกลับช้าไปหน่อยครับ ^ ^

  13. อยากทราบการทำให้เชื่อมต่อกับDatabaseได้ครับ

  14. เขียนโค๊ดจำลองการจัดดเวลาซีพียูให้ผมหน่อยคัฟ

ส่งความเห็นที่ sarayut ยกเลิกการตอบ