JTable 的使用指南

参考为官方文档,官方文档写的非常好,但是因为他的代码是七零八落的,所以我想写一篇博客,将代码汇总。

Create a simple table

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 的使用指南_第1张图片

Add a Table to a Container

为什么要将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);

Setting and Changing Column Widths

默认情况下,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 的使用指南_第2张图片
现在列宽是不一样的了,注意如果你的总列宽要比,所有列的宽度总和要大的话,这样的设置是不起作用的,比如说我设定jTable的宽度为800,然后我让第一列宽为100,第二列宽为50,这样的设定根本不会起作用。

User Selection

Creating a Table Model

每一个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();
    }
}

这样写也让我们的代码更加有条理了!

你可能感兴趣的:(java网络)