JAVA学习之JTable(表格)

2024-03-27 18:38
文章标签 java 学习 表格 jtable

本文主要是介绍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);}@Overridepublic 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);}@Overridepublic 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);}}}
}

 

这篇关于JAVA学习之JTable(表格)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853029

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操