首页 > 编程语言 >Java Swing组件:表格

Java Swing组件:表格

时间:2024-03-29 15:58:45浏览次数:27  
标签:创建表格 Java 表格 int JTable Swing 组件 new 数据模型

       表格(JTable)是将数据以二维的形式展示给用户,它包括行和列,每一行表示一个对象,例如一个学生,每一列表示对象的一种属性,例如学生的学号、姓名等。表格组件是采用MVC(Model View Controller)模式进行设计,按照MVC的设计理念,JTable类属于视图,对应的数据模型是TableModel接口的实现类,用户可以根据自己的业务逻辑和数据结构来实现TableModel接口。在Swing中,抽象类AbstractTableModel是TableModel接口的一个实现类,它提供了TableModel接口的默认实现。在实际应用中,一般使用默认的数据模型DefaultTableModel来存储和管理表格的数据,该类是AbstractTableModel类的子类,它提供了常见的表格操作,例如,添加、修改、删除表格的数据等。由于表格的结构和功能比较复杂,因此,Swing中使用TableColumnModel接口的实现类来管理表格的列模型,使用ListSelectionModel接口的实现类来管理表格的选择模型。用户可以根据自己的需求来实现TableColumnModel和ListSelectionModel接口,也可以使用默认的列模型DefaultTableColumnModel(该类是TableColumnModel接口的实现类)和默认的选择模型DefaultListSelectionModel(该类是ListSelectionModel接口的实现类)来管理表格中列以及行和列的选择。

       JTable类的常用构造方法如下:

  • JTable():使用默认的数据模型、默认的列模型和默认的选择模型创建表格。
  • JTable(int numRows, int numColumns):使用DefaultTableModel创建具有指定行数和列数的表格。
  • JTable(Object[][] numRows, int numColumns):通过指定的二维组数和列名创建表格。
  • JTable(TableModel dm):通过指定的数据模型、默认的列模型和默认的选择模型创建表格。
  • JTable(TableModel dm, TableColumnModel cm):通过指定的数据模型、指定的列模型和默认的选择模型创建表格。
  • JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm):通过指定的数据模型、指定的列模型和指定的选择模型来创建表格。

       JTable类提供的方法非常多,限于篇幅,在这里只介绍几个常用的方法:

  • int getSelectedRow():返回第一个被选定行的索引,如果未选择任何行,则返回-1。
  • int[] getSelectedRows():返回所有选定行的索引。
  • int getSelectedRowCount():返回所选定行的数量。
  • Object getValueAt(int row,int column):返回指定单元格的值。

       创建表格一般先使用DefaultTableModel类的构造方法创建表格的数据模型,然后使用JTable类的构造方法创建表格并与数据模型进行关联。DefaultTableModel类的主要构造方法如下:

  • DefaultTableModel(Object[][] data, Object[] columnNames):通过指定二维组数和列名创建表格的数据模型。
  • void addRow(Object[] rowData):在数据模型的末尾添加一行。
  • void insertRow(int row, Object[] rowData):在数据模型中插入一行。
  • void setValueAt(Object aValue, int row, int column):设置单元格的对象值。
  • void removeRow(int row):从数据模型中删除一行。

       为了使表格能够对数据进行排序,必须将RowSorter类和JTable进行关联。RowSorter是一个抽象类,它负责将JTable中的数据映射成可排序的数据。在实际应用中,一般使用RowSorter的子类TableRowSorter与JTable进行关联。

【例1】下面程序使用指定的数据模型创建一个具有排序功能的表格,并对表格中的数据进行增加、修改和删除操作,其中,增加和修改功能是通过一个对话框来完成的。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTableDemo extends JFrame{
	Object[][] data= {};//表格的数据
    String columnNames[]= {"课程代码","课程名称","学分","学时"};//表格的列
    DefaultTableModel tableModel;//表格的数据模型
    JTable table; //表格
    JButton addButton=new JButton("增加");
	JButton editButton=new JButton("修改");
	JButton deleteButton=new JButton("删除");
	public JTableDemo() {
		JFrame frame=this;
		setTitle("表格示例");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setSize(400,300);
		Container contentPane=this.getContentPane();
		tableModel=new DefaultTableModel(data,columnNames);//创建数据模型
		table=new JTable(tableModel);//创建表格,关联数据模型
		RowSorter sorter=new TableRowSorter(tableModel);//创建表格行排序
		table.setRowSorter(sorter);//设置表格行排序
		JPanel panel=new JPanel();
		panel.add(addButton);
		panel.add(editButton);
		panel.add(deleteButton);
		contentPane.add(new JLabel("课程信息"),BorderLayout.NORTH);
		contentPane.add(new JScrollPane(table),BorderLayout.CENTER);
		contentPane.add(panel,BorderLayout.SOUTH);
		//增加按钮注册事件监听器
		addButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new AddDialog(frame,tableModel,-1);
			}
		});
		//修改按钮注册事件监听器
		editButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int row=table.getSelectedRow();//获取被选中的行号
				if(row!=-1) {
					new AddDialog(frame,tableModel,row);
				}
			}
		});
		//删除按钮注册事件监听器
		deleteButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int[] rows=table.getSelectedRows();//获取所有被选中的行号
				if(rows.length>0) {
					for(int i=0;i<rows.length;i++) {
						tableModel.removeRow(rows[i]);//删除选中的行	
					}
				}
			}
		});
		setVisible(true);
	}
	public static void main(String[] args) {
		JTableDemo frame=new JTableDemo();
	}
}
//对话框
class AddDialog extends JDialog{
	JTextField codeField=new JTextField(10);
	JTextField nameField=new JTextField(10);
	JTextField scoreField=new JTextField(10);
	JTextField hoursField=new JTextField(10);
	JButton clearButton=new JButton("清空");
	JButton saveButton=new JButton("保存");	
	public AddDialog(JFrame owner,DefaultTableModel model,int row) {
		super(owner,true);
		if(row==-1) {
			setTitle("增加课程");
		}else {
			setTitle("修改课程");
			codeField.setText((String)model.getValueAt(row,0));
			nameField.setText((String)model.getValueAt(row,1));
			scoreField.setText((String)model.getValueAt(row,2));
			hoursField.setText((String)model.getValueAt(row,3));
		}
		setSize(400,150);
		setLocationRelativeTo(null);//居中显示
		setResizable(false);//禁用最大化
		JPanel panel1=new JPanel();
		panel1.setLayout(new GridLayout(2,2));
		JPanel panel11=new JPanel();
		JPanel panel12=new JPanel();
		JPanel panel13=new JPanel();
		JPanel panel14=new JPanel();
		panel11.add(new JLabel("课程代码:"));
		panel11.add(codeField);
		panel12.add(new JLabel("课程名称:"));
		panel12.add(nameField);
		panel13.add(new JLabel("课程学分:"));
		panel13.add(scoreField);
		panel14.add(new JLabel("课程学时:"));
		panel14.add(hoursField);
		panel1.add(panel11);panel1.add(panel12);
		panel1.add(panel13);panel1.add(panel14);
		JPanel panel2=new JPanel();
		panel2.add(clearButton);
		panel2.add(saveButton);
		this.add(panel1,BorderLayout.CENTER);
		this.add(panel2,BorderLayout.SOUTH);
		//保存按钮注册事件监听器
		saveButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(!codeField.getText().equals("")&&
				   !nameField.getText().equals("")&&
				   !scoreField.getText().equals("")&&
				   !hoursField.getText().equals("")) {
					Object rowData[]= {codeField.getText(),
							           nameField.getText(),
							           scoreField.getText(),
							           hoursField.getText()};	
					if(row==-1) {//增加课程
						model.addRow(rowData);
					}else {//修改课程信息
						model.setValueAt(codeField.getText(), row, 0);
						model.setValueAt(nameField.getText(), row, 1);
						model.setValueAt(scoreField.getText(), row, 2);
						model.setValueAt(hoursField.getText(), row, 3);
					}
				}
			}
		});
		//清空按钮注册事件监听器
		clearButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				codeField.setText("");
				nameField.setText("");
				scoreField.setText("");
				hoursField.setText("");
			}
		});
		this.setVisible(true);
	}
}

       运行上述程序,显示结果如图1(a)所示,点击增加按钮弹出如图1(b)所示的对话框,录入课程信息后点击保存按钮,则该课程信息保存到表格中,可以在该对话框中录入多门课程,如图1(c)所示。选择表格中的某一行点击修改按钮后,弹出如图1(d)所示的对话框,在该对话框中可以修改课程信息,点击保存按钮按钮后,会更新表格中该课程的信息。选择表格中的一行或多行课程,点击删除按钮后会从表格中删除这些课程。

(a)

(c)

(b)

(d)

图1. 表格使用示例

标签:创建表格,Java,表格,int,JTable,Swing,组件,new,数据模型
From: https://blog.csdn.net/hitmengfanchao/article/details/137148148

相关文章

  • Vue组件封装:基于Vue3+wangeditor富文本组件二次封装
    1.简介    开源Web富文本编辑器,开箱即用,配置简单。一个产品的价值,就在于解决用户的问题,提高效率、降低成本、增加稳定性和扩展性。wangEditor不是为了做而做,也不是单纯的模仿谁,而是经过上述问题分析之后,给出一个系统的解决方案。旨在真正去解决用户的问题,产出自己的价......
  • Storybook version8 智能化构建组件文档与单元测试
    根据官方文档说法,storybook是一个独立构建前端UI组件与页面的车间。StorybookisafrontendworkshopforbuildingUIcomponentsandpagesinisolation.Ithelpsyoudevelopandsharehard-to-reachstatesandedgecaseswithoutneedingtorunyourwholeapp.Th......
  • Java企业电子招投标系统源代码,支持二次开发,采用Spring cloud框架
    在数字化采购领域,企业需要一个高效、透明和规范的管理系统。通过采用SpringCloud、SpringBoot2、Mybatis等先进技术,我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力,通过待办消息、招标公告、中标公告和信息发布等功能模块,实现了对供应商的集中管理和风险控制......
  • JAVA版鸿鹄云商B2B2C:解析多商家入驻直播带货商城系统的实现与应用
     一、技术选型java开发语言:java是一种跨平台的编程语言,适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。springboot框架:springboot是一个快速构建spring应用的框架,简化了开发过程,减少了配置文件,提供了强大的自动化配置功能。使用springb......
  • 如何在Java中读取超过内存大小的文件
    读取文件内容,然后进行处理,在Java中我们通常利用Files类中的方法,将可以文件内容加载到内存,并流顺利地进行处理。但是,在一些场景下,我们需要处理的文件可能比我们机器所拥有的内存要大。此时,我们则需要采用另一种策略:部分读取它,并具有其他结构来仅编译所需的数据。接下来,我们就来......
  • 【附源码】JAVA计算机毕业设计在线考研刷题系统(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,计算机在教育领域的应用日益广泛。特别是在线教育平台,以其便捷性、灵活性和资源共享性受到了广大师生的青睐。近年来,考研热潮......
  • 【附源码】JAVA计算机毕业设计在线考试系统的设计与实现(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展和互联网的普及,传统的教育模式正面临着深刻的变革。在线考试系统作为教育信息化进程中的重要一环,正逐渐取代传统的纸质考试方......
  • JAVA学习-网络编程.使用代理服务器
           代理服务器在网络编程中扮演着重要的角色,它可以作为中间层来处理网络请求和响应,提供更高级的功能。Java网络编程提供了多种方式来使用代理服务器,包括使用'Proxy'类和使用'ProxySelector'类。下面是关于使用代理服务器的概述以及与其他比较和高级应用的说明:1.......
  • 【附源码】JAVA计算机毕业设计在线考试答题系统(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展,教育信息化已成为现代教育发展的重要趋势。在线考试答题系统作为教育信息化的重要组成部分,能够打破传统考试的时间和空间限......
  • 【附源码】JAVA计算机毕业设计在线考试(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,传统的教育模式正在经历深刻的变革。在线教育以其灵活、便捷的特性受到了广大师生的青睐。在线考试作为在线教育的重要组成......