参考为官方文档,官方文档写的非常好,但是因为他的代码是七零八落的,所以我想写一篇博客,将代码汇总。
import javax.swing.*;
import java.awt.*;
public class CreateJTable {
private JFrame container;
private JTable jTable;
public CreateJTable(){
String [] columnName = {
"name",
"age"
};
Object [][] data={
{"zhp",20},
{"zyh",21},
{"zk",22}
};
jTable=new JTable(data,columnName);
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewportView(jTable);
container = new JFrame("JTable Test1");
container.setSize(800,600);
container.setLayout(new BorderLayout());
container.add(jScrollPane,BorderLayout.CENTER);
container.setVisible(true);
}
public static void main(String [] args){
CreateJTable createJTable = new CreateJTable();
}
}
为什么要将JTable放入一个容器中呢?因为如果只是一个单独的JTable是不会显示表格头,想要显示可以手动添加,或者将JTable放入一个容器中,让容器自动添加。
container.setLayout(new BorderLayout());
container.add(table.getTableHeader(), BorderLayout.PAGE_START);
container.add(table, BorderLayout.CENTER);
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
默认情况下,JTable表格的每一列宽度相同,请看第一张图。但是现在我希望有一些列的长度变化,怎么办?使用setPreferredWidth()
方法
TableColumn column = null;
for (int i = 0; i < 2; i++) {
column = table.getColumnModel().getColumn(i);//获得每一列
if (i == 0) {
column.setPreferredWidth(100); //设置第1列的宽度
} else {
column.setPreferredWidth(50);//设置其他列的宽度
}
}
现在列宽是不一样的了,注意如果你的总列宽要比,所有列的宽度总和要大的话,这样的设置是不起作用的,比如说我设定jTable的宽度为800,然后我让第一列宽为100,第二列宽为50,这样的设定根本不会起作用。
每一个JTable对象必须要使用TableModel,你可能说在上面的例子中我也没有写什么TableModel啊,那是因为系统帮你代劳了(如果程序中没有TableModel对象,那么它会被自动创建为默认模式)
TableModel是用来干什么的呢?
我们来看一看默认的TableModel中含有那些方法:
new AbstractTableModel() {
public String getColumnName(int col) {
return columnNames[col].toString();
}
public int getRowCount() { return rowData.length; }
public int getColumnCount() { return columnNames.length; }
public Object getValueAt(int row, int col) {
return rowData[row][col];
}
public boolean isCellEditable(int row, int col)
{ return true; }
public void setValueAt(Object value, int row, int col) {
rowData[row][col] = value;
fireTableCellUpdated(row, col);
}
}
我们看到都是一些常规的方法,如getColumnName
为获得列名,getRowCount
获得行数,getColumnCount
获得列数,getValueAt
获得某行某列的值,isCellEditable
设定可被修改,setValueAt
设定某行某列的值。
在TableModel中还可以干什么呢?你可以规定数据存放在哪里,可以是数组、向量或者HashMap,也可以从数据库中获得数据。
现在让我们更新一下我们的JTable吧!
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
public class JTableModel {
private JFrame jFrame;
private JTable jTable;
public JTableModel(){
jTable = new JTable(new MyTableModel());
jFrame = new JFrame("JTableModel Test");
jFrame.setSize(800,600);
jFrame.setLayout(new BorderLayout());
jFrame.add(jTable,BorderLayout.CENTER);
jFrame.setVisible(true);
}
class MyTableModel extends AbstractTableModel{
private String [] columnName={"name","age"};
private String [][] data={
{"zhp","20"},
{"zyh","21"},
{"zk","22"}
};
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return columnName.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
}
public static void main(String [] args){
JTableModel jTableModel = new JTableModel();
}
}
这样写也让我们的代码更加有条理了!