JAVA学习之JTable(表格)

       之前是搞c语言的,对于java的图形化编程是很不适应,学习了一点表格,但是好像还是云里雾里,可能需要记忆的东西,经验的东西比较多,自己只是学习也没有应用过。感觉也没什么好写的,但是还是要坚持写一点记录下简单的知识,方便以后查阅。

1、JFrame、JScrollPane、JTable创建表格

对于图形化,一个图表首先要在一个可视化的窗口中,对于java就是JFrame

import java.awt.*;

import javax.swing.*;
public class ExampleFrame_01 extends JFrame {
	public static void main(String args[]) {
		ExampleFrame_01 frame = new ExampleFrame_01();
		frame.setVisible(true);
	}
	
	public ExampleFrame_01() {
		super();
		setTitle("创建可以滚动的表格");
		setBounds(100, 100, 240, 150);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        .....................//此处为表格的实现
	}
}

从上面的代码可以看到JFrame的用法,自己建了一个类ExampleFrame_01继承了JFrame,程序运行从main函数开始

main函数中实例化了一个frame,然后设置frame为可见。

实例化ExampleFrame_01会执行,ExampleFrame_01的重构函数,即ExampleFrame_01();

在这个函数里面super();为调用父类即JFrame的构造函数,一般子类的构造函数都要执行下父类的构造函数。

setTitle设置窗口的名字,setBounds设置窗口的边界,setDefaultCloseOperation设置窗口的关闭方式。

 

有了窗口,下面先创建一个图表,图表分为列名和表格里面的内容,就是一个一维数组和一个二维数组组成。

        String[] columnNames = { "A", "B" }; // 定义表格列名数组
        String[][] tableValues = { { "A1", "B1" }, { "A2", "B2" },{ "A3", "B3" }, { "A4", "B4" }, { "A5", "B5" } }; // 定义表格数据数组
        JTable table = new JTable(tableValues, columnNames);// 创建指定列名和数据的表格

上面是直接用数组进行创建,数组也可以Vector来创建。

 

窗口介绍完了,一般一个表格大小不固定,可能比窗口大,所以表格一般都在一个JScrollPane滚动面板里面。

        JScrollPane scrollPane = new JScrollPane(table);

上面语句的意思是定义一个JScrollPane 里面有一个table。还有另外一种实现为:

        final JScrollPane scrollPane = new JScrollPane();

        scrollPane.setViewportView(table);

面板创建好了,要规定下在窗口中的位置,例如在中间

        getContentPane().add(scrollPane, BorderLayout.CENTER);

以上代码如下:

		String[] columnNames = { "A", "B" }; // 定义表格列名数组
		// 定义表格数据数组
		String[][] tableValues = { { "A1", "B1" }, { "A2", "B2" },
				{ "A3", "B3" }, { "A4", "B4" }, { "A5", "B5" } };
		// 创建指定列名和数据的表格
		JTable table = new JTable(tableValues, columnNames);
		// 创建显示表格的滚动面板
		JScrollPane scrollPane = new JScrollPane(table);
		// 将滚动面板添加到边界布局的中间
		getContentPane().add(scrollPane, BorderLayout.CENTER);

运行的效果如下:

 2、Jtable常用方法

        // 关闭表格列的自动调整功能
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        // 选择模式为单选
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        // 被选择行的背景色为黄色
        table.setSelectionBackground(Color.YELLOW);
        // 被选择行的前景色(文字颜色)为红色
        table.setSelectionForeground(Color.RED);
        table.setRowHeight(30); // 表格的行高为30像素

table.selectAll();// 选中所有行

table.clearSelection();// 取消所有选中行的选择状态

table.getRowCount()//获取行数

table.getSelectedRowCount() //获取选择的行数

table.getColumnName(1)//第2列的名称

table.getValueAt(1, 1)//第2行第2列的值

 tableModel.setValueAt(aTextField.getText(),
selectedRow, 0);// 修改表格模型当中的指定值

table.isRowSelected(2)//第3行的选择状态

tableModel.addRow(rowValues);// 向表格模型中添加一行
 tableModel.removeRow(selectedRow);// 从表格模型当中删除指定行

可以自己下载一个java的API文档,查看各个函数的用法,例如:

 3、一种特殊的表格:固定一列的表格MFixedColumnTable

如上图,固定日期一列,然后下面的水平滚动条进行滚动,日期这一列不变。

    // 创建固定列表格模型对象
    fixedColumnTableModel = new FixedColumnTableModel();

    // 将固定列表格头放到滚动面版的左上方
    scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
            fixedColumnTable.getTableHeader());
    // 创建一个用来显示基础信息的视口对象
    JViewport viewport = new JViewport();
    viewport.setView(fixedColumnTable);// 将固定列表格添加到视口中
    // 设置视口的首选大小为固定列表格的首选大小
    viewport.setPreferredSize(fixedColumnTable.getPreferredSize());
    // 将视口添加到滚动面版的标题视口中
    scrollPane.setRowHeaderView(viewport);

------------下面定义非固定列-----------

    // 创建可移动列表格模型对象
    floatingColumnTableModel = new FloatingColumnTableModel();
    // 创建可移动列表格对象
    floatingColumnTable = new JTable(floatingColumnTableModel);
    // 将可移动表格添加到默认视口
    scrollPane.setViewportView(floatingColumnTable);
    add(scrollPane, BorderLayout.CENTER);

ExampleFrame_07.java

import java.awt.*;
import java.util.*;

import javax.swing.*;

public class ExampleFrame_07 extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static void main(String args[]) {
		try {
			ExampleFrame_07 frame = new ExampleFrame_07();
			frame.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public ExampleFrame_07() {
		super();
		setTitle("提供行标题栏的表格");
		setBounds(100, 100, 500, 375);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Vector<String> columnNameV = new Vector<>();
		columnNameV.add("日期");
		for (int i = 1; i < 21; i++) {
			columnNameV.add("商品" + i);
		}
		Vector<Vector<Object>> tableValueV = new Vector<>();
		for (int row = 1; row < 31; row++) {
			Vector<Object> rowV = new Vector<>();
			rowV.add(row);
			for (int col = 0; col < 20; col++) {
				rowV.add((int) (Math.random() * 1000));
			}
			tableValueV.add(rowV);
		}
		final MFixedColumnTable panel = new MFixedColumnTable(columnNameV,
				tableValueV, 1);
		getContentPane().add(panel, BorderLayout.CENTER);
		//
	}
	
}

 MFixedColumnTable.java

import java.awt.*;
import java.util.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class MFixedColumnTable extends JPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JTable fixedColumnTable;// 固定列表格对象
	private FixedColumnTableModel fixedColumnTableModel;// 固定列表格模型对象
	private JTable floatingColumnTable;// 移动列表格对象
	// 移动列表格模型对象
	private FloatingColumnTableModel floatingColumnTableModel;
	private Vector<String> columnNameV;// 表格列名数组
	private Vector<Vector<Object>> tableValueV;// 表格数据数组
	private int fixedColumn = 1;// 固定列数量
	
public MFixedColumnTable(Vector<String> columnNameV,
		Vector<Vector<Object>> tableValueV, int fixedColumn) {
	super();
	setLayout(new BorderLayout());
	this.columnNameV = columnNameV;
	this.tableValueV = tableValueV;
	this.fixedColumn = fixedColumn;
	// 创建固定列表格模型对象
	fixedColumnTableModel = new FixedColumnTableModel();
	// 创建固定列表格对象
	fixedColumnTable = new JTable(fixedColumnTableModel);
	// 获得选择模型对象
	ListSelectionModel fixed = fixedColumnTable.getSelectionModel();
	// 选择模式为单选
	fixed.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	// 添加行被选中的事件监听器
	fixed.addListSelectionListener(new MListSelectionListener(true));
	// 创建可移动列表格模型对象
	floatingColumnTableModel = new FloatingColumnTableModel();
	// 创建可移动列表格对象
	floatingColumnTable = new JTable(floatingColumnTableModel);
	// 关闭表格的自动调整功能
	floatingColumnTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	ListSelectionModel floating = floatingColumnTable
			.getSelectionModel();// 获得选择模型对象
	// 选择模式为单选
	floating.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	// 添加行被选中的事件监听器
	MListSelectionListener listener = new MListSelectionListener(false);
	floating.addListSelectionListener(listener);
	JScrollPane scrollPane = new JScrollPane();// 创建一个滚动面版对象
	// 将固定列表格头放到滚动面版的左上方
	scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
			fixedColumnTable.getTableHeader());
	// 创建一个用来显示基础信息的视口对象
	JViewport viewport = new JViewport();
	viewport.setView(fixedColumnTable);// 将固定列表格添加到视口中
	// 设置视口的首选大小为固定列表格的首选大小
	viewport.setPreferredSize(fixedColumnTable.getPreferredSize());
	// 将视口添加到滚动面版的标题视口中
	scrollPane.setRowHeaderView(viewport);
	// 将可移动表格添加到默认视口
	scrollPane.setViewportView(floatingColumnTable);
	add(scrollPane, BorderLayout.CENTER);
}
	
	private class FixedColumnTableModel extends AbstractTableModel {
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public int getColumnCount() {// 返回固定列的数量
			return fixedColumn;
		}
		
		public int getRowCount() {// 返回行数
			return tableValueV.size();
		}
		
		// 返回指定单元格的值
		public Object getValueAt(int rowIndex, int columnIndex) {
			return tableValueV.get(rowIndex).get(columnIndex);
		}
		
		@Override
		public String getColumnName(int columnIndex) {// 返回指定列的名称
			return columnNameV.get(columnIndex);
		}
	}
	
	private class FloatingColumnTableModel extends AbstractTableModel {
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public int getColumnCount() {// 返回可移动列的数量
			return columnNameV.size() - fixedColumn;// 需要扣除固定列的数量
		}
		
		public int getRowCount() {// 返回行数
			return tableValueV.size();
		}
		
		// 返回指定单元格的值
		public Object getValueAt(int rowIndex, int columnIndex) {
			// 需要为列索引加上固定列的数量
			return tableValueV.get(rowIndex)
					.get(columnIndex + fixedColumn);
		}
		
		@Override
		public String getColumnName(int columnIndex) {// 返回指定列的名称
			// 需要为列索引加上固定列的数量
			return columnNameV.get(columnIndex + fixedColumn);
		}
	}
	
	private class MListSelectionListener implements ListSelectionListener {
		boolean isFixedColumnTable = true; // 默认由选中固定列表格中的行触发
		
		public MListSelectionListener(boolean isFixedColumnTable) {
			this.isFixedColumnTable = isFixedColumnTable;
		}
		
		public void valueChanged(ListSelectionEvent e) {
			if (isFixedColumnTable) { // 由选中固定列表格中的行触发
				// 获得固定列表格中的选中行
				int row = fixedColumnTable.getSelectedRow();
				// 同时选中右侧可移动列表格中的相应行
				floatingColumnTable.setRowSelectionInterval(row, row);
			} else { // 由选中可移动列表格中的行触发
				// 获得可移动列表格中的选中行
				int row = floatingColumnTable.getSelectedRow();
				// 同时选中左侧固定列表格中的相应行
				fixedColumnTable.setRowSelectionInterval(row, row);
			}
		}
	}
}

 

  • 45
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值