前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java Swing JTable

Java Swing JTable

作者头像
JavaEdge
发布于 2021-02-22 06:30:30
发布于 2021-02-22 06:30:30
5.3K00
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

1 简介

JTable用于显示和编辑常规的二维单元格表。有关面向任务的文档和使用JTable的示例,请参见Java教程中的如何使用表。 JTable具有许多功能,可以自定义其呈现和编辑功能,但是为这些功能提供了默认设置,因此可以轻松设置简单的表。例如,要建立一个包含10行10列数字的表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TableModel dataModel = new AbstractTableModel(){
Public int getColumnCount(){返回10; }
Public int getRowCount(){返回10;}
Public Object getValueAt(int row,int col){返回新的Integer(row * col); }
};
JTable表=新的JTable(dataModel);
JScrollPane scrollpane =新的JScrollPane(table);

JTable通常放置在JScrollPane内部。默认情况下,JTable将调整其宽度,从而不需要水平滚动条。要允许水平滚动条,请使用AUTO_RESIZE_OFF调用setAutoResizeMode(int)。请注意,如果希望在独立视图中(在JScrollPane外部)使用JTable并希望显示标头,则可以使用getTableHeader()获取它并单独显示它。

要启用行的排序和过滤,请使用RowSorter。您可以通过以下两种方式之一设置行排序器:

直接设置RowSorter。例如:table.setRowSorter(new TableRowSorter(model))。 将autoCreateRowSorter属性设置为true,以便JTable为您创建RowSorter。例如:setAutoCreateRowSorter(true)。

在设计使用JTable的应用程序时,值得密切注意将代表表数据的数据结构

DefaultTableModel是一个模型实现,它使用对象矢量向量存储单元格值。除了将数据从应用程序复制到DefaultTableModel之外,还可以将数据包装在TableModel接口的方法中,以便可以将数据直接传递到JTable,如上例所示。由于模型可以自由选择最适合数据的内部表示形式,因此通常可以提高应用程序的效率。

确定是使用AbstractTableModel还是DefaultTableModel的一个很好的经验法则是

  • 将AbstractTableModel用作创建子类的基类
  • 而在不需要子类化时使用DefaultTableModel

源分发的演示区域中的“ TableExample”目录提供了一些JTable使用情况的完整示例,涵盖了如何使用JTable提供从数据库获取的数据的可编辑视图以及如何修改显示中的列。使用专门的渲染器和编辑器。

JTable仅使用整数来引用它显示的模型的行和列。 JTable只是采用表格形式的单元格范围,并在绘制过程中使用getValueAt(int,int)从模型中检索值。重要的是要记住,由各种JTable方法返回的列和行索引是根据JTable(视图)而言的,不一定与模型使用的索引相同。

默认情况下,列可能会在JTable中重新排列,以使视图的列以与模型中的列不同的顺序出现。这一点根本不影响模型的实现:对列进行重新排序时,JTable在内部维护列的新顺序并在查询模型之前转换其列索引。

因此,在编写TableModel时,不必侦听列重新排序事件,因为无论视图中发生什么,都将在其自身的坐标系中查询模型。在示例区域中,展示了一种排序算法的演示,该算法正是使用此技术来插入另一个坐标系,在该坐标系中行的顺序发生了变化,而不是列的顺序发生了变化。

同样,使用RowSorter提供的排序和筛选功能时,底层的TableModel不需要知道如何进行排序,而是由RowSorter进行处理。当将JTable的基于行的方法与基础TableModel一起使用时,必须进行坐标转换。所有基于JTables行的方法都是基于RowSorter的,不一定与基础TableModel的相同。例如,选择始终是根据JTable进行的,因此,在使用RowSorter时,您将需要使用convertRowIndexToView或convertRowIndexToModel进行转换。下面显示了如何将JTable的坐标转换为基础模型的坐标:

Int []选择= table.getSelectedRows(); For(int i = 0; i selection.length; i ++){ Selection [i] = table.convertRowIndexToModel(selection [i]); } //现在根据基础TableModel进行选择

默认情况下,如果启用了排序,则JTable将根据排序模型保留选择和可变行高。例如,如果第0行

JTable,表格。用来显示和编辑二维表。 添加表格到容器中有两种方式:

  • 添加到普通的中间容器中,此时添加的jTable只是表格的行内容,表头(jTable.getTableHeader())需要额外单独添加。此添加方式适合表格行数确定,数据量较小,能一次性显示完的表格;
  • 添加到JScrollPane滚动容器中,此添加方式不需要额外添加表头,jTable添加到jScrollPane中后,表头自动添加到滚动容器的顶部,并支持行内容的滚动(滚动行内容时,表头会始终在顶部显示)。

构造方法

创建空表格,后续再添加相应数据 JTable()

创建指定行列数的空表格,表头名称默认使用大写字母(A, B, C …)依次表示 JTable(int numRows, int numColumns)

创建表格,指定 表格行数据 和 表头名称 JTable(Object[][] rowData, Object[] columnNames)

使用表格模型创建表格 JTable(TableModel dm)

JTable 字体 和 网格 颜色设置:

// 设置内容字体 void setFont(Font font)

// 设置字体颜色 void setForeground(Color fg)

// 设置被选中的行前景(被选中时字体的颜色) void setSelectionForeground(Color selectionForeground)

// 设置被选中的行背景 void setSelectionBackground(Color selectionBackground)

// 设置网格颜色 void setGridColor(Color gridColor)

// 设置是否显示网格 void setShowGrid(boolean showGrid)

// 水平方向网格线是否显示 void setShowHorizontalLines(boolean showHorizontalLines)

// 竖直方向网格线是否显示 void setShowVerticalLines(boolean showVerticalLines) JTable 表头 设置:

// 获取表头 JTableHeader jTableHeader = jTable.getTableHeader();

// 设置表头名称字体样式 jTableHeader.setFont(Font font);

// 设置表头名称字体颜色 jTableHeader.setForeground(Color fg);

// 设置用户是否可以通过在头间拖动来调整各列的大小。 jTableHeader.setResizingAllowed(boolean resizingAllowed);

// 设置用户是否可以拖动列头,以重新排序各列。 jTableHeader.setReorderingAllowed(boolean reorderingAllowed);

JTable 行列 相关设置:

// 设置所有行的行高 void setRowHeight(int rowHeight)

// 设置指定行的行高 void setRowHeight(int row, int rowHeight)

/**

设置当手动改变某列列宽时,其他列的列宽自动调整模式,可选值:

*/ void setAutoResizeMode(int mode)

/*

  • 调整列宽 */ // 先获取到某列 TableColumn tableColumn = jTable.getColumnModel().getColumn(int columnIndex);

// 设置列的宽度、首选宽度、最小宽度、最大宽度 tableColumn.setWidth(int width); tableColumn.setPreferredWidth(int preferredWidth); tableColumn.setMinWidth(int minWidth); tableColumn.setMaxWidth(int maxWidth);

// 调整该列的列宽,以适合其标题单元格的宽度。 tableColumn.sizeWidthToFit();

// 是否允许手动改变该列的列宽 tableColumn.setResizable(boolean isResizable);

// 设置该列的表头名称 tableColumn.setHeaderValue(Object headerValue);

数据相关操作:

表格数据的简单设置和获取 // 设置表格中指定单元格的数据 jTable.getModel().setValueAt(Object aValue, int rowIndex, int columnIndex);

// 获取表格中指定单元格的数据 Object value = jTable.getModel().getValueAt(int rowIndex, int columnIndex);

创建带滚动条的表格

  • 效果

创建带滚动条的表格基本步骤:

创建表格 JTable table = new JTable(…);

设置表格相关数据 // 设置滚动面板视口大小(超过该大小的行数据,需要拖动滚动条才能看到) table.setPreferredScrollableViewportSize(new Dimension(int width, int height));

  • 创建滚动面板,把表格放到滚动面板中
  • 再把滚动面板添加到其他容器中显示

TableModel

TableModel 接口指定了 JTable 用于询问表格式数据模型的方法。TableModel 封装了表格中的各种数据,为表格显示提供数据。上面案例中直接使用行数据和表头创建表格,实际上JTable 内部自动将传入的行数据和表头封装成了 TableModel。

只要数据模型实现了 TableModel 接口,就可以通过以下两行代码设置 JTable 显示该模型:

TableModel myData = new MyTableModel(); JTable table = new JTable(myData); TableModel 接口中的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** 返回总行数 */
public int getRowCount();

/** 返回总列数 */
public int getColumnCount();

/** 返回指定列的名称(表头名称) */
public String getColumnName(int columnIndex);

/** 针对列中所有的单元格值,返回最具体的超类。JTable 使用此方法来设置列的默认渲染器和编辑器。 */
public Class getColumnClass(int columnIndex);
  • 判断指定单元格是否可编辑 如果行和列中的单元格是可编辑的,则返回true。否则,在单元格上调用setValueAt将无效。 注意:该列是按表视图的显示顺序指定的,而不是按TableModel的列顺序指定的。这是一个重要的区别,因为当用户重新排列表中的列时,视图中给定索引处的列将发生变化。同时,用户的操作永远不会影响模型的列顺序。

/** 获取指定单元格的值 */ public Object getValueAt(int rowIndex, int columnIndex); /** 设置指定单元格的值 */ public void setValueAt(Object aValue, int rowIndex, int columnIndex); /** 添加表格模型监听器 */ public void addTableModelListener(TableModelListener l); /** 移除表格模型监听器 */ public void removeTableModelListener(TableModelListener l); }

JRE 中常用的已实现 TableModel 接口的类有两个:

(1)javax.swing.table.AbstractTableModel

此抽象类为 TableModel 接口中的大多数方法提供默认实现。它负责管理侦听器,并为生成 TableModelEvents 以及将其调度到侦听器提供方便。要创建一个具体的 TableModel 作为 AbstractTableModel 的子类,只需提供对以下三个方法的实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

(2)javax.swing.table.DefaultTableModel

这是 TableModel 的一个实现,它使用一个 Vector 来存储单元格的值对象,该 Vector 由多个 Vector 组成。DefaultTableModel 还增加了许多方便操作表格数据的方法,例如 支持 添加 和 删除 行列 等操作。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java swing项目桌面软件还是蛮香的,至少有了我自己的桌面软件|Java 开发实战
最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于windows上制作exe我之前也有介绍
啵啵肠
2023/11/28
4750
JTable常见用法细则+设置某列可编辑+滚动表格
JTable常见用法细则 JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处. 一. 创建表格控件的各种方式: 1)  调用无参构
YGingko
2017/12/28
3.2K0
JTable常见用法细则+设置某列可编辑+滚动表格
java swing 添加 jcheckbox复选框
该文章介绍了如何利用Java和JavaScript实现基于Web的客户端程序,以解决常见的客户端程序问题,例如网络连接、数据交互和页面渲染。主要使用的技术包括Java和JavaScript,以及HTML和CSS。文章还介绍了如何为程序添加图形用户界面和错误处理功能,并使用了一些示例代码。
YGingko
2017/12/28
3.4K0
java swing 添加 jcheckbox复选框
java winform开发之JTable全攻略
列表在任何一门开发语言中都占有非常重要的地位,在.Net中有GridView,在extjs中有GridPanel。。。,而在java Swing中,它的名字叫JTable。这两天在研究JTable的使用,也有一些收获,所以在这里跟大家分享交流一下,下面的内容将包括:1)JTable的基本用法;2)怎样为JTable添加行点击响应事件,双击后打开窗口;3)怎样为JTable的行添加标识,如行id等;4)怎样在JTable中动态添加新行;
风柏杨4711
2021/03/15
1.3K0
高级Swing 组件
如果你想要向用户显示一组选项,而单选按钮或复选框的设置需要占用太多的空间,那么就可以使用组合框或者列表。组合框在Swing组件里已经介绍过了,因为它比较简单。JList组件拥有很多的特性,并且它的设计与树和表格组件的设计非常相似。由于这个原因,因此我们首先要讲一讲各个复杂的Swing组件。
张哥编程
2024/12/17
1350
如何在Java中使用Table
在Java中,表用于将数据排列成列和行。列是表中水平排列的空间,而行是表中垂直排列的空间。列和行之间的交点称为单元格,用于保存单条数据。
灬沙师弟
2023/03/07
2.2K0
如何在Java中使用Table
「旅游信息管理系统」 · Java Swing + MySQL 开发「建议收藏」
码云仓库地址:https://gitee.com/ynavc/tourism_sys
全栈程序员站长
2022/08/11
2.9K0
「旅游信息管理系统」 · Java Swing + MySQL 开发「建议收藏」
java.awt.swing菜单组件
在应用系统开发中,菜单组件是经常使用的组件,菜单组件包括下拉式菜单和弹出式菜单。下拉式菜单包含若干个菜单项,每个菜单项在用户单击时引发一个动作,菜单可以看做一组层次化管理的命令集合。弹出式菜单也称为快捷菜单,它是相当于某个指定组件的,当该组件受到鼠标单击时,会弹出一个菜单,这个菜单就是弹出式菜单。弹出式菜单的结构比较简单,最多只有二级菜单。
张哥编程
2024/12/19
2140
java.awt.swing菜单组件
java swing 实现数据库的增删查改
最近一个实习生问我,swing好难啊,就是jtable的增删查改都做不出来了,我也好久没有做了,各种文档,各种查找,各种百度终于是完成了一个小的项目,也就是所说的增删除查改。不废话了,上代码。
软件小生活
2021/08/16
2.8K0
java swing 实现数据库的增删查改
【面向对象设计模式】 适配器模式 (二)
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19077139
韩曙亮
2023/03/27
3480
【面向对象设计模式】  适配器模式 (二)
eclipse swing开发_学生教务系统登录
本系统实现了学生登录和管理员登录,学生实现选课,查看已选课程,修改密码,查看学生信息功能。管理员实现选课信息的增删改查,学生信息查询,学生密码修改功能。
全栈程序员站长
2022/11/07
2.6K0
eclipse swing开发_学生教务系统登录
【转】基于C#的WinForm中DataGridView控件操作汇总
Console.WriteLine(DataGridView1.CurrentCell.Value);
静谧的小码农
2019/06/16
5.5K0
Java一分钟之-Swing组件:JTable, JTree, JTextArea
Java Swing 提供了丰富的组件库,其中JTable、JTree和JTextArea用于展示数据和用户输入。本文将深入浅出地介绍这些组件,常见问题,易错点以及如何避免,同时提供代码示例。
Jimaks
2024/05/30
2350
1小时学会通过Java Swing Design设计java图形化
一般大一结束的时候需要做一个类似一下内容的javaswing项目,故而咱们的学习目标如下:
红目香薰
2022/11/30
1.3K0
1小时学会通过Java Swing Design设计java图形化
DataGridView使用小结
1).右键点击行时选中行,并弹出操作菜单 1). 添加一个快捷菜单contextMenuStrip1; 2). 给dataGridView1的CellMouseDown事件添加处理程序: private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)         {             if (e.Button == MouseButtons.Right)             {
跟着阿笨一起玩NET
2018/09/18
2.4K0
java小工具,使用Swing展示左树右表结构
java -Dfile.encoding=utf-8 -jar your.jar pause
JQ实验室
2022/02/10
8790
图书管理系统代码 4SearchFrame (…
import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.FileN
明明如月学长
2021/08/27
1.2K0
Java课程设计【学生信息管理系统】[通俗易懂]
如何实现一个功能简单的学生信息管理系统,能够对学生信息(包括照片)进行添加、删除、修改和查询等操作。
全栈程序员站长
2022/11/03
5.7K0
Java课程设计【学生信息管理系统】[通俗易懂]
java 创建一个JDBC表格模型
创建一个JDBC表格模型 创建一个JDBC表格模型 import javax.swing.*; import javax.swing.table.*; import java.sql.*; import java.util.*; /** an immutable table model built from getting metadata about a table in a jdbc database */ public cla
艳艳代码杂货店
2021/10/29
4270
学生管理系统——Swing窗体版本
上一次一个小伙伴私聊我,说:有没有swing版本的学生管理系统让他参考一下。 这次给他安排上啦!  首先来看看有什么文件吧(得要有个适合自己的命名规则很重要,如果自己都看不懂,那么别人就更难懂啦!)  //我根据图片的信息来写文件内容吧! 这是dao方法 package com.zking.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.
用户10196776
2022/11/22
1.7K0
学生管理系统——Swing窗体版本
相关推荐
java swing项目桌面软件还是蛮香的,至少有了我自己的桌面软件|Java 开发实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验