Java表格的简单使用一

JTable组件使用的是模型/视图/控制器的设计方式,将可视化组件从其数据中分离出来,因此表格中的数据都封装在数据模型中。其中最重要的支持类就是TableModel类,这个类用来定义JTable类以及其数据模型之间的接口。

创建一个简单的表格:

import java.awt.*;
import javax.swing.*;
public class SimpleTableTest extends JFrame{

	private static final long serialVersionUID = 1L;
	protected JTable table;
	protected Object[][] data;
	protected String[] colname = {"编号","书名","作者","主角","类别","选择"};
	public SimpleTableTest(){
		Container pane = getContentPane();
		pane.setLayout(new BorderLayout());
		createTableData();  //创建表格所需数据 
		table = getSimpleTable();  
		JScrollPane jsPane = new JScrollPane(table);
		pane.add(jsPane,BorderLayout.CENTER);
	}
	public void createTableData(){
		data = new Object[10][6];
		int i =0;
		data[i++] = new Object[]{"01","射雕英雄传","金庸","郭靖","武侠",true};
		data[i++] = new Object[]{"02","神雕侠侣"  ,"金庸","杨过","武侠",false};
		data[i++] = new Object[]{"03","笑傲江湖"  ,"金庸","令狐冲","武侠",true};
		data[i++] = new Object[]{"04","鹿鼎记"  ,"金庸","韦小宝","武侠",false};
		data[i++] = new Object[]{"05","大旗英雄传"  ,"古龙","铁中棠","武侠",false};
		data[i++] = new Object[]{"06","陆小凤传奇"  ,"古龙","陆小凤","武侠",false};
		data[i++] = new Object[]{"07","多情剑客无情剑"  ,"古龙","李寻欢","武侠",false};
		data[i++] = new Object[]{"08","三国演义"  ,"罗贯中","无","古典名著",false};
		data[i++] = new Object[]{"09","封神演义"  ,"陈仲琳","无","古典名著",false};
		data[i++] = new Object[]{"10","绿野仙踪"  ,"李百川","冷于冰","古典名著",false};
	}
	public static void main(String[] args){
		SimpleTableTest stt= new SimpleTableTest();
		stt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		stt.setSize(400, 200);
		stt.setVisible(true);
	}
	/**
	 * 返回一个简单的表格
	 * @return
	 */
	public JTable getSimpleTable(){
		table = new JTable(data,colname);
		return table;
	}
}
        运行结果如下图所示:


虽然没有创建表格模型,但是JTable的构造函数默认创建了一个表格模型。

    public JTable(final Object[][] rowData, final Object[] columnNames) {
        this(new AbstractTableModel() {
            public String getColumnName(int column) { return columnNames[column].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 column) { return true; }
            public void setValueAt(Object value, int row, int col) {
                rowData[row][col] = value;
                fireTableCellUpdated(row, col);
            }
        });
    }

该构造函数实现了AbstractTableModel类。上述六种方法的作用是:返回表格的列名,返回行数,返回列数,返回特定单元格的值,判断特定单元格是否可编辑,设置特定单元格的值。

另外Java也提供了另外一种类DefaultTableModel类来实现TableModel接口。

AbstractTableModel与DefaultTableModel的区别

简单来说,DefaultTableModel使用起来要容易一些,但是DefaultTableModel在使用时会将所有的数据加载到内存中,因此适合表格中只含有少量数据时使用。而AbstractTableModel适合显示大量数据时使用,它不会将所有数据都载入内存,只有在需要时才会加载数据,从而最小限度的使用内存。

设置表格的样式

/**
	 * 设置表格风格
	 * @param tb
	 */
	public void setSimpleTableStyle(JTable tb){
		//设置表头的背景色
		tb.getTableHeader().setBackground(Color.BLUE);
		//设置表头的文字颜色
		tb.getTableHeader().setForeground(Color.RED);
		//设置表头字体
		tb.getTableHeader().setFont(new Font("隶书",Font.PLAIN,14));
		// 设置行高
		tb.setRowHeight(30);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
		table.getColumn(colname[0]).setPreferredWidth(150);  //设置第1列的宽度
		table.getColumn(colname[1]).setPreferredWidth(140);  //设置第2列的宽度
		table.setBackground(new Color(244, 244, 242)); //设置表格背景
		tb.setForeground(Color.GREEN);   //设置表格颜色
		tb.setFont(new Font("隶书",Font.PLAIN,14)); //设置表格字体
		// 隐藏最后一列
		table.getColumn(colname[colname.length - 1]).setMaxWidth(0); 
		table.getColumn(colname[colname.length - 1]).setMinWidth(0);
		table.getColumn(colname[colname.length - 1]).setPreferredWidth(0);
                   //设置表格的自动调整模式
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                  //设置表格的行选择模式
                table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                  //设置是否允许选择表格行
                table.setRowSelectionAllowed(true);
                  //设置是否允许选择表格列
                table.setColumnSelectionAllowed(true);
                 //设置是否允许同时存在行选择与列选择
                table.setCellSelectionEnabled(true);
 }
运行结果:

需要注意的是getColumn()方法是通过列名来获取对应列的TableColumn对象,当表格中有相同列名时只返回最先匹配列的TableColumn对象。你可以在列名前后加上空格用来区分。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值