在JTable类中除了默认的构造方法之外,还提供了利用指定表格列名数组和表格数据数组创建表格的构造方法,如下:

一.创建表格控件的各种方式:
1)  调用无参构造函数.
JTable table = new JTable();
2)  以表头和表数据创建表格.
Object[][] cellData = {{“row1-col1”, “row1-col2”},{“row2-col1”,
“row2-col2”}};
String[] columnNames = {“col1”, “col2”};
   
JTable table = new JTable(cellData, columnNames);
3)  以表头和表数据创建表格,并且让表单元格不可改.
String[] headers = { “表头一”, “表头二”, “表头三” };
Object[][] cellData = null;

出处:

JTable(Object[][] rowData,Object[] columnNames)

DefaultTableModel model = new DefaultTableModel(cellData, headers) {

1.JTable与TableModel

rowData就是表格的数据数组

  public boolean isCellEditable(int
row, int column) {
    return false;
  }
};

1.TableModel与JTable的关系:

TableModel它是一个接口,

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

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

columnNames就是表格的列名数组。

table = new JTable(model);
二.对表格列的控制
1) 设置列不可随容器组件大小变化自动调整宽度.
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
2) 限制某列的宽度.
TableColumn firsetColumn = table.getColumnModel().getColumn(0);
firsetColumn.setPreferredWidth(30);
firsetColumn.setMaxWidth(30);
firsetColumn.setMinWidth(30);
3) 设置当前列数.
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int count=5;
tableModel.setColumnCount(count);
4) 取得表格列数
int cols = table.getColumnCount();
5) 添加列
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.addColumn(“新列名”);
6) 删除列
table.removeColumn(table.getColumnModel().getColumn(columnIndex));//
columnIndex是要删除的列序号
三.对表格行的控制
1) 设置行高
table.setRowHeight(20);
2) 设置当前航数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int n=5;
tableModel.setRowCount(n);
3) 取得表格行数
int rows = table.getRowCount();

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
Class<?>getColumnClass(int
columnIndex){

            return
String.class;

    }

   //指定的单元格是否可从界面上编辑

    public boolean isCellEditable(int rowIndex,int columnIndex){

           if(columnIndex==0){

                  returnfalse;

           }

          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
void
removeTableModelListener(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.将其设置为Table的Model

              table.setModel(tm);

              jf.add(table);

              jf.setDefaultCloseOperation(3);

              jf.setVisible(true);

       }

}

图片 1

使用表格时,一般将其添加到滚动面板中,然后将滚动面板加到相应的位置。

4) 添加表格行
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.addRow(new Object[]{“sitinspring”, “35”, “Boss”});
5) 删除表格行
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
model.removeRow(rowIndex);// rowIndex是要删除的行序号
四.存取表格单元格的数据
1) 取单元格数据
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
String cellValue=(String) tableModel.getValueAt(row, column);//
取单元格数据,row是行号,column是列号
2) 填充数据到表格.
注:数据是Member类型的链表,Member类如下:
public class Member{
    // 名称
    private String name;
   
    // 年龄
    private String age;
   
    // 职务
    private String title;
}
填充数据的代码:
public void fillTable(List<Member> members){
  DefaultTableModel tableModel =
(DefaultTableModel) table
  .getModel();
  tableModel.setRowCount(0);//
清除原有行
 
  // 填充数据
  for(Member member:members){
    String[] arr=new
String[3];
    arr[0]=member.getName();
    arr[1]=member.getAge();
    arr[2]=member.getTitle();
   
    // 添加数据到表格
    tableModel.addRow(arr);
  }
 
  // 更新表格
  table.invalidate();
}
2) 取得表格中的数据
public List<Member> getShowMembers(){
  List<Member> members=new
ArrayList<Member>();
 
  DefaultTableModel tableModel =
(DefaultTableModel) table
  .getModel();
 
  int
rowCount=tableModel.getRowCount();
 
  for(int i=0;i<rowCount;i++){
    Member member=new Member();
   
    member.setName((String)tableModel.getValueAt(i,
0));// 取得第i行第一列的数据
    member.setAge((String)tableModel.getValueAt(i,
1));// 取得第i行第二列的数据
    member.setTitle((String)tableModel.getValueAt(i,
2));// 取得第i行第三列的数据
   
    members.add(member);
  }
 
  return members;
}
五.取得用户所选的行
1) 取得用户所选的单行
int selectRows=table.getSelectedRows().length;// 取得用户所选行的行数
DefaultTableModel tableModel = (DefaultTableModel)
table.getModel();

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(){

        returnuserList.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对象显示用户数据。


/**

 *
JTable和TableModel使用示例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;

    }

}

图片 2


小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243
这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!

if(selectRows==1){
  int selectedRowIndex =
table.getSelectedRow(); // 取得用户所选单行 
 
  .// 进行相关处理
}
2) 取得用户所选的多行
int selectRows=table.getSelectedRows().length;// 取得用户所选行的行数
DefaultTableModel tableModel = (DefaultTableModel)
table.getModel();

2.JTable展示方式的美化:

在JTable中还提供了利用指定表格的列名向量和表格数据向量创造表格的构造方法,如下:JTable(Vector
rowData,Vector columnNames)

if(selectRows>1)
  int[]
selRowIndexs=table.getSelectedRows();// 用户所选行的序列
 
  for(int
i=0;i<selRowIndexs.length;i++){
    // 用tableModel.getValueAt(row,
column)取单元格数据
    String cellValue=(String)
tableModel.getValueAt(i, 1);
  }
}
六.添加表格的事件处理
view.getTable().addMouseListener(new MouseListener() {
  public void
mousePressed(MouseEvent e) {
    // 鼠标按下时的处理
  }

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

如下代码示例:

//设每一列的宽度

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

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

         }

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


rowDara就是表格的数据向量

  public void
mouseReleased(MouseEvent e) {
    // 鼠标松开时的处理
  }

2.要显示表头:

要将Jtable放到滚动板(javax.swing.JscrollPane)上,并设定其大小:

  效果图如下:

图片 3

//将表格对象放到滚动面板对象上

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

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

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

         //超出大小后,JScrollPane自动出现滚动条

        scrollPane.setAutoscrolls(true);

         jf.add(scrollPane);//将scrollPane对象加到界面上

columnNames就是表格的列名向量

  public void
mouseEntered(MouseEvent e) {
    // 鼠标进入表格时的处理
  }

3.新加列,将列设为下拉框:

代码示例:

图片 4

在使用表格时,有时候不需要使用滚动条,就可以在窗体中显示整个表格,在这种情况下,也可以直接将表格添加到相应的容器中。

  public void mouseExited(MouseEvent
e) {
    // 鼠标退出表格时的处理
  }

4.表格排序:

排序要实现的功能是,当单击表头时,所在列会自动排序,代码段如下:

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

        table.setRowSorter(sorter);

注意:如果是将表格添加到相应的容器中,则需要通过JTable类的getTableHeader()方法获得JTableHeader类的对象,然后再将该对象添加到容器的相应位置,否则表格将没有列名。

  public void
mouseClicked(MouseEvent e) {
    // 鼠标点击时的处理
  }
});

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

             }

         });

   效果如下图示:

图片 5

表格某个单元格的值被编辑后,当焦点移出时,表格会自动调用自己的模型的setValueAt方法,传入改变后的值和行列索引,这个功能也可被利用来做事件响应。

JTable和JTree是Swing界面应用中两种常用的高级组件,如果我们能将JTree和JTable的应用组合起来,完善我们的《日志管理系统》,使用JTree导航,使用JTable展示数据,如下图示:

图片 6

简单表格案例:

package view.flight;

import javax.swing.*;

import java.awt.*;

/**

* @author: 我的袜子都是洞

*/

public class TestGui extends JFrame {

// 列名

String[] columnName = new String[]{“航班号”, “出发时间”, “飞行时间”,
“出发地”, “目的地”, “余票”, “票价”};

// 表格具体数据

String[][] columnDate = new String[][]{

{“1”, “2019-01-18 10:05”, “90分钟”, “北京”, “纽约”, “50”, “500.0”},

{“2”, “2019-01-18 10:05”, “90分钟”, “北京”, “纽约”, “10”, “500.0”},

{“3”, “2019-01-18 10:05”, “90分钟”, “北京”, “纽约”, “10”, “500.0”},

{“4”, “2019-01-18 10:05”, “90分钟”, “北京”, “纽约”, “40”, “500.0”},

};

JTable table = new JTable(columnDate, columnName);

TestGui(String title) {

super;

init();

setComponent ();

addComponent();

addListener();

setVisible;

}

private void init () {

setSize;

// 设置窗口位置居中

setLocationRelativeTo;

// 设置布局

setLayout(new BorderLayout;

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

private void setComponent () {

// 设置第一列宽度为40

table.getColumnModel().getColumn.setPreferredWidth;

// 设置第二列宽度为120

table.getColumnModel().getColumn.setPreferredWidth;

}

private void addComponent () {

// 使用srcllpane会自动显示列名

JScrollPane scrollPane = new JScrollPane;

add(scrollPane, BorderLayout.CENTER);

}

private void addListener () {

}

public static void main(String[] args) {

new TestGui(“JTable演示”);

}

}

复制代码

图片 7

定制表格

表格创建之后,还需要对其进行一系列的定义,以便适合于具体的使用情况。默认情况下双击单元格便可对其编辑,如果不需要此功能,可以通过重构JTable类的isCellEditable(int
row,int
column)方法实现该方法返回boolean型值true,表示可以编辑,否则返回false则表示不可编辑。

可通过JTableHeader类的setReorderingAllowed(boolean
reorderAllowed)方法设置表格是否支持重新排列功能,该方法返回boolean型值true表示支持,返回false表示不支持。

默认情况下,单元格中的内容左侧显示,如果需要居中显示,可通过重构JTable类的getDefaultRenderer(Class<?>
columnClass)方法来实现。 重构的代码:

public TableCellRenderer getDefaultRenderer(Class<?> columnClass)
{

DefaultTableCellRenderer
cr=(DefaultTableCellRenderer)super.getDefaultRenderer(columnClass);

cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);

return cr;

}

复制代码

JTable类的用来定义表格的常用方法

setRowHeight(int rowHeight)

setRowSelectionAllowed(boolean sa)

setSelectionMode

setSelectionBackground

setSelectionForeground

setAutoResizeMode

在利用setSelectionMode方法设置表格行的选择模式时,它的入口参数从ListSelectionModel的静态常量中选择。如下:

静态常量:SINGLE_SELECTION,常量值:0,表示只选择一个。

静态常量:SINGLE_INTERVAL_SELECTION,常量值:1,表示允许连续选择多个

静态常量:MULTIPLE_INTERVAL_SELECTION,常量值:2,表示随意选择多个

在利用setAutoResizeMode方法设置表格的自动调整模式时,它的入口参数从JTable类的静态常量中选择。

注意:表格的自动调整模式,就是在调整表格的某一列的宽度时,表格采用何种方式保持其总宽度不变。

操纵表格

在编写应用程序时,经常需要获得表格的一些信息,如下是JTable类中的三个经常用来获得表格信息的方法。

getRowCount()

getColumnCount()

getColumnName(int column)

JTable类中经常用来操纵表格选中行的方法如下:

setRowSelectionInterval(int from,int
to):选中行索引从from到to的所有行(包括索引为from到to的行)

addRowSelectionInterval(int from,int
to):将行索引从from到to的所有行追加为表格的选中行

isRowSelected:查看行索引为row的行是否被选中

selectAll():选中表格中的所有行

clearSelection():取消所有选中行的选择状态

getSelectedRowCount():得到选中行的数量,返回值为int型,如果没有被选中的行,则返回-1

getSelectedRow():得到被选中的行中最小的索引值,返回值为int型,如果没有被选中的行,则返回-1
-getSelectedRows():获得所有被选中行的索引值,返回值为int数组

表格模型和表格

接口TableModel定义了一个表格模型,抽象类AbstracTableModel实现了TableModel接口的大部分方法,只有以下3个抽象方法没有实现。

public int getRowCount()

public int getColumnCount()

public Object getValueAt(int rowIndex,int columnIndex)

通过继承AbstractTableModel可以实现上面的3个抽象方法可以创建自己的表格模型类。DefaultTableModel类便是由Swing类提供的继承了AbstractTableModel类并实现了上面3个抽象方法的表格模型类。

从JDK1.6开始,提供了对表格进行排序的功能。通过JTable类的setRowSorter(RowSorter<?
extends TableModel>
sorter)方法可以为表格设置排序器。TableRowSorter类是由Swing提供的排序类,为表格设置排序器的代码如下:

DefaultTableModel tableModel=new DefaultTableModel();

JTable table=new JTable(tableModel);

table.setRowSorter(new TableRowSorter(tableModel));

发表评论

电子邮件地址不会被公开。 必填项已用*标注