1. 程式人生 > >高階Swing介面JTable程式設計

高階Swing介面JTable程式設計

1.TableModel與JTable的關係:

TableModel它是一個介面,

javax.swing.JTable table=new javax.swing.JTable();

table.setModel(new 實現了TableModel介面的類);

 首先,我們編寫一個TableModel的實現類如下:

import javax.swing.event.TableModelListener;

/**自定義的tableModel實現類*/

public class MyTableModelV1  implementsjavax.swing.table.TableModel{

       //

多少行:

    public int getRowCount(){

           return 10;

    }

  //多少列

    public int getColumnCount(){

           return 5;

    }

//取得列名

    public String getColumnName(int columnIndex){

           return " "+columnIndex+"列名";

    }

    //每一列的資料型別:我們這裡顯示的都是String

    public Class<?>getColumnClass(int

columnIndex){

            return String.class;

    }

   //指定的單元格是否可從介面上編輯

    public boolean isCellEditable(int rowIndex, int columnIndex){

           if(columnIndex==0){

                  return false;

           }

          return true;

    }

    //取得指定單元格的值

    public Object getValueAt(int rowIndex, int

columnIndex){

           return rowIndex+"--"+columnIndex;

    }

   //從表格介面上改變了某個單元格的值後會呼叫這個方法

   public void setValueAt(Object aValue, int rowIndex, int columnIndex){

        String s="Change at: "+rowIndex+"--- "+columnIndex+" newValue: "+aValue;

        System.out.println(s);

    }

   //這兩個介面方法暫無用

    public void addTableModelListener(TableModelListenerl){}

    public voidremoveTableModelListener(TableModelListener l){}

}

用以顯示這個Model的Jtable和介面程式碼如下:

//TableModel應用測試

public class TestJTable {

       //程式入口

       public static void main(String[] args) {

              javax.swing.JFrame jf=new javax.swing.JFrame("表格測試");

              jf.setSize(300,400);

              java.awt.FlowLayout fl=new java.awt.FlowLayout();

              jf.setLayout(fl);

              //1.建立一個預設的簡單表格對像:

              javax.swing.JTable table=new javax.swing.JTable();

              //2.建立我們自定義的TableModel物件

              MyTableModelV1   tm=new MyTableModelV1();

              //3.將其設定為TableModel

              table.setModel(tm);

              jf.add(table);

              jf.setDefaultCloseOperation(3);

              jf.setVisible(true);

       }

}


3.使用JTable+TableModel展示java中的資料物件:

首先,我們需要編寫自己的TableModel類,即實現了JtableModel介面的類,這個實現類使用裝有UserInfo的List物件,負責將列表中的使用者物件資訊提供給Jtable物件顯示:

import java.util.List;

import javax.swing.event.TableModelListener;

import javax.swing.table.TableModel;

/**

 * 用以在JTable中顯示UserInfo物件的TableModel實現類

 * @author: 藍傑

 */

public class UserInfoTableModel implements TableModel{

       privateList<UserInfo> userList; //要顯示的UserInfo物件列表

      //建立模型物件時,必須傳入要顯示的UserInfo物件列表

      public UserInfoTableModel(List<UserInfo> userList){

          this.userList=userList;

      }

    //得到行數:列表中有幾個UserInfo物件,就顯示幾行

     public int getRowCount(){

        return userList.size();

     }

     //得到列數,UserInfo物件的每個屬性是一列,id,name,age,3

     public int getColumnCount(){

        return 3;

     }

     //指定某列的型別:暫時都是字串型別,

     public Class<?> getColumnClass(int columnIndex){

        return String.class;

     }

     //得到指定單元格的值:第幾行,就是列表中的第幾個UserInfo物件

     public Object getValueAt(int rowIndex, int columnIndex){

       // 第幾行,就是列表中的第幾個UserInfo物件

    UserInfo user=userList.get(rowIndex);

        if(columnIndex==0){//第一列是UserInfo物件的id

            return ""+user.getId();

        }else if(columnIndex==1){//第二列是name屬性值

            return user.getName();

        }else if(columnIndex==2){//第二列是age

            return ""+user.getAge();

        }else{//除非設計時邏輯錯誤,否則不會到這裡

            return "出錯!";

        }

     }

     //介面資料有變化時,模型物件的這個方法會被呼叫,暫時彈出說明框

 public void setValueAt(Object aValue, int rowIndex, int columnIndex){

Stringinfo=rowIndex+""+columnIndex+"列的值改變: "+aValue.toString();

     javax.swing.JOptionPane.showMessageDialog(null,info);

 }

     //指定某單元格是否可編輯:第一列不可編緝,第一列是ID,是每個物件的唯一識別號

     public boolean isCellEditable(int rowIndex, int columnIndex){

        if(columnIndex!=0){

        return true;

        }

        return false;

     }

     //取每一列的列名

     public String getColumnName(intcolumnIndex){

        if(columnIndex==0){//第一列是UserInfo物件的id

               return "";

            }else if(columnIndex==1){//第二列是name屬性值

               return "";

            }else if(columnIndex==2){//第二列是age

               return "";

           }else{//除非設計時邏輯錯誤,否則不會到這裡

               return "出錯!";

           }

     }

     //新增和移除監聽器的方法暫不用,寫為空的

     public void addTableModelListener(TableModelListenerl){}

public void removeTableModelListener(TableModelListenerl){}

}

 接下來,我們建立介面和JTable物件,使用我們新編寫的UserInfoTableModel物件顯示使用者資料。

/**

 * JTableTableModel使用示例 v1

 * @author: 藍傑

 */

public class UserTableUIV1 {

     //程式入口

    public static void main(String[] args) {

       UserTableUIV1 lu=new UserTableUIV1();

       lu.setupUI();

    }

    //顯示主介面

    public void setupUI(){

javax.swing.JFramejf=new javax.swing.JFrame("JTable-TableModel示例");

       jf.setSize(300,200);

       java.awt.FlowLayout fl=new java.awt.FlowLayout();

       jf.setLayout(fl);

       //建立一個表格物件

       final javax.swing.JTabletable=new javax.swing.JTable();

       //得到要顯示的使用者列表物件:

       List<UserInfo>userList=getUserList();

       //建立我們實現的TableModel物件,建立時要傳入使用者列表物件

       UserInfoTableModel tm=new UserInfoTableModel(userList);

        table.setModel(tm);//將模型設給表格

       jf.add(table);

        jf.setDefaultCloseOperation(3);

        jf.setVisible(true);

    }

    //模擬生成使用者物件列表

    private List<UserInfo> getUserList(){

       List<UserInfo> uList=new ArrayList();

       for(int i=0;i<100;i++){

           UserInfo user=new UserInfo();

           user.setId(i+1);

           user.setAge(20+i);

           user.setName("使用者"+i);

           uList.add(user);

       }

       return uList;

    }

}


1.設定表格的寬度和高度:

如下程式碼示例:

//設每一列的寬度

        for(int i=0;i<table.getColumnCount();i++){

        table.getColumnModel().getColumn(i).setPreferredWidth(40);

         }

        table.setRowHeight(20);//設定每一列的高度

2.要顯示錶頭:

要將Jtable放到滾動板(javax.swing.JscrollPane)上,並設定其大小:

  效果圖如下:


//將表格物件放到滾動面板物件上

        javax.swing.JScrollPane scrollPane = new JScrollPane(table);

        //設定表格在面板上的大小

table.setPreferredScrollableViewportSize(new Dimension(200, 70));

         //超出大小後,JScrollPane自動出現滾動條

        scrollPane.setAutoscrolls(true);

         jf.add(scrollPane);//scrollPane物件加到介面上

3.新加列,將列設為下拉框:

程式碼示例:



4.表格排序:

排序要實現的功能是,當單擊表頭時,所在列會自動排序,程式碼段如下:

RowSorter<javax.swing.table.TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());

        table.setRowSorter(sorter);

JTable事件響應是非常簡單,如下程式碼片斷所示,我們可以給表格加上一個滑鼠事件監聽器,當滑鼠單擊表格(上的某一個單元格)時,彈出單元格所在的行表和單元格中的值:

//table加上一個滑鼠事件監聽器物件

        table.addMouseListener(new java.awt.event.MouseAdapter(){

             public void mouseClicked(MouseEvent e) {//僅當滑鼠單擊時響應

                //得到選中的行列的索引值

               int r= table.getSelectedRow();

               int c= table.getSelectedColumn();

               //得到選中的單元格的值,表格中都是字串

               Object value= table.getValueAt(r, c);

            String info=r+""+c+" : "+value.toString();

            javax.swing.JOptionPane.showMessageDialog(null,info);

             }

         });

   效果如下圖示:


表格某個單元格的值被編輯後,當焦點移出時,表格會自動呼叫自己的模型的setValueAt方法,傳入改變後的值和行列索引,這個功能也可被利用來做事件響應。

JTable和JTree是Swing介面應用中兩種常用的高階元件,如果我們能將JTree和JTable的應用組合起來,完善我們的《日誌管理系統》,使用JTree導航,使用JTable展示資料,如下圖示: