高级Swing界面JTable编程

1.JTable与TableModel

1.TableModel与JTable的关系:

TableModel它是一个接口,

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

table.setModel(new 实现了TableModel接口的类);

2.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 ClassgetColumnClass(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 userList; //要显示的UserInfo对象列表

      //创建模型对象时,必须传入要显示的UserInfo对象列表

      public UserInfoTableModel(List 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();

       //得到要显示的用户列表对象:

       ListuserList=getUserList();

       //创建我们实现的TableModel对象,创建时要传入用户列表对象

       UserInfoTableModel tm=new UserInfoTableModel(userList);

        table.setModel(tm);//将模型设给表格

       jf.add(table);

        jf.setDefaultCloseOperation(3);

        jf.setVisible(true);

    }

    //模拟生成用户对象列表

    private List getUserList(){

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

    }

}


2.JTable展示方式的美化:

1.设置表格的宽度和高度:

如下代码示例:

//设每一列的宽度

        for(int i=0;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 sorter = new TableRowSorter(table.getModel());

        table.setRowSorter(sorter);

3. JTable事件响应和项目设想

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展示数据,如下图示:


你可能感兴趣的:(java,swing)