1.基本表格
显示一个Table需要两组数据
- 一维数组: String[]columnNames 表示表格的标题
- 二维数组: String[][] heros 表格中的内容
默认情况下,表格的标题是不会显示出来了,除非使用了JScrollPane
代码如下:
package gui10;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTable;
public class test1 {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
// 表格上的title
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
// 表格中的内容,是一个二维数组
String[][] heros = new String[][] { { "1", "盖伦", "616", "100" },
{ "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
JTable t = new JTable(heros,columnNames);
f.add(t,BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
结果:
2.JScrollPane
上面看的是没有标题的表格,那么如何才能看到有标题的表格呢?
JScrollPane: 带滚动条的Panel
把table放进去就可以看到table的title
代码如下:
package gui10;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class test2 {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
String[][] heros = new String[][] { { "1", "盖伦", "616", "100" },
{ "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
JTable t = new JTable(heros,columnNames);
// 根据t创建 JScrollPane
JScrollPane sp = new JScrollPane(t);
f.add(sp);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
结果:
和上面的相比,这里的表格多了标题。(这就是使用JScrollPane的区别)
3.列宽
如何来设置表格列的宽度呢?
代码如下:
package gui10;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class test3 {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
String[][] heros = new String[][] { { "1", "盖伦", "616", "100" },
{ "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
JTable t = new JTable(heros,columnNames);
JScrollPane sp = new JScrollPane(t);
t.getColumnModel().getColumn(0).setPreferredWidth(10);
f.add(sp);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
结果:
和上面的表格相比,这张表格的宽度发生了改变。其实就是多加了:t.getColumnModel().getColumn(0).setPreferredWidth(10);
4.TableModel
这里要介绍一个新概念叫TableModel,这个概念十分重要。
首先说下TableModel的设计思想,在Model这种思想的指导下,数据和显示分离开来了。 比如对于JTable而言,有数据部分,也有显示部分(比如列宽等信息)。 数据部分,专门做一个类,叫做TableModel,就用于存放要显示的数据。
使用TableModel的方式存放Table需要显示的数据
HeroTableModel 继承AbstractTableModel ,进而实现了接口TableModel
在HeroTableModel 中提供一个table显示需要的所有信息
- getRowCount 返回一共有多少行
- getColumnCount 返回一共有多少列
- getColumnName 每一列的名字
- isCellEditable 单元格是否可以修改
- getValueAt 每一个单元格里的值
当图形界面需要渲染第一个单元格的数据的时候,就会调用方法TabelModel的getValueAt(0,0) ,把返回值拿到并显示
代码如下:
package gui10;
import javax.swing.table.AbstractTableModel;
public class HeroTableModel extends AbstractTableModel{
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
String[][] heros = new String[][] { { "1", "盖伦", "616", "100" },
{ "2",