在JTable类中除了默认的构造方法外,还提供了如下利用指定表格列名数组和表格数据数组创建表格的构造方法。
JTable(Object[][] rowData, Object[] columnNames)
rowData:封装表格数据的数组
columnNames:封装表格列名的数组
在使用表格时,通常将其添加到滚动面板中,然后将滚动面板添加到相应的位置。
import javax.swing.*;
import java.awt.*;
public class t1 extends JFrame{
private String[][] data = {{"编号一","数据一"},{"编号二","数据二"},{"编号三","数据三"},{"编号四","数据四"},{"编号五","数据五"},{"编号六","数据六"},{"编号七","数据七"},{"编号八","数据八"}};
private String[] dataTitle = {"编号","内容"};
private JTable jtable = new JTable(data, dataTitle);
private JScrollPane jscrollpane = new JScrollPane(jtable);
public t1() {
setTitle("创建表格");
setBounds(300,300,300,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(jscrollpane,BorderLayout.CENTER);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
t1 T = new t1();
}
}
JTable类中还提供了利用指定表格列名向量和表格数据向量创建表格的构造方法:
JTable(Vector rowData,Vector columnNames)
rowData:封装表格数据的数组
columnNames:封装表格列名的数组
在使用表格时,有时不需要使用滚动条,即在窗体中可以显示出整个表格,在这种情况下,也可以直接将表格添加到相应的 容器中,如果直接将表格添加到相应的容器中,则首先需要通过JTable类中的getTableHeader()方法获得JTableHeader类的对象,然后再讲该对象添加到容器的相应位置,否则表格没有列名。
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.util.*;
public class t2 extends JFrame{
private Vector> data = new Vector>();
private Vector dataTitle = new Vector();
public t2() {
super();
setTitle("创建不可滚动的表格");
setBounds(300,300,300,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
dataTitle.add("编号");
dataTitle.add("内容");
for (int i = 1; i < 10; i++) {
Vector W = new Vector();
W.add("编号" + i);
W.add("B" + i);
data.add(W);
}
JTable table = new JTable(data, dataTitle);
add(table, BorderLayout.CENTER);
JTableHeader tableHeader = table.getTableHeader();// 获得表格头对象
// 将表格头添加到边界布局的上方
add(tableHeader, BorderLayout.NORTH);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
t2 T = new t2();
}
}
表格创建完成后,还需要对其进行一系列的定义,以便适合于具体的使用情况。默认情况下通过双击表格中的单元格就可以对其进行编辑。
如果不需要提供该功能,可以通过重构JTable类的isCellEditable(int row, int column)方法实现。默认情况下该方法返回boolean型值true,表示指定单元格可编辑,如果返回false则表示不可编辑。
如果表格只有几列,通常不需要表格列的可重新排列功能。在创建不支持滚动条的表格时已经使用了JTableHeader 类的对象,通过该类的setReorderingAllowed(boolean reorderingAllowed)方法即可设置表格是否支持重新排列功能,设为false表示不支持重新排列功能。
默认情况下单元格中的内容靠左侧显示,若想要单元格居中的内容居中显示可以通过重构JTable类的getDefaultRenderer(Class> columnClass)方法来实现:
public TableCellRenderer getDefaultRenderer(Class> columnClass) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer)super.getDefaultRenderedr(columnClass);//获得表格的单元格对象
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);//设置单元格内容居中显示
return cr;
}
JTable类的用来定义表格的常用方法
方法 | 说明 |
setRowHeight(int rowHeight) | 设置表格的行高,默认像素为16 |
setRowSelectionAllowed(boolean sa) | 设置是否允许选中表格行,默认为允许选中,设为false表示不允许选中 |
setSelectionMode(int sm) | 设置表格行的选中模式 |
setSelectionBackground(Color cr) | 设置表格选中行的背景色 |
setSelectionForeground(Color fc) | 设置表格选中行的前景色 |
setAutoResizeMode(int mode) | 设置表格的自动调整模式 |
在利用setSelectionMode(int sm)方法设置表格行的选择模式时,它的入口参数从ListSelectionModel的静态常量中选择。如下:
静态常量:SINGLE_SELECTION,常量值:0,表示只选择一个。
静态常量:SINGLE_INTERVAL_SELECTION,常量值:1,表示允许连续选择多个
静态常量:MULTIPLE_INTERVAL_SELECTION,常量值:2,表示随意选择多个
在利用setAutoResizeMode(int mode)方法设置表格的自动调整模式时(自动调整模式就是在调整表格某一列的宽度时,表格采用什么样的方式保持其总宽度不变),它的入口参数从JTable类的静态常量中选择。
import javax.swing.*;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.*;
public class t3 extends JFrame{
private JScrollPane jscrollpane = new JScrollPane();
private Vector dataTitle = new Vector();
private Vector> data = new Vector>();
public t3() {
setTitle("定制表格");
setBounds(400, 400, 400, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//定义表格每列的标题
for(int i = 0; i < 10; i++) {
dataTitle.add(String.valueOf((char) ('A'+i)));
}
//定义表格每列的内容
for(int i = 1; i < 11; i++) {
Vector W = new Vector();
for(int j = 1; j < 11; j++) {
W.add(dataTitle.get(j-1) + j);
}
data.add(W);
}
JTable jtable = new MJTable(data, dataTitle);
jtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//关闭表格列的自动调整功能
jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置选择模式为单选
jtable.setSelectionBackground(Color.blue);//设置被选择行的背景色为蓝色
jtable.setSelectionForeground(Color.RED);//设置被选择行的前景色为红色
jtable.setRowHeight(50);//设置单元格的行高为50
jtable.setRowHeight(3, 100);//指定第4行的行高为100
jscrollpane.setViewportView(jtable);
add(jscrollpane);
}
//实现自己制定的表格
private class MJTable extends JTable{
public MJTable(Vector> data, Vector dataTitle) {
super(data, dataTitle);
}
//定义表格表头
public JTableHeader getTableHeader() {
JTableHeader jtableHeader = super.getTableHeader();//获得表格的表头对象
jtableHeader.setReorderingAllowed(false);//设置表格不可重排
DefaultTableCellRenderer hr = (DefaultTableCellRenderer)jtableHeader.getDefaultRenderer();//获得表头的单元格对象
hr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);//设置列名居中显示
return jtableHeader;
}
//定义单元格
public TableCellRenderer getDefaultRenderer(Class> data) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer)super.getDefaultRenderer(data);//获得表格的单元格对象
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);//设置单元格中的内容居中显示
return cr;
}
//定义表格不可编辑
public boolean isCellEditable(int row, int column) {
return false;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
t3 T = new t3();
}
}
在编写应用程序时,经常需要获得表格的一些信息,如下是JTable类中的三个经常用来获得表格信息的方法。
getRowCount():获得表格拥有的行数,返回值为int型。
getColumnCount():获得表格拥有的列数,返回值为int型。
getColumnName(int column):获得位于指定索引位置的列的名称,返回值为String型。
JTable类中经常用来操纵表格选中行的方法如下:
setRowSelectionInterval(int from,int to):选中行索引从from到to的所有行(包括索引为from到to的行)
addRowSelectionInterval(int from,int to):将行索引从from到to的所有行追加为表格的选中行
isRowSelected(int row):查看行索引为row的行是否被选中
selectAll():选中表格中的所有行
clearSelection():取消所有选中行的选择状态
getSelectedRowCount():得到选中行的数量,返回值为int型,如果没有被选中的行,则返回-1
getSelectedRow():得到被选中的行中最小的索引值,返回值为int型,如果没有被选中的行,则返回-1
getSelectedRows():获得所有被选中行的索引值,返回值为int数组
注意:由JTable类实现的表格的行索引和列索引均从0开始,即第一行的索引为0,第二行的索引为1,依次类推。
JTable类中还提供了一个用来移动表格列位置的方法moveColumn(int column, int targetColumn),其中column为想要移动列的索引值,targetColumn为目的列的索引值。
接口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));
在使用表格排序器时,通常需要为其设置表格模型,一种方法是通过构造方法TableRowSorter(TableModel model),另一种方法是通过setModel(TableModel model)方法为表格排序器设置表格模型。
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.awt.*;
import java.util.*;
public class t3 extends JFrame{
private JScrollPane jscrollpane = new JScrollPane();
private Vector dataTitle = new Vector();
private Vector> data = new Vector>();
public t3() {
setTitle("定制表格");
setBounds(400, 400, 400, 400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//定义表格每列的标题
for(int i = 0; i < 10; i++) {
dataTitle.add(String.valueOf((char) ('A'+i)));
}
//定义表格每列的内容
for(int i = 1; i < 11; i++) {
Vector W = new Vector();
for(int j = 1; j < 11; j++) {
W.add(dataTitle.get(j-1) + j);
}
data.add(W);
}
JTable jtable = new MJTable(data, dataTitle);
jtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//关闭表格列的自动调整功能
jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置选择模式为单选
jtable.setSelectionBackground(Color.blue);//设置被选择行的背景色为蓝色
jtable.setSelectionForeground(Color.RED);//设置被选择行的前景色为红色
jtable.setRowHeight(50);//设置单元格的行高为50
jtable.setRowHeight(3, 100);//指定第4行的行高为100
jscrollpane.setViewportView(jtable);
add(jscrollpane);
}
//实现自己制定的表格
private class MJTable extends JTable{
public MJTable(Vector> data, Vector dataTitle) {
super(data, dataTitle);
DefaultTableModel tableModel = new DefaultTableModel(data, dataTitle);
setRowSorter((RowSorter extends TableModel>) new TableRowSorter(tableModel));//实现排序
}
//定义表格表头
public JTableHeader getTableHeader() {
JTableHeader jtableHeader = super.getTableHeader();//获得表格的表头对象
jtableHeader.setReorderingAllowed(false);//设置表格不可重排
DefaultTableCellRenderer hr = (DefaultTableCellRenderer)jtableHeader.getDefaultRenderer();//获得表头的单元格对象
hr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);//设置列名居中显示
return jtableHeader;
}
//定义单元格
public TableCellRenderer getDefaultRenderer(Class> data) {
DefaultTableCellRenderer cr = (DefaultTableCellRenderer)super.getDefaultRenderer(data);//获得表格的单元格对象
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);//设置单元格中的内容居中显示
return cr;
}
//定义表格不可编辑
public boolean isCellEditable(int row, int column) {
return false;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
t3 T = new t3();
}
}
维护表格模型
使用表格时,需要经常对表格中的内容进行维护,如向表格中添加新的数据行、修改表格中某一单元格的值、从表格中删除数据行等,这些操作都可以通过维护表格模型来完成。
在向表格模型中添加新的数据行时有两种情况:一种是添加到表格模型的尾部,另一种是添加到表格模型指定的索引处,分别由addRow(Object[] rowData)和insertRow(int row,Object[] rowData)或addRow(Vector rowData)和insertRow(int row,Vector rowData)方法实现。
如果需要修改表格模型钟某一个单元格的数据,可以通过方法setValueAt(Object aValue,int row,int column)完成,其中aValue就是修改后的值,可以通过getValueAt(int row,int column)获得单元格的值,该方法返回Object型。
如果需要删除表格模型中的某一行的数据,可以通过方法removeRow(int row)完成,其中row为想要删除某一行的行索引。
注意:如果需要删除表格模型中某一行的数据,可以通过方法removeRow(int row)来完成,其中row为欲要删除行的索引。
在删除表格模型中的数据时,每删除一行,其后所有行的索引值相应的减一,所以当连续删除多行时,需要注意对删除行索引的处理。
import java.util.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.table.*;
public class t4 extends JFrame {
private DefaultTableModel tableModel;
private JTable jtable;
private JTextField textfield1;
private JTextField textfield2;
private JScrollPane jscrollpane = new JScrollPane();
private JPanel jpanel = new JPanel();
private JButton button1 = new JButton("添加");
private JButton button2 = new JButton("删除");
private JButton button3 = new JButton("修改");
private Vector dataTitle = new Vector();//表格列名
private Vector> data = new Vector>();//表格单元格内容
public t4() {
setTitle("维护表格模型");
setVisible(true);
setBounds(300,300,300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//添加表格列名
dataTitle.add("编号");
dataTitle.add("内容");
//添加表格单元格内容
for(int i = 1; i < 4; i++) {
Vector W = new Vector();
W.add("A"+i*10);
W.add("B"+i*10);
data.add(W);
}
//创建指定表格模型的表格,并设置表格排序器,表格的选择模式为单选
tableModel = new DefaultTableModel(data, dataTitle);
jtable = new JTable(tableModel);
jtable.setRowSorter(new TableRowSorter(tableModel));
jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//为表格添加鼠标事件监听器(单击事件)
jtable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int selectRow = jtable.getSelectedRow();//获取鼠标选择行的索引值
Object selectValues1 = jtable.getValueAt(selectRow, 0);//获取选择的单元格的内容
Object selectValues2 = jtable.getValueAt(selectRow, 1);
textfield1.setText(selectValues1.toString());//将单元格的内容显示在文本框中
textfield2.setText(selectValues2.toString());
}
});
jscrollpane.setViewportView(jtable);
add(jscrollpane, BorderLayout.NORTH);
add(jpanel, BorderLayout.SOUTH);
jpanel.add(new JLabel("编号:"));
jpanel.add(textfield1 = new JTextField("显示的是编号",10));
jpanel.add(new JLabel("内容:"));
jpanel.add(textfield2 = new JTextField("显示的是内容",10));
//向表格中添加内容
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String[] addData = {textfield1.getText(), textfield2.getText()};//获取文本框中的内容
tableModel.addRow(addData);//将文本框中的内容添加到表格模型中的末尾一行
int row = jtable.getRowCount()+1;//获取表格的行数
textfield1.setText("成功添加到第"+row+"行");
textfield2.setText("成功添加到第"+row+"行");
}
});
jpanel.add(button1);
//删除选中的表格行的内容
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
int row = jtable.getSelectedRow();// 获得被选中行的索引
if(row != -1) {// 判断是否存在被选中行
tableModel.removeRow(row);//从表格模型中删除
}
}
});
jpanel.add(button2);
//修改选中的表格行的内容
button3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int row = jtable.getSelectedRow();// 获得被选中行的索引
if (row != -1) {// 判断是否存在被选中行
tableModel.setValueAt(textfield1.getText(),row, 0);// 修改表格模型当中的指定值
tableModel.setValueAt(textfield2.getText(),row, 1);// 修改表格模型当中的指定值
}
}
});
jpanel.add(button3);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
t4 T = new t4();
}
}
运行截图: