目录
7 JTable、TableModel实现表格
7.1 创建简单表格
7.2 TableModel
表格也是GUI程序中常用的组件,表格是一个由多行、多列组成的二维显示区。Swing的JTable以及相关类提供了这种表格支持,通过使用JTable以及相关类,程序既可以使用简单的代码创建表格来显示二维数据,也可以开发出功能丰富的表格,还可以为表格定制各种显式外观,编辑特性。
使用JTable创建简单表格步骤:
1.创建一个一维数组,存储表格中每一列的标题
2.创建一个二维数组,存储表格中每一行的数据,其中二维数组内部的每个一维数组代表表格中的一行数据
3.根据第一步和第二步创建的一维数组和二维数组,创建JTable对象
4.把JTable添加到其他容器中显示
案例:
使用JTable实现下图效果:
public class SimpleTable {
JFrame jf = new JFrame("简单表格");
//创建一维数组,存储标题
Object[] titles = {"姓名","年龄","性别"};
//创建二维数组,存储数据
Object[][] data = {
{"李清照",29,"女"},
{"苏格拉底",56,"男"},
{"李白",35,"男"},
{"弄玉",18,"女"},
{"虎头",2,"男"}
};
public void init(){
//组装视图
JTable jTable = new JTable(data,titles);
jf.add(new JScrollPane(jTable));
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
new SimpleTable().init();
}
}
与JList、JTree类似的是,JTable采用了TableModel来保存表格中的所有状态数据:与ListModel类似的是,TableModel也不强制保存该表格显示的数据。虽然在前面程序中看到的是直接利用一个二维数组来创建JTable对象,但也可以通过TableModel对象来创建表格。
自定义TableModel步骤:
1.自定义类,继承AbstractTableModel抽象类,重写下面方法:
int getColumnCount();返回表格列的数量
int getRowCount();返回表格行的数量
Object getValueAt(int rowIndex,int columnIndex);返回rowIndex行,column列的单元格的值
String getColumnName(int columnIndex);返回columnIndex列的列名称
boolean isCellEditable(int rowIndex,int columnIndex);设置rowIndex行,columnIndex列单元格是否可编辑
2.创建自定义类对象,根据该对象,创建JTable对象
案例:
代码演示:
public class TableModelTest {
JFrame jf = new JFrame("TableModel演示");
//创建一维数组,存储标题
Object[] titles = {"姓名","年龄","性别"};
//创建二维数组,存储数据
Object[][] data = {
{"李清照",29,"女"},
{"苏格拉底",56,"男"},
{"李白",35,"男"},
{"弄玉",18,"女"},
{"虎头",2,"男"}
};
private Vector titlesV = new Vector();//存储标题
private Vector dataV = new Vector<>();//存储数据
public void init(){
//组装视图
for (int i = 0; i < titles.length; i++) {
titlesV.add(titles[i]);
}
for (int i = 0; i < data.length; i++) {
Vector t = new Vector<>();
for (int j = 0; j < data[i].length; j++) {
t.add(data[i][j]);
}
dataV.add(t);
}
MyTableModel myTableModel = new MyTableModel();
//JTable jTable = new JTable(dataV,titlesV);
JTable jTable = new JTable(myTableModel);
jf.add(new JScrollPane(jTable));
JButton btn = new JButton("获取选中行数据");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int selectedColumn = jTable.getSelectedColumn();
int selectedRow = jTable.getSelectedRow();
System.out.println("当前选中行的索引:"+selectedRow);
System.out.println("当前选中列的索引:"+selectedColumn);
Object value = myTableModel.getValueAt(selectedRow, selectedColumn);
System.out.println("当前选中行第一个单元格的内容为:"+value);
}
});
jf.add(btn, BorderLayout.SOUTH);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.pack();
jf.setVisible(true);
}
private class MyTableModel extends AbstractTableModel{
@Override
public int getRowCount() {
return dataV.size();
}
@Override
public int getColumnCount() {
return titlesV.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return dataV.get(rowIndex).get(columnIndex);
}
@Override
public String getColumnName(int column) {
return (String) titlesV.get(column);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
}
public static void main(String[] args) {
new TableModelTest().init();
}
}
不仅用户可以扩展AbstractTableModel抽象类,Swing本身也为AbstractTableModel提供了一个DefaultTableModel实现类,程序可以通过使用DefaultTableModel实现类来创建JTable对象。通过DefaultTableModel对象创建JTable对象后,就可以调用它提供的方法来添加数据行、插入数据行、删除数据行和移动数据行。DefaultTableModel提供了如下几个方法来控制数据行操作:
addColumn(Object columnName);添加一列
addRow(Object[] rowData);添加一行
insertRow(int row,Object[] rowData);指定位置处插入一行
removeRow(int row);删除一行
moveRow(int start,int end,int to);移动指定范围内的数据行
案例:
public class DefaultTableModelTest {
JFrame jf = new JFrame("TableModel演示");
//创建一维数组,存储标题
Object[] titles = {"姓名","年龄","性别"};
//创建二维数组,存储数据
Object[][] data = {
{"李清照",29,"女"},
{"苏格拉底",56,"男"},
{"李白",35,"男"},
{"弄玉",18,"女"},
{"虎头",2,"男"}
};
private Vector titlesV = new Vector();//存储标题
private Vector dataV = new Vector<>();//存储数据
public void init(){
//组装视图
for (int i = 0; i < titles.length; i++) {
titlesV.add(titles[i]);
}
for (int i = 0; i < data.length; i++) {
Vector t = new Vector<>();
for (int j = 0; j < data[i].length; j++) {
t.add(data[i][j]);
}
dataV.add(t);
}
//通过DefaultTableModel创建JTable
DefaultTableModel model = new DefaultTableModel(dataV,titlesV);
JTable jTable = new JTable(model);
//创建按钮
JButton addRow = new JButton("添加一行");
JButton addColum = new JButton("添加一列");
JButton deleteRow = new JButton("删除一行");
addRow.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//需要给表格添加一行
model.addRow(new Object[]{"胡歌",30,"男"});
}
});
deleteRow.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int selectedRow = jTable.getSelectedRow();
model.removeRow(selectedRow);
}
});
addColum.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
model.addColumn("职业");
}
});
JPanel panel = new JPanel();
panel.add(addRow);
panel.add(addColum);
panel.add(deleteRow);
jf.add(panel, BorderLayout.SOUTH);
jf.add(new JScrollPane(jTable));
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
new DefaultTableModelTest().init();
}
}