目录
前言
表格是最常用的数据统计形式之一,本文将学习利用JTable类创建和定义表格
提示:以下是本篇文章正文内容,下面案例可供参考
利用JTable类直接创建表格
一、创建表格
在JTable类中,除了默认的构造方法外,还提供了利用指定表格列名数组和表格数据数组创建表格的构造方法:JTable(Object[][] rowDate,Object[] columnNames)
1.创建可以滚动的表格
代码如下:
import javax.swing.*;
import java.awt.*;
public class jTable extends JFrame {
public static void main(String[] args) {
new jTable();
}
public jTable(){
Container c = getContentPane();
setTitle("创建可以滚动的表格");
setBounds(100,100,240,150);
String[] columnNames = {"A","B"};//定义列名数组
String[][] tableValue = {{"A1","B1"}, {"A2","B2"}, {"A3","B3"}, {"A4","B4"}, {"A5","B5"},{"A6","B6"}};//定义表格数据数组
JTable jt = new JTable(tableValue,columnNames);//创建指定列名和数据的表格
JScrollPane js = new JScrollPane(jt);//创建显示表格的滚动面板
c.add(js,BorderLayout.CENTER);
setVisible(true);
setSize(400,150);
setDefaultCloseOperation(3);
}
}
2.创建不可滚动的表格
在JTable中还提供了指定表格列名向量和表格数据向量创建表格的构造方法:JTable(Vector rowDate,Vector columnNames)
代码如下:
package table;
import javax.swing.*;
import javax.swing.table.JTableHeader;
import java.awt.*;
import java.util.Vector;
public class jTable2 extends JFrame {
public static void main(String[] args) {
new jTable2();
}
public jTable2(){
Container c = getContentPane();
setTitle("创建不能滚动的表格");
setBounds(100,100,240,150);
Vector<String> vc = new Vector<>();//定义表格列名向量
vc.add("A");//添加列名
vc.add("B");
Vector<Vector<String>> vcs = new Vector<>();//定义表格数据向量
for (int i = 0; i < 6; i++) {
Vector<String> v = new Vector<>();//定义表格行向量
v.add("A"+(i+1));//添加单元格数据
v.add("B"+(i+1));
vcs.add(v);//将行数据添加到表格
}
JTable jt = new JTable(vcs,vc);//创建表格
JTableHeader jh = jt.getTableHeader();//获得表格头对象(如果是直接将表格添加到容器,则首先获取头对象,否则表格没有列名)
c.add(jh,BorderLayout.NORTH);
c.add(jt);
setVisible(true);
setSize(400,150);
setDefaultCloseOperation(3);
}
}
二、定制表格
表格创建完成后,还需要对其进行一系列的定义,以便适用于具体的使用情况。默认情况下通过双击单元格就可以对其进行编辑,如果不需要提供该功能,可以通过重构JTable类的isCellEditable(int row,int column)方法实现,返回false则为不可编辑
如果表格只有几列,通常不需要表格列的可重新排列功能。在创建不支持滚动的表格时,已经使用了JTableHeader类的对象,通过该类的setReorderingAllowed(boolean reorderingAllowed)方法即可设置表格是否支持重新排列功能,设为false为不可重新排列
默认情况下单元格内容靠左显示,重构getDefaultEditor(Class<?> columnClass)方法实现居中,代码如下:
package table;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.Vector;
public class jTable2 extends JFrame {
public static void main(String[] args) {
new jTable2();
}
public jTable2(){
Container c = getContentPane();
setTitle("创建不能滚动的表格");
setBounds(100,100,240,150);
Vector<String> vc = new Vector<>();//定义表格列名向量
vc.add("A");//添加列名
vc.add("B");
Vector<Vector<String>> vcs = new Vector<>();//定义表格数据向量
for (int i = 0; i < 6; i++) {
Vector<String> v = new Vector<>();//定义表格行向量
v.add("A"+(i+1));//添加单元格数据
v.add("B"+(i+1));
vcs.add(v);//将行数据添加到表格
}
JTable jt = new Jt(vcs,vc);//创建自定义的表格
JTableHeader jh = jt.getTableHeader();//获得表格头对象(如果是直接将表格添加到容器,则首先获取头对象,否则表格没有列名)
c.add(jt);
c.add(jh,BorderLayout.NORTH);
setVisible(true);
setSize(400,150);
setDefaultCloseOperation(3);
}
}
class Jt extends JTable {
public Jt(Vector<Vector<String>> vcs,Vector<String> vc){
super(vcs,vc);//调用父类的构造方法创建表格
}
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer) super.getDefaultRenderer(columnClass);
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return cr;
}
}
在class Jt中添加如下代码,可设置表格列可重排(列A和列B互换位置)
public JTableHeader getTableHeader() {
//获取表格头对象
JTableHeader jh = super.getTableHeader();
jh.setReorderingAllowed(true);//设置表格列可重排
DefaultTableCellRenderer df = (DefaultTableCellRenderer) jh.getDefaultRenderer();//获取单元格对象
df.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return tableHeader;
}
JTable类中定义表格的常用方法
setRowHeight(int rowHeight)//设置表格行高,默认16像素 setRowSelectionAllowed(boolean rowSelectionAllowed)//设置是否允许选中表格行,默认允许选中,设为false表示不允许被选中 setSelectionMode(int selectionMode)//设置表格行的选择模式 三种模式: ListSelectionModel.SINGLE_SELECTION只允许选中一个 ListSelectionModel.SINGLE_INTERVAL_SELECTION允许选中连续的多条 ListSelectionModel.MULTIPLE_INTERVAL_SELECTION//可以随意选择setSelectionBackground(Color selectionBackground)//设置表格行选中时的背景色setSelectionForeground(Color selectionForeground)//设置表格选中行的前景色(通常情况为文字颜色) setAutoResizeMode(int mode)//设置表格的自动调整模式 五个选项:(如果关闭了自动调整,那么调整窗体宽度时表格总宽度不会变,反之调为适合窗体的宽度)以下代码可以自行复制修改继而加深理解:
package table;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.Vector;
public class jTable2 extends JFrame {
public static void main(String[] args) {
new jTable2();
}
public jTable2(){
Container c = getContentPane();
setTitle("定义表格");
setBounds(100,100,500,375);
final JScrollPane js = new JScrollPane();
c.add(js,BorderLayout.CENTER);
Vector<String> vc = new Vector<>();//定义表格列名向量
for (int j = 0; j < 7; j++) {
vc.add(String.valueOf((char)(65+j)));//填充列名
}
Vector<Vector<String>> vcs = new Vector<>();//定义表格数据向量
for (int i = 0; i < 6; i++) {
Vector<String> v = new Vector<>();//定义表格行向量
for (int k = 0; k < 7; k++) {
v.add(vc.get(k)+i);//填充单元格
}
vcs.add(v);//将行数据添加到表格
}
JTable jt = new Jt(vcs,vc);//创建自定义的表格
jt.setAutoResizeMode(0);//关闭表格列自动调整功能
jt.setSelectionMode(0);//设置为单选
jt.setSelectionBackground(Color.yellow);//设置选中时的背景
jt.setSelectionForeground(Color.RED);//设置选中时的前景色
jt.setRowHeight(30);//设置行高
js.setViewportView(jt);
setVisible(true);
setSize(400,150);
setDefaultCloseOperation(3);
}
}
//定义表格
class Jt extends JTable {
public Jt(Vector<Vector<String>> vcs,Vector<String> vc){
super(vcs,vc);//调用父类的构造方法创建表格
}
//设置单元格内容居中
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer) super.getDefaultRenderer(columnClass);
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return cr;
}
//获取表格头对象
public JTableHeader getTableHeader() {
JTableHeader jh = super.getTableHeader();
jh.setReorderingAllowed(true);//设置表格列可重排
DefaultTableCellRenderer df = (DefaultTableCellRenderer) jh.getDefaultRenderer();//获取单元格对象
df.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return tableHeader;
}
//表格不可编辑
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
}
三、操纵表格
在编写应用程序的时候,经常需要获得表格的一些信息,如行数、列数。
下面是三个常用的获取表格信息的方法:
getRowCount():获取表格行数
getColumnCount():获取表格列数
getColumnName(int column):获取指定列名
下列列举了行操作方法:
package table;
import javax.swing.*;
public class jTable3 extends JTable {
public jTable3(){
int from=0,to=0,row=0,column=0,target=0;
//索引从0开始
setRowSelectionInterval(from,to);//选中索引从from到to的所有行(包含from,to)
addRowSelectionInterval(from,to);//将from到to行选中
isRowSelected(row);//查看第row行有没有被选中
selectAll();//选中表中所有行
clearSelection();//取消选中所有行
getSelectedRowCount();//获取被选中总行数,没有选中返回-1
getSelectedRow();//获取被选中行中索引最小的行,没有选中返回-1
getSelectedRows();//获取所有被选中的索引,返回数组
moveColumn(column,target);//将索引为column列移动至索引为target的列(target至column+1依次前移1位)
}
}
以下代码展示了所有方法的功能:
package table;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Vector;
public class jTable4 extends JFrame {//借用之前的表格
public jTable4(){
Container c = getContentPane();
setTitle("操作表格");
setBounds(100,100,500,375);
final JScrollPane js = new JScrollPane();
c.add(js,BorderLayout.WEST);
Vector<String> vc = new Vector<>();//定义表格列名向量
for (int j = 0; j < 7; j++) {
vc.add(String.valueOf((char)(65+j)));//填充列名
}
Vector<Vector<String>> vcs = new Vector<>();//定义表格数据向量
for (int i = 0; i < 10; i++) {
Vector<String> v = new Vector<>();//定义表格行向量
for (int k = 0; k < 7; k++) {
v.add(vc.get(k)+i);//填充单元格
}
vcs.add(v);//将行数据添加到表格
}
JTable jt = new JTable(vcs,vc);
jt.setRowSelectionInterval(1,3);//设置选中行
jt.addRowSelectionInterval(5,5);//添加为选中行
JPanel jp = new JPanel();
c.add(jp,BorderLayout.SOUTH);
JButton jb1 = new JButton("全部选中");
JButton jb2 = new JButton("取消选择");
jp.add(jb1);
jp.add(jb2);
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jt.selectAll();
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jt.clearSelection();
}
});
JTextArea ja = new JTextArea(15,50);
ja.append("表格共有"+jt.getRowCount()+"行\n");
ja.append("共有"+jt.getSelectedRowCount()+"被选中\n");
ja.append("第3行的选中状态为:\t"+jt.isRowSelected(2)+"\n");
ja.append("第5行的选中状态为:\t"+jt.isRowSelected(4)+"\n");
ja.append("被选中的第一行的索引为:\t"+jt.getSelectedRow()+"\n");
ja.append("所有被选中行的索引是:\t"+ Arrays.toString(jt.getSelectedRows())+"\n");
ja.append("列移动前第二列的列名是:"+jt.getColumnName(1)+"\n");
ja.append("列移动前第二列第二行的值是:"+jt.getValueAt(1,1)+"\n");
jt.moveColumn(1,5);//把第二列移动到第六列
ja.append("列移动后第二列的列名是:"+jt.getColumnName(1)+"\n");
ja.append("列移动后第二列第二行的值是:"+jt.getValueAt(1,1)+"\n");
js.setViewportView(jt);
c.add(ja,BorderLayout.EAST);
setVisible(true);
setSize(1000,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jTable4();
}
}
最初运行的样子
全选按钮功能实现
取消按钮功能实现
表格模型和表格
一、利用表格模型创建表格
接口TableModel定义了一个表格模型,继承AbstractTableModel并实现下面三个方法来创建自己的表格模型:
package table;
import javax.swing.table.AbstractTableModel;
public class jTable5 extends AbstractTableModel {
@Override
public int getRowCount() {
return 0;
}
@Override
public int getColumnCount() {
return 0;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return null;
}
}
DefaultTableModel继承了AbstractTableModel并实现了它的三个方法。DefaultTableModel常用的构造方法有:
public DefaultTableModel() {//创建一个0行0列的表格模型
this(0, 0);
}
public DefaultTableModel(int rowCount, int columnCount) {//创建rowCount行columnCount列的表格模型
this(newVector(columnCount), rowCount);
}
public DefaultTableModel(Object[] columnNames, int rowCount) {//按照数组中指定的数据和列名创建表格模型
this(convertToVector(columnNames), rowCount);
}
public DefaultTableModel(Vector data, Vector columnNames) {//按照向量中指定的数据和列名创建表格模型
setDataVector(data, columnNames);
}
使用表格模型创建带有升序降序的表格:(整个表格所有的数据升序或降序)
class defaultTableModel extends JFrame{
public defaultTableModel(){
Container c = getContentPane();
String[] clNames = {"A","B"};
String[][] tableValues = {
{"A1","B1"},
{"A2","B2"},
{"A3","B3"}
};
DefaultTableModel tm = new DefaultTableModel(tableValues,clNames);//创建表格模型
JTable jt = new JTable(tm);//创建表格
jt.setRowSorter(new TableRowSorter<>(tm));//设置排序器
JScrollPane js = new JScrollPane(jt);
c.add(js,BorderLayout.CENTER);
setVisible(true);
setSize(400,250);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new defaultTableModel();
}
}
二、维护表格模型
使用表格时,经常需要对表格中的内容进行维护,对表内容的增删改都可以通过为维护表格模型来完成。
1.添加
--末尾追加:addRow(Object rowDate)或addRow(Vector rowDate)
--指定位置添加:insertRow(int row,Object rowDate)或insertRow(int row,Vector rowDate)
2.修改
setValueAt(Object 修改后的值,int 单元格行索引,int 单元格列索引)
3.删除
removeRow(int row)
下面实例展示了末尾追加,删除修改功能,不是很完美,可自行复制完善,效果图就不放了,自己动手丰衣足食!
package table;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class jTable6 extends JFrame {
private JTextField jt1;
private JTextField jt2;
public jTable6(){
Container c = getContentPane();
setTitle("维护表格模型");
setBounds(100,100,510,375);
String[] clNames = {"A","B"};
String[][] tableValues = {
{"A1","B1"},
{"A2","B2"},
{"A3","B3"}
};
DefaultTableModel tm = new DefaultTableModel(tableValues,clNames);//创建表格模型
JTable jt = new JTable(tm);//创建表格
jt.setRowSorter(new TableRowSorter<>(tm));
JScrollPane js = new JScrollPane(jt);
c.add(js,BorderLayout.CENTER);
jt1 = new JTextField();
jt2 = new JTextField();
//为表格添加鼠标事件监听
jt.addMouseListener(new MouseAdapter() {
//单击事件
@Override
public void mouseClicked(MouseEvent e) {
//获取选中行的索引
int row = jt.getSelectedRow();
//获取指定单元格的值
Object value1 = jt.getValueAt(row,0);
Object value2 = jt.getValueAt(row,1);
jt1.setText(value1.toString());
jt2.setText(value2.toString());//将单元格的值赋给文本框
}
});
//创建面板
JPanel j1 = new JPanel();
c.add(j1,BorderLayout.SOUTH);
j1.add(new JLabel("A:"));
j1.add(new JLabel("B:"));
jt1 = new JTextField("A4",10);//初始化文本框
jt2 = new JTextField("B4",10);
j1.add(jt1);
j1.add(jt2);
//创建按钮
JButton jb1 = new JButton("添加");
JButton jb2 = new JButton("删除");
JButton jb3 = new JButton("修改");
j1.add(jb1);
j1.add(jb2);
j1.add(jb3);
//为按钮添加监听事件
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String[] rowValue = {jt1.getText(),jt2.getText()};//创建表格行数组
tm.addRow(rowValue);//向表格模型中添加一行
int rowCount = jt.getRowCount()+1;
jt1.setText("A"+rowCount);
jt2.setText("B"+rowCount);
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int delRow = jt.getSelectedRow();//获取被选中行
if (delRow != -1){//判断是否有选中行
tm.removeRow(delRow);//删除选中行
}
}
});
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int selRow = jt.getSelectedRow();
if (selRow != -1){
tm.setValueAt(jt1.getText(),selRow,0);
tm.setValueAt(jt2.getText(),selRow,1);
}
}
});
setVisible(true);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jTable6();
}
}
提供行标题栏的表格
什么是行标题栏:比如第一列是学生姓名,后面有十几列的学生信息,往左滑动看最右边的信息时,学生姓名就被隐藏了,把学生姓名那一列固定,就叫做行标题栏,列标题栏同理。
package table;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.util.Vector;
public class jTable7 extends JPanel {
//声明属性
private Vector<String> cloName;//表格列名数组
private Vector<Vector<Object>> values;//表格数据数组
private int fixclo = 1;//固定列数量
//创建用于固定左侧列的表格模型
private class tableModel extends AbstractTableModel {
@Override
public int getRowCount() {//返回行数
return values.size();
}
@Override
public int getColumnCount() {//返回固定列数量
return fixclo;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {//返回单元格内容
return values.get(rowIndex).get(columnIndex);
}
@Override
public String getColumnName(int column) {//返回指定列名称
return cloName.get(column);
}
}
//创建用于右侧可移动列表格的模型
private class floatModel extends AbstractTableModel{
@Override
public int getRowCount() {//返回行数
return values.size();
}
@Override
public int getColumnCount() {//返回可移动列的数量,需要减去固定列的数量
return cloName.size()-fixclo;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {//返回单元格值(需要加上固定列)
return values.get(rowIndex).get(columnIndex+fixclo);
}
@Override
public String getColumnName(int column) {//返回指定列名称
return cloName.get(column+fixclo);
}
}
//创建表格对象
private JTable fixcloT;//创建固定列表格对象
private tableModel fixModel;//创建固定列表格模型对象
private JTable floatT;//创建移动列表格对象
private floatModel floModel;//创建可移动列模型对象
//同步选中固定列某一行时选中可移动列对应行,要求:两个表格均时单选模式,即一次只能选中一行
private class mListListener implements ListSelectionListener{
//默认由选中固定列中的行触发
boolean isFixClo = true;
public mListListener(boolean isFixClo){
this.isFixClo = isFixClo;
}
@Override
public void valueChanged(ListSelectionEvent e) {
if (isFixClo){
int row = fixcloT.getSelectedRow();//获取固定列表格中被选中的行索引
floatT.setRowSelectionInterval(row,row);//同时选中可移动列的对应行
}else{
int row = floatT.getSelectedRow();//获取可移动列表格中被选中的行索引
fixcloT.setRowSelectionInterval(row,row);//同时选中固定列的对应行
}
}
}
//编写构造方法,传入列名数组,数据数组,固定列数
public jTable7(Vector<String> cloName,Vector<Vector<Object>> values,int fixclo){
super();
setLayout(new BorderLayout());
this.cloName = cloName;
this.values = values;
this.fixclo = fixclo;
//创建固定列表格模型对象
fixModel = new tableModel();
//创建固定列表格对象
fixcloT = new JTable(fixModel);
//创建移动列表格模型及表格对象
floModel = new floatModel();
floatT = new JTable(floModel);
//获得选择模型对象
ListSelectionModel fixed = fixcloT.getSelectionModel();
ListSelectionModel floating = floatT.getSelectionModel();
//设置选择模式为单选
fixed.setSelectionMode(0);
floating.setSelectionMode(0);
//关闭表格自动调整功能
floatT.setAutoResizeMode(0);
//添加行被选中事件监听器
fixed.addListSelectionListener(new mListListener(true));
floating.addListSelectionListener(new mListListener(false));
//创建滚动条面板
JScrollPane js = new JScrollPane();
//将固定列的表格头放在面板的左上方
js.setCorner(JScrollPane.UPPER_LEFT_CORNER,fixcloT.getTableHeader());
//创建一个用来显示基础信息的视图对象
JViewport view = new JViewport();
//将固定列表格添加到视图中
view.setView(fixcloT);
//设置试图的首选大小为固定列表格的首选大小
view.setPreferredSize(fixcloT.getPreferredSize());
//将视图添加到滚动面板的标题视图
js.setRowHeaderView(view);
//将可移动列表格添加到默认试图
js.setViewportView(floatT);
add(js,BorderLayout.CENTER);
}
}
//编写测试代码
class test extends JFrame{
public test(){
Container c = getContentPane();
Vector<String> colName = new Vector<>();
colName.add("日期");
for (int i = 1; i < 21; i++) {
colName.add("商品"+i);
}
Vector<Vector<Object>> values = new Vector<>();
for (int j = 1; j <31; j++) {
Vector<Object> row = new Vector<>();
row.add(j);
for (int k = 0; k < 20; k++) {
row.add((int)(Math.random()*1000));
}
values.add(row);
}
final jTable7 panel = new jTable7(colName,values,1);
c.add(panel,BorderLayout.CENTER);
setVisible(true);
setSize(700,350);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new test();
}
}
可以看到查看最后一行 最后一列的数据,第一列和第一行依旧显示
总结
通过对本文的学习,相信读者可以熟练的使用JTable表格。