Java - 表格JTable的用法

转载 2011年10月28日 15:19:30
第一部分:
JTable 用来显示和编辑规则的二维单元表。它位于javax.swing包下面。

构造方法摘要
JTable()
           构造默认的 JTable,使用默认的数据模型、默认的列模型和默认的选择模型对其进行初始化。

JTable tableView = new JTable(); //不含有数据和列名
JTable(int numRows, int numColumns)
           使用 DefaultTableModel 构造具有空单元格的 numRows 行和 numColumns 列的 JTable

JTable tableView = new JTable(4, 5); //构造一个4行、5列的JTable,但是不含有数据和列名
JTable(Object[][] rowData,Object[] columnNames)
           构造 JTable,用来显示二维数组 rowData 中的值,其列名称为 columnNames

//初始化数据
Object[][] rowData = {
       {"1001", "李汉", "软件部", new Double(3000)},
       {"1002", "朱泽", "软件部", new Double(3100)},
       {"1003", "刘宇", "经理部", new Double(3000)}
};
//初始化列名
Object[] columnNames = {"编号", "姓名", "部门", "月薪"};
JTable tableView = new JTable(rowData, columnNames); //创建一个JTable,且含有数据和列名
JTable(TableModeldm)
           构造 JTable,使用 dm 作为数据模型、默认的列模型和默认的选择模型对其进行初始化。

//初始化数据
Object[][] rowData = {
       {"1001", "李汉", "软件部", new Double(3000)},
       {"1002", "朱泽", "软件部", new Double(3100)},
       {"1003", "刘宇", "经理部", new Double(3000)}
};
//初始化列名
Object[] columnNames = {"编号", "姓名", "部门", "月薪"};
//实例化TableModel接口
TableModel tableModel = new DefaultTableModel(rowData, columnsName);
JTable tableView = new JTable(tableModel); //创建JTable,且含有数据和列名
注意:在创建JTable的时候,需要一个JScrollPane来显示滚动条(它可以包含水平和垂直的滚动条)
如果要实现上图的界面样式,程序如下:

package com.gxa.edu;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2009</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class JTableTestFrame extends JFrame {
    public JTableTestFrame() {
        try {
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    private void jbInit() throws Exception {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("JTable的应用");
        jPanel1.setLayout(borderLayout1);
        jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
        jScrollPane1.getViewport().add(jTable1);
        this.getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
        this.setSize(450, 350);
        this.setVisible(true);
    }
    JPanel jPanel1 = new JPanel();
    BorderLayout borderLayout1 = new BorderLayout();
    JScrollPane jScrollPane1 = new JScrollPane();
    //初始化数据
    Object[][] rowData = {
                         {"1001", "李汉", "软件部", new Double(3000)},
                         {"1002", "朱泽", "软件部", new Double(3100)},
                         {"1003", "刘宇", "经理部", new Double(3000)}
    };
    //初始化列名
    Object[] columnsName = {"编号", "姓名", "部门", "月薪"};
    DefaultTableModel dtm = new DefaultTableModel(rowData, columnsName);
    JTable jTable1 = new JTable(dtm);
    public static void main(String[] args) {
        new JTableTestFrame();
    }
}
总结:如果要实现一个JTable,需要用到Java API中的哪些类和接口,这些类和接口实际含义是什么

l javax.swing.JTable:它是创建JTable组件的非常重要的类,它可以在JTable构建所需的列名和存储的数据。通过构造方法来实现ljavax.swing.JScrollPane:在进行JTable的UI设计时候需要一个滚动面板,它是一个Swing Constrainter(容器)。那么加载JTable的方法

JScrollPane jScrollPane1 = new JScrollPane();
jScrollPane1.getViewport().add(JTable的对象);

l javax.swing.table.TableModel:它是一个JTable数据模型接口,可以初始化列名、数据、获取数据模型中数据行数、对某一个方格或是多列设置是否可以编辑等等。ljavax.swing.table.DefaultTableModel:它是TableModel接口的实现,其提供更大强大的操作JTable的功能。例如:添加一行或一列的操作、返回总行数、返回总列数、删除某一行或某一列的操作等等。

//初始化数据
    Object[][] rowData = {
                         {"1001", "李汉", "软件部", new Double(3000)},
                         {"1002", "朱泽", "软件部", new Double(3100)},
                         {"1003", "刘宇", "经理部", new Double(3000)}
    };
    //初始化列名
    Object[] columnsName = {"编号", "姓名", "部门", "月薪"};
    DefaultTableModel dtm = new DefaultTableModel(rowData, columnsName);
    JTable jTable1 = new JTable(dtm);

l javax.swing.table. TableColumn:TableColumn 表示 JTable 中列的所有属性,如宽度、大小可调整性、编辑方格里面显示的内容。

//在方格中下拉框来显示
JComboBox comboBox = new JComboBox();
        comboBox.addItem("软件部");
        comboBox.addItem("人事部");
        comboBox.addItem("经理部");
        comboBox.addItem("测试部");
        comboBox.addItem("办公室");
         comboBox.addItem("财务部");
       
        TableColumn department = jTable1.getColumn("部门");
        department.setCellEditor(new DefaultCellEditor(comboBox));

第二部分:

 一、JTable

例:建立表格

import java.awt.event.WindowAdapter ;
import java.awt.event.WindowEvent ;
import javax.swing.JTable ;
import javax.swing.JScrollPane ;
import javax.swing.JFrame ;
public class JTableDemo01{
public static void main(String args[]){
   JFrame frame = new JFrame("Welcome To MLDN") ;
   String[] titles = {"姓名","年龄","性别","数学成绩","英语成绩","总分","是否及格"} ;
   Object [][] userInfo = {
    {"李兴华",30,"男",89,97,186,true} ,
    {"李康",23,"女",90,93,183,false}
   } ; // 定义数据
   JTable table = new JTable(userInfo,titles) ; // 建立表格
   JScrollPane scr = new JScrollPane(table) ;
   frame.add(scr) ;
   frame.setSize(370,90) ;
   frame.setVisible(true) ;
   frame.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
     System.exit(1) ;
    }
   });
}
}

在以上程序中使用一个二维数组表示表格中的数据,表格中的数据按照标题栏设置的顺序进行排列,之后将表格加入到一个滚动框中,再将滚动框加入到面板中。

注意:JTable使用时要加入到JScrollPane中。
在使用JTable时,如果不将一个JTable加入到JScrollPane中,则表格的标题将无法显示。

二、使用TableModel构建表格

使用JTable构建的表格相对比较单一,如果想制作一些操作界面更加友好的表格,例如在表格上加入一些单选按钮或下拉列表框,则就要借助于TableModel接口。

例:使用AbstractTableModel构建表格

import java.awt.BorderLayout ;
import java.awt.event.WindowAdapter ;
import java.awt.event.WindowEvent ;
import javax.swing.JTable ;
import javax.swing.JScrollPane ;
import javax.swing.JFrame ;
import javax.swing.JPanel ;
import javax.swing.DefaultCellEditor ;
import javax.swing.JComboBox ;
import javax.swing.table.AbstractTableModel ;
class DefaultTable extends AbstractTableModel{
private String[] titles = {"姓名","年龄","性别","数学成绩","英语成绩","总分","是否及格"} ;
private Object [][] userInfo = {
    {"李兴华",30,"男",89,97,186,true} ,
    {"李康",23,"女",90,93,183,false}
   } ; // 定义数据
public int getColumnCount(){ // 取得列的数量
   return this.titles.length ;
}
public int getRowCount(){   // 取得行的数量
   return this.userInfo.length ;
}
public Object getValueAt(int rowIndex, int columnIndex){
   return this.userInfo[rowIndex][columnIndex] ;
}
public String getColumnName(int columnIndex){
   return this.titles[columnIndex] ;
}
public Class<?> getColumnClass(int columnIndex) { // 得到指定列的类型
   return this.getValueAt(0,columnIndex).getClass() ;
}
public boolean isCellEditable(int rowIndex, int columnIndex){ // 所有内容都可以编辑
   return true ;
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex){
   this.userInfo[rowIndex][columnIndex] = aValue ;
}
}
class TableColumnModelDemo{
private JFrame frame = new JFrame("Welcome To MLDN") ;
private JTable table = null ;
private DefaultTable defaultTable = new DefaultTable() ; // TableModel
private JComboBox sexList = new JComboBox() ;
public TableColumnModelDemo(){
   this.table = new JTable(this.defaultTable) ;
   this.sexList.addItem("男") ;
   this.sexList.addItem("女") ;
   // 以下拉列表框的形式显示
   this.table.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(this.sexList)) ;
   JScrollPane scr = new JScrollPane(this.table) ;
   JPanel toolBar = new JPanel() ;
   frame.add(toolBar,BorderLayout.NORTH) ; // 加入组件
   frame.add(scr,BorderLayout.CENTER) ; // 加入组件
   frame.setSize(370,90) ;
   frame.setVisible(true) ;
   frame.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
     System.exit(1) ;
    }
   }) ;
}
}
public class JTableDemo02{
public static void main(String args[]){
   new TableColumnModelDemo() ;  
}
}


从以上程序运行结果来看,表格中的数据都是按照指定格式进行显示的,而且因为在DefaultTable类中覆写了isCellEditable()方法,所以表格的每一项都是可编辑的。对于性别的选项使用了一个下拉列表框的形式进行显示,而且在“是否及格”列上,是使用一个CheckBox代替了原有的true及false。

使用AbstractTableModel类可以方便地构建表格,而使用其子类DefaultTableModel则可以对表格进行动态的操作,例如,增加行(列)、删除行(列)等。

例:动态操作表格

import java.awt.BorderLayout ;
import java.awt.event.WindowAdapter ;
import java.awt.event.ActionListener ;
import java.awt.event.WindowEvent ;
import java.awt.event.ActionEvent ;
import javax.swing.JTable ;
import javax.swing.JButton ;
import javax.swing.JScrollPane ;
import javax.swing.JFrame ;
import javax.swing.JPanel ;
import javax.swing.DefaultCellEditor ;
import javax.swing.JComboBox ;
import javax.swing.table.DefaultTableModel ;
import javax.swing.table.TableColumnModel ;
import javax.swing.table.TableColumn ;
class ChangeTable implements ActionListener{ // 通过按钮实现动态表格
private JFrame frame = new JFrame("Welcome To MLDN") ;
private JTable table = null ;
private DefaultTableModel tableModel ; // TableModel
private String[] titles = {"姓名","年龄","性别","数学成绩","英语成绩","总分","是否及格"} ;
private Object [][] userInfo = {
    {"李兴华",30,"男",89,97,186,true} ,
    {"李康",23,"女",90,93,183,false}
   } ; // 定义数据
private JButton addRowBtn = new JButton("增加行") ; // 定义按钮
private JButton removeRowBtn = new JButton("删除行") ; // 定义按钮
private JButton addColBtn = new JButton("增加列") ; // 定义按钮
private JButton removeColBtn = new JButton("删除列") ; // 定义按钮
public ChangeTable(){
   this.tableModel = new DefaultTableModel(this.userInfo,this.titles) ;
   this.table = new JTable(this.tableModel) ;
   JScrollPane scr = new JScrollPane(this.table) ;
   JPanel toolBar = new JPanel() ;
   toolBar.add(this.addRowBtn) ;
   toolBar.add(this.removeRowBtn) ;
   toolBar.add(this.addColBtn) ;
   toolBar.add(this.removeColBtn) ;
   frame.add(toolBar,BorderLayout.NORTH) ; // 加入组件
   frame.add(scr,BorderLayout.CENTER) ; // 加入组件
   frame.setSize(370,160) ;
   frame.setVisible(true) ;
   frame.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
     System.exit(1) ;
    }
   }) ;
   this.addRowBtn.addActionListener(this) ;
   this.removeRowBtn.addActionListener(this) ;
   this.addColBtn.addActionListener(this) ;
   this.removeColBtn.addActionListener(this) ;

}
public void actionPerformed(ActionEvent e){
   if(e.getSource() == this.addColBtn){ // 增加列
    this.tableModel.addColumn("新增列") ;
   }
   if(e.getSource() == this.addRowBtn){
    this.tableModel.addRow(new Object[]{}) ;
   }
   if(e.getSource()==this.removeColBtn){
    int colCount = this.tableModel.getColumnCount() - 1 ;// 取得列的数量
    if(colCount>=0){
     // 如果要想删除,则必须找到TableColumnModel
     TableColumnModel columMode = this.table.getColumnModel() ;
     TableColumn taleColumn = columMode.getColumn(colCount) ;
     columMode.removeColumn(taleColumn) ; // 删除指定的列
     this.tableModel.setColumnCount(colCount) ;
    }
   }
   if(e.getSource()==this.removeRowBtn){
    int rowCount = this.tableModel.getRowCount() - 1 ;
    if(rowCount>=0){ // 判断是否还有行可以删除
     this.tableModel.removeRow(rowCount) ;
     this.tableModel.setRowCount(rowCount) ; // 设置新的行数
    }
   }
}
}
public class JTableDemo03{
public static void main(String args[]){
   new ChangeTable() ;  
}
}

在程序中,使用DefaultTableModel可以方便地实现增加行(列)、删除行(列)的各种操作。在删除行前先取得最后一行的编号,之后通过removeRow()方法重新设置行数,这样在下次操作时就不会出现数组越界的异常信息。

本章要点

1、Swing是在AWT基础上的一种扩展应用,提供了一套轻量级的操作组件。
2、在Swing中所有的组件都是以字母J开头的,所有的组件都是继承自Component类。
3、JFrame是Swing提供的一个标准容器,可以向该容器上加入各个组件。
4、JLabel是一个标签组件,用于显示基本信息。
5、JButton是一个按钮组件,如果要构建不弹起的按钮则要使用JToggleButton。
6、在图形界面中主要提供了FlowLayout、BorderLayout、GridLayout、CardLayout、绝对定位5种布局管理器。
7、可以使用JTextField完成一个文本框,使用JPasswordField完成一个密码框,使用JTextArea完成一个文本域。
8、事件发生时会产生事件源并找到相应的监听程序进行处理,在图形界面中提供了多个Listener接口进行事件的处理。
9、在使用JRadioButton完成单选操作时,需要将多个JRadioButton加入到ButtonGroup中,才能实现单选的功能。
10、JComboBox可以完成下拉列表框的操作,使用JList可以完成列表框的显示。
11、要完成菜单显示,需要将多个JMenu加入到JMenuBar中,菜单中的菜单项使用JMenuItem处理,每一个JMenuItem都表示一个特殊的按钮。
12、JFileChooser可以完成文件选择的对话框。
13、如果要显示一组数据,则可以使用表格的形式进行显示。

Java Swing JTable 表格【11:表格使用自定义渲染器】

TableCellRenderer接口定义了JTable渲染器接口: 贴图如下: 渲染器对象作为一个方法的参数来实现针对表格中的单元格的不同设置的方法之一: ...
  • zp357252539
  • zp357252539
  • 2016年01月11日 22:40
  • 2552

JTable动态刷新内容

搞了很久,一直不知道怎么让表格中的内容动态更新,今天终于弄出来了。    场景描述: 有这么一张表格,下面有添加、删除等操作。 点击下面的添加后出现添加子窗口 点击添加子窗口的“添加”后,主界面...
  • Snail_Ren
  • Snail_Ren
  • 2016年03月23日 12:47
  • 2297

Java Swing JTable 表格【7:监听表格数据变化】

监听表格数据变化 终于进入到JTable的重头戏了,监听在任何Java项目中都是非常重要的,监听带来的一系列的操作也有时候非常复杂 在Excel表格中,当表格中的一个单元格的数据发生变化...
  • zp357252539
  • zp357252539
  • 2016年01月11日 21:25
  • 5950

JTable学习总结之——如何设置表格透明篇

最近在自己做一个项目,因为涉及到的表格比较多,所以使用JTable也稍微频繁,而自然问题也就多了起来。之前有一篇文章是关于返回-1的问题,今天主要将一些对JTable的基本设置。 第一:透明。 ...
  • u010571913
  • u010571913
  • 2013年12月26日 13:41
  • 2610

Java Swing JTable 表格【8:表格使用选择器SelectionModel】

选择器是指表格的选择模式SelectionModel,选择器的最大用处就是使用户能够以不同的方式选择表中的数据,例如平时处理Excel表时,可以一次性选择一个数据,也可以一次性选择多个数据等。选择器的...
  • zp357252539
  • zp357252539
  • 2016年01月11日 21:46
  • 2004

简单使用JTable读取数据库的表

在上一个博文中学习了如何用Java连接数据库,那么连接上数据库后干嘛用呢,肯定是对数据库进行增删改查,在这里我又学习了一下,如何用JTabke读取数据库。那么什么事JTable呢?在API中写道:JT...
  • linweieran
  • linweieran
  • 2015年09月14日 22:58
  • 6747

Java Swing 之JTable及其简单的用法

我们都知道JTable需要使用一个Model配合才能更好地发挥其作用。而使用Model有好多种方法,但是难易程度却大大不同,比如说我们使用AbstractTableModel接口要实现里面的好多方法,...
  • Marksinoberg
  • Marksinoberg
  • 2015年10月26日 21:08
  • 10381

Java Swing JTable 表格【3:创建表格,表头存在的设置】

创建表格有两种方式:一种是使用JScrollPane面板来添加表格,而另一种是使用中间容器直接添加表格,不过第二种需要将表格的表头放置到顶层窗口的最上层具体代码如下: package com.acco...
  • zp357252539
  • zp357252539
  • 2016年01月10日 08:26
  • 3465

java JTable使用示例

在java开发中,经常会遇到需要显示数据库操作的返回结果,尤其是用在查询中。 这个时候,如何动态地根据数据库中的表内容进行动态的显示呢? 在Java中,提供了JTable类用于显示图表,利用其中的...
  • chongtian_zhiying
  • chongtian_zhiying
  • 2014年12月06日 13:39
  • 1252

Swing表格自定义JTable (表格可编辑)

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->im...
  • zhangli865621030
  • zhangli865621030
  • 2013年12月02日 09:56
  • 1570
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java - 表格JTable的用法
举报原因:
原因补充:

(最多只允许输入30个字)