JTable的入门详细介绍
- 格式:docx
- 大小:49.05 KB
- 文档页数:9
java中jtable的用法一、JTable简介JTable是Java Swing包中的一个组件,用于在图形用户界面(GUI)中显示和编辑表格数据。
它可以显示任何类型的数据,包括文本、数字、日期和图像等。
二、创建JTable1. 创建一个空的JTable可以通过以下代码创建一个空的JTable:```JTable table = new JTable();```2. 从二维数组创建JTable可以通过以下代码从二维数组创建一个简单的JTable:String[][] data = {{"John", "Doe"}, {"Jane", "Doe"}};String[] columnNames = {"First Name", "Last Name"};JTable table = new JTable(data, columnNames);```3. 从TableModel创建JTable可以通过实现TableModel接口并使用它来创建一个定制的TableModel,然后将其传递给JTable构造函数来创建一个自定义的JTable。
4. 从数据库中获取数据并创建JTable可以通过使用Java数据库连接(JDBC)API与数据库进行交互,并将结果集转换为TableModel,然后将其传递给JTable构造函数来从数据库中获取数据并创建一个自定义的JTable。
三、设置表格属性1. 设置表头可以使用以下代码设置表头:```String[] columnNames = {"First Name", "Last Name"};table.setColumnIdentifiers(columnNames);```2. 设置表格行高和列宽可以使用以下代码设置表格行高和列宽:```table.setRowHeight(30);table.getColumnModel().getColumn(0).setPreferredWidth(100); ```3. 设置表格背景色和前景色可以使用以下代码设置表格背景色和前景色:```table.setBackground(Color.white);table.setForeground(Color.black);```4. 设置表格字体可以使用以下代码设置表格字体:```Font font = new Font("Arial", Font.PLAIN, 14);table.setFont(font);```5. 设置表格边框可以使用以下代码设置表格边框:```Border border = BorderFactory.createLineBorder(Color.black); table.setBorder(border);```四、渲染器和编辑器1. 渲染器渲染器用于将单元格中的值呈现为用户界面上的文本或图像。
如何使用Table利用JTable 类,可以以表格的形式展示数据,可设置允许用户编辑数据。
JT able 本身不拥有或者缓存数据;它只是数据的视图。
这里有一个放在滚动面板上的典型表格:本文展示如何完成一些常见的表格相关的任务:包括以下部分:(1)创建一个简单的表格(2)向容器添加表格(3)改变每每一栏的宽度(4)用户选择(5)创建表格模型(6)监听数据改变(7)点燃数据改变事件(8)概念:编辑器和渲染器(9)使用自定义渲染器(10)为单元格指定提示工具(11)为列头指定提示工具(12)排序和过滤(13)使用组合框作为编辑器(14)使用其他编辑器(15)使用编辑器验证用户的文本输入(16)打印(17)例子列表(1)创建一个简单的表格SimpleTableDemo.java中的表格在一个字符串数组中声明各个列名Java代码1String[] columnNames = {"First Name",2"Last Name",3"Sport",4"# of Years",5"Vegetarian"};数据初始化并存储在二维数组:Java代码6Object[][] data = {7 {"Kathy", "Smith",8"Snowboarding", new Integer(5), new Boolean(false)},9 {"John", "Doe",10"Rowing", new Integer(3), new Boolean(true)},11 {"Sue", "Black",12"Knitting", new Integer(2), new Boolean(false)},13 {"Jane", "White",14"Speed reading", new Integer(20), new Boolean(true)},15 {"Joe", "Brown",1617"Pool", new Integer(10), new Boolean(false)}18};接着表格使用这些数据和列名构造一个表格:Java代码19JTable table = new JTable(data, columnNames);有两个接收数据的JT able 构造器:∙JTable(Object[][] rowData, Object[] columnNames)∙JTable(Vector rowData, Vector columNames)这些构造函数的好处是容易实现,而缺点是:∙他们自动设置每个单元格为可编辑∙数据类型都视为一样的(字符串类型)。
JTable的使用收藏1.JTable与TableModel (2)1.TableModel与JTable的关系: (2)2.TableModel实践: (3)3.使用JTable+TableModel展示java中的数据对象: (4)2.JTable展示方式的美化: (7)1.设置表格的宽度和高度: (7)2.要显示表头: (8)3.新加列,将列设为下拉框: (8)4.表格排序: (9)3. JTable事件响应和项目设想 (9)4.一个游戏:《java连连看》 (10)1.需求分析: (10)2.编写TableModel和界面实现: (11)3.连连看事件监听: (14)总结和任务: (15)不止乎方法,理关乎理念!1.JTable与TableModel1.TableModel与JTable的关系:前面,我们己学会在界面上加入一个简单的JTable对象:JTable table=new JTable(3,5);这段代码即可创建一个三行五列的表格用以显示在界面上;在具体的应用中,我们肯定是要让JTable显示我们自己定义的数据,比如将上例中的UserInfo对象或UserBlog对象显示到表格中,那就必须定制JTable对象所要使用的javax.swing.table.TableModel对象,在开始前,我们先理解javax.swing.table.TableModel 和JTable之间的关系:模特与衣服之间的关系:JTable对象简单的说,JTable只是一个界面,主要负责显示功能,但JTable对象具体显示多少行多少列,甚示每行每列中显示什么类型的数据,JTable中的单元格是否可编辑,编辑之后怎么办…关于数据提供和数据操作的实现,都是由这个JTable对象的TableModel对象所负责的;反向而言,当JTable对象界面的数据被改动时,JTable会自动调用自己模型中的方法将改动反映到模型中。
java jtable用法Java JTable用法一、概述JTable是Java Swing库中的一个控件,用于在图形用户界面中显示和编辑表格数据。
它提供了丰富的功能和灵活的配置选项,使开发人员能够轻松地创建和管理数据表格。
二、创建JTable对象1.构造函数:可以使用JTable的构造函数来创建一个空的表格:JTable table = new JTable();2.数据模型:可以通过设置数据模型来创建一个包含指定数据的表格:String[][] data = {{"John", "Doe"}, {"Jane", "Smith "}, {"Bob", "Johnson"}};String[] columnNames = {"First Name", "Last Name"}; JTable table = new JTable(data, columnNames);三、设置表格属性1.表头:可以使用setTableHeader()方法来设置表格的表头:JTableHeader header = ();();(new Font("Arial", , 16));(header);2.行高:可以使用setRowHeight()方法来设置表格的行高度:(30);3.列宽:可以使用setColumnWidth(int column, int width)方法来设置指定列的宽度:().getColumn(0).setPreferredWidth(100);四、添加行和列1.添加行:可以使用数据模型的addRow(Object[] rowData)方法来添加一行数据:DefaultTableModel model = (DefaultTableModel) (); (new Object[]{"Tom", "Brown"});2.添加列:可以使用数据模型的addColumn(Object columnName)方法来添加一列数据:("Age");五、单元格编辑1.编辑模式:可以使用setCellEditor()方法来设置一个单元格编辑器:DefaultCellEditor editor = new DefaultCellEditor(ne w JTextField());().getColumn(1).setCellEditor(editor);2.单元格监听:可以使用addCellEditorListener()方法来添加一个单元格编辑器监听器:(new CellEditorListener() {@Overridepublic void editingStopped(ChangeEvent e) {// 编辑完成后的处理}@Overridepublic void editingCanceled(ChangeEvent e) {// 编辑取消后的处理}});六、样式和渲染1.颜色:可以使用自定义的继承自DefaultTableCellRenderer的渲染器来设置单元格的前景色和背景色:class MyRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTabl e table, Object value, boolean isSelected, boolean hasFo cus, int row, int column) {Component component = (table, value, isSelected,hasFocus, row, column);if (row % 2 == 0) {();} else {();}return component;}}// 设置渲染器().getColumn(1).setCellRenderer(new MyRenderer());2.字体:可以使用自定义的渲染器来设置单元格的字体:().getColumn(0).setCellRenderer(new DefaultTableCel lRenderer() {public Component getTableCellRendererComponent(JTabl e table, Object value, boolean isSelected, boolean hasFo cus, int row, int column) {Component component = (table, value, isSelected, hasFocus, row, column);(new Font("Arial", , 14));return component;}});以上是Java JTable的一些常用用法和详细讲解。
swing jxtreetable用法Swing JXTreeTable是基于Java Swing的扩展组件,提供了一个带有树形结构的表格控件。
JXTreeTable具有JTable的所有功能以及额外的树形结构功能,可以同时展示表格和树状结构的数据。
本文将详细介绍JXTreeTable的用法,包括创建和初始化、添加数据、自定义表格和树状结构、以及其他常用操作等。
1. 创建和初始化JXTreeTable首先,创建一个JXTreeTable实例需要导入相应的包和类。
JXTreeTable位于swingx包中,可通过以下代码导入:import org.jdesktop.swingx.JXTreeTable;然后,可以通过构造函数创建JXTreeTable实例:JXTreeTable treeTable = new JXTreeTable();如果需要传递表格数据模型和树状结构数据模型,可以使用以下构造函数:TreeTableModel treeT ableModel = new MyTreeTableModel(root); 自定义树状结构数据模型TableModel tableModel = new DefaultTableModel(data, columnNames); 表格数据模型JXTreeTable treeTable = new JXTreeTable(treeTableModel, tableModel);在创建JXTreeTable实例后,可以通过以下代码设置表格的可见行数和列数:treeTable.setVisibleRowCount(10); 可见行数为10treeTable.setVisibleColumnCount(5); 可见列数为52. 添加数据添加数据到JXTreeTable可以使用默认的TableModel类或者自定义的TableModel类。
如果使用默认的TableModel类,可以使用以下代码添加行数据:DefaultTableModel model = (DefaultTableModel)treeTable.getTableModel();model.addRow(new Object[] { "Data 1", "Data 2", "Data 3" });如果需要添加树状结构的数据,可以使用以下代码:TreeTableModel treeModel = (TreeTableModel)treeTable.getTreeTableModel();treeModel.insertNodeInto(node, parent, index);其中,node是要插入的节点,parent是父节点,index是要插入的位置。
Java中JT able的用法Listing A包含了一个简单示例的代码,这个示例会说明常用JTab le的行为。
用户能够更改J T able的布局、拖放它的栏,或者通过拖动标题的分隔线来改变其大小。
这些列被保存在一个String数组里:String[] columnN ames = {"Product","Numberof Boxes","Price"};数据被初始化并保存在一个二维的对象数组里:Object[][] data ={{"Apples", new Integer(5),"5.00"},{"Oranges", new Integer(3),"6.00"},{"Pears", new Integer(2),"4.00"},{"Grapes", new Integer(3),"2.00"},};JTable是使用data和columnNames构成的:JTabletable = new JTable(data, columnN ames);一、查看JTableJTable的高度和宽度按照下面的方法来设定:table.setPref erredS crolla bleVie wportS ize(new Dimension(300, 80));如果JTable的一个列或者JT able窗口自身的大小被重新确定,那么其他列会被相应的缩小或者放大,以适应新的窗口。
使用setAu toResizeMode()方法就能够控制这种行为:table.setAuto Resize Mode(int mode);mode整数字段可能的值有:AUTO_RE SIZE_O FFAUTO_RE SIZE_N EXT_CO LUMNAUTO_RE SIZE_S UBSEQU ENT_CO LUMNSAUTO_RE SIZE_L AST_CO LUMNAUTO_RE SIZE_A LL_COL UMNS二、表格的缺省值单元格内方格坐标线的缺省颜色是Colo r.gray。
Swing-JTable⽤法-⼊门注:本⽂为学习笔记,原⽂为,本⽂所有素材与代码均源于原⽂,可能会有部分更改。
JTable是Swing中的表格控件,它的外观如下所⽰:没错,excel或者access数据库的编辑区就是JTable这样的控件了。
创建JTableJTable提供了2个构造器可以让你⽤数据和头部直接⽣成它:JTable(Object[][] rowData, Object[] columnNames)JTable(Vector rowData, Vector columnNames)这两个构造器有⼀些特性你必须要注意:1.JTable所有的单元格都是可编辑的;2.它将所有数据都当做string来处理。
本来,JTable可以将布尔型数据⽤⼀个checkBox来进⾏展⽰,就像表1那样,在这⾥就不⾏了。
3.它要求你把所有数据都放到数组或vector中。
如果你的数据来⾃于数据库,那么专门再填充到数组实在是多此⼀举。
呐,如果你不能忍受以上限制,那么就使⽤table Model来管理你的数据吧!创建TableModel如果程序没有显式地指定tableModel,JTable会⾃动⽣成⼀个实例,这样做的副作⽤在上⾯已经说过了。
我们⾃⼰创建tableModel可以让数据得到更好的展⽰,这样做的⽅法是继承。
它已经提供了tableModel接⼝的⼤部分默认实现,在最低限度下,你只需要实现以下三个⽅法:public int getRowCount();public int getColumnCount();public Object getValueAt(int row, int column);当然,如果你的应⽤程序有其他定制化的功能,你可以⾃⼰实现的其它⽅法,⽐如:public Class getColumnClass(int c)//JTable uses this method to determine the default renderer editor for each cellpublic boolean isCellEditable(int row, int col)//Don't need to implement this method unless your table's editablepublic void setValueAt(Object value, int row, int col) //Don't need to implement this method unless your table's data can change.⽰意了如何⾃⼰创建并使⽤tableModel。
java jtable用法(一)Java JTable的用法JTable简介JTable是Java Swing库中的一个组件,用于显示和编辑表格数据。
它可以按照行和列的形式展示数据,并支持用户交互操作。
在本文中,我们将介绍一些JTable的常见用法和技巧。
创建JTable要创建一个JTable,我们首先需要创建一个TableModel。
TableModel是一个数据模型,用于存储和管理表格中的数据。
以下是创建JTable的步骤:1.创建一个二维数组或者一个实现TableModel接口的自定义类。
2.实例化DefaultTableModel类,并传入之前创建的数据数组或者自定义TableModel类的实例。
3.将DefaultTableModel实例传入JTable的构造方法中,创建JTable对象。
// 创建数据数组Object[][] data = {{"John", 25, "USA"},{"Alice", 30, "Canada"},{"Bob", 35, "UK"}};// 创建列名数组String[] columnNames = {"Name", "Age", "Country"};// 创建DefaultTableModelDefaultTableModel model = new DefaultTableModel(data, co lumnNames);// 创建JTableJTable table = new JTable(model);自定义JTable外观JTable提供了许多方法和属性,用于自定义表格的外观。
下面列举了几个常用的用法:设置表格行高使用方法可以设置表格的行高。
默认情况下,行高是根据表格内容的实际高度自动调整的。
Swing中的表格表格的数据模型JTable主要负责的是表格的显示工作,表格的数据由数据模型来进行管理。
下面将介绍有关表格数据模型的相关知识与实际开发,主要包括:TableModel接口,AbstractTableModel类,DefaultTableModel 类等几个方面TableModel接口简介所有的表格模型都必须实现TableModel接口,其属于javax.swing.table包,表26—2列出了该接口中的所有办法AbstractTableModel 类简介若通过实现TableModel接口的方式实现自定义的表格模型需呀实现很多方法,但其中有一些方法可能是不需要的,这样就不是很方便。
为了方便开发,Swing的javax.swing.table包中提供了一个名称为AbstractTableModel的类,实现了TableModel接口中的大部分方法。
只有3个方法没有实现通过继承并重写AbstractTableModel类中的方法来实现自定义的表格模型就比直接实现TableModel接口方便多了,下面列出了没有实现的3个方法Public abstract int getRowCount()Public abstract int getColumnCount()Public abstract Object getValueAt(int rowIndex,int ColumnIndex)提示: 若通过继承AbstractTableModel 类的方法开发自定义的表格模型,则至少需要实现上述的3个方法,当然,其他方法如果有需要也可以进行重写同时,AbstractTableModel类中还提供了很多可以方便地对模型进行操作的方法,表26—4列出了其中一些常用的方法。
DefaultTableModel类简介通过上述的介绍,已经大致了解了如何实现自定义的表格模型。
但在大部分情况下需求都是比较通用的,没有必要都去实现自定义的表格模型。
java table用法Java Table 是 Swing 库中的一种高级容器,它允许用户以表格形式展示数据,并提供了各种方法和事件来操作和处理表格数据。
在本文中,我们将介绍 Java Table 的基本用法及其常用的一些特性和功能。
一、创建 Java Table创建 Java Table 很简单,只需要按照以下步骤即可:1.导入 Swing 组件包:```javaimport javax.swing.*;```2.创建一个二维数组来存储要展示的数据:```javaObject[][] data = {{"001", "John", "Doe", "23", "Male", "Student"},{"002", "Mary", "Smith", "28", "Female", "Teacher"},{"003", "Bob", "Johnson", "45", "Male", "Engineer"},{"004", "Sara", "Wilson", "32", "Female", "Doctor"}};```3.设置表格的列名:```javaString[] columnNames = {"ID", "First Name", "Last Name", "Age", "Gender", "Occupation"};```4.创建一个 JTable 对象并将数据和列名作为参数传入:```javaJTable table = new JTable(data, columnNames);```5.将表格添加到窗口中:二、设置表格样式```javatable.setBackground(Color.YELLOW);```2.设置表格内容的字体和大小:```javatable.setRowHeight(30);table.getColumnModel().getColumn(0).setPreferredWidth(50);table.getColumnModel().getColumn(1).setPreferredWidth(100);table.getColumnModel().getColumn(2).setPreferredWidth(100);table.getColumnModel().getColumn(3).setPreferredWidth(50);table.getColumnModel().getColumn(4).setPreferredWidth(50);table.getColumnModel().getColumn(5).setPreferredWidth(150);```4.设置表格单元格的对齐方式:```javaDefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); centerRenderer.setHorizontalAlignment(JLabel.CENTER);table.setDefaultRenderer(Object.class, centerRenderer);```三、对表格进行操作1.获取表格中的某个单元格:3.获取选中的行数和列数:5.排序表格数据:四、表格事件监听1.监听单击表格头部的事件:```javatable.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {int row = table.rowAtPoint(e.getPoint());int col = table.columnAtPoint(e.getPoint());Object value = table.getValueAt(row, col);System.out.println("Clicked on row " + row + ", column " + col + ", value is \"" + value + "\".");}});```总结在 Java 中使用 Table 来展示数据是一种非常方便和灵活的方式,通过 Java Table 可以轻松地对数据进行操作和处理。
关于JTable用法的整理Swing颇受欢迎的JTable类为显示大块数据提供了一种简单的机制。
用户能够更改JTable的布局、拖放它的栏,或者通过拖动标题的分隔线来改变其大小。
这些列被保存在一个String数组里:String[] columnNames = {"Product","Number of Boxes","Price"};数据被初始化并保存在一个二维的对象数组里:Object[][] data ={{"Apples", new Integer(5),"5.00"},{"Oranges", new Integer(3),"6.00"},{"Pears", new Integer(2),"4.00"},{"Grapes", new Integer(3),"2.00"},};JTable是使用data和columnNames构成的:JTable table = new JTable(data, columnNames);查看JTableJTable的高度和宽度按照下面的方法来设定:table.setPreferredScrollableViewportSize(new Dimension(300, 80));如果JTable的一个列或者JTable窗口自身的大小被重新确定,那么其他列会被相应的缩小或者放大,以适应新的窗口。
使用setAutoResizeMode()方法就能够控制这种行为:table.setAutoResizeMode(int mode);mode整数字段可能的值有:AUTO_RESIZE_OFFAUTO_RESIZE_NEXT_COLUMNAUTO_RESIZE_SUBSEQUENT_COLUMNSAUTO_RESIZE_LAST_COLUMNAUTO_RESIZE_ALL_COLUMNS表格的缺省值单元格内方格坐标线的缺省颜色是Color.gray。
在 Java 中,通常使用 JTable 类来创建和操作表格(Table)。
JTable 是 Swing 组件库中的一部分,它允许你在界面中展示和编辑表格数据。
以下是 JTable 的基本用法:1. 创建 JTable 对象:你可以通过创建 JTable 对象来表示一个表格。
通常,你需要提供表格的数据模型(TableModel)来指定表格中的数据内容。
2. 设置数据模型:数据模型负责存储和管理表格中的数据。
你可以使用默认的数据模型 DefaultTableModel,也可以自定义实现 TableModel 接口的数据模型。
3. 显示表格:将 JTable 放置在界面中的某个容器中,并确保它能够被用户看到。
4. 自定义表格外观和行为:你可以对 JTable 进行各种自定义,包括调整列宽、行高,设置表头,添加排序和过滤功能等。
下面是一个简单的示例代码,演示了如何在 Java 中创建一个基本的 JTable:```javaimport javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.table.DefaultTableModel;public class Main {public static void main(String[] args) {JFrame frame = new JFrame("JTable Example");// 表格数据Object[][] data = {{"John", 25, "Male"},{"Amy", 30, "Female"},{"Bob", 20, "Male"}};// 表头String[] columns = {"Name", "Age", "Gender"};// 创建数据模型DefaultTableModel model = new DefaultTableModel(data, columns);// 创建表格JTable table = new JTable(model);// 将表格放入滚动窗格中,并添加到界面中JScrollPane scrollPane = new JScrollPane(table);frame.add(scrollPane);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.pack();frame.setVisible(true);}}```上述示例中,我们创建了一个简单的 JTable,并将其放置在一个 JFrame 中。
三、表格控件表格控件使用类JTable。
功能:它提供以行和列的方式来显示数据,并且可以拖动列构造函数:JTable(Object[][] rowData, Object[] columnNames)编程方法:创建出JTable对象(可以采用表格中的表头数组和数据数组创建出表格、利用实现TableModel接口的类对象)再创建出一个JScrollPane对象并指示其ScrollBar的使用策略;将表格控件加入JScrollPane中;最后将JScrollPane对象加人到顶级容器的ContentPane中。
下面是一个功能比较强的例子,仔细研究它,当可以知道各个属性的用法。
样例:import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.table.*;import java.util.*;import javax.swing.border.*;public class TableDemo extends JFrame {JPanel contentPane = new JPanel();JScrollPane TableScrollPane = new JScrollPane(); Vector tableData=new Vector();Vector tableHeader=new Vector();JPanel customTablePane = new JPanel();JScrollPane TableScrollPane2 = new JScrollPane(); BorderLayout borderLayout1 = new BorderLayout();public TableDemo() {try {jbInit();}catch(Exception e) {}}public static void main(String[] args) {TableDemo frame = new TableDemo();frame.setVisible(true);}//当窗口关闭时的处理代码protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0);}}private void jbInit() throws Exception {//设置窗口的标题,大小,布局setTitle("列表实例演示");setSize(new Dimension(565, 366));contentPane=(JPanel)this.getContentPane();contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.Y_AXIS));Object[][] data = {{"小李","男","滑雪", new Integer(20), "英文",new Boolean(true)},{"小青","女","保龄球", new Integer(17), "绘画",new Boolean(true)},{"小吴","男","跑步", new Integer(23), "管理",new Boolean(true)},{"小和","女","演讲", new Integer(25), "会计",new Boolean(false)},{"小许","女","游泳", new Integer(15), "数字",new Boolean(false)}};String[] columnNames = {"姓名","性别","爱好","年龄","专业","是否被录取"}; //创建一个简单的表格final JTable table = new JTable(data, columnNames);//使选择框成为一个单元格table.setColumnSelectionAllowed(true);//将表格的列排列自动功能设置为OFF,这样便可以使用代码定义列的长度table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);table.setRowHeight(20); //设置表格的行高度//设置列表的列长度TableColumn column = null;for (int i = 0; i < 5; i++) {//取得列表的列对象column = table.getColumnModel().getColumn(i);if (i == 1) {column.setPreferredWidth(30); //sport column is bigger } else {column.setPreferredWidth(50);}}//取得表格的行ListSelectionModel rowSM = table.getSelectionModel();//加入行选择接收器rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) {//当多种事件被激发的时候,不执行行接收器后面的代码if (e.getValueIsAdjusting()) return;//取得行对象ListSelectionModel lsm = (ListSelectionModel)e.getSource(); int selectedRow = lsm.getMinSelectionIndex();System.out.println("行" + selectedRow);}});//取得表格的列ListSelectionModel colSM =table.getColumnModel().getSelectionModel();//加入列选择接收器colSM.addListSelectionListener(new ListSelectionListener() {public void valueChanged(ListSelectionEvent e) {//当多种事件被激发的时候,不执行列接收器后面的代码if (e.getValueIsAdjusting()) return;//取得列对象ListSelectionModel lsm = (ListSelectionModel)e.getSource(); int selectedCol = lsm.getMinSelectionIndex();System.out.println("列" + selectedCol);}});//创建带有模式类的列表框,并加入数据改变接收器MyTableModel myModel = new MyTableModel();final JTable table1 = new JTable(myModel);table1.setColumnSelectionAllowed(true);table1.setRowHeight(30);//当表格的内容改变的时候取得表格的内容final TableModel model = table1.getModel();model.addTableModelListener(new TableModelListener(){public void tableChanged(TableModelEvent e) {int row = e.getFirstRow();int column = e.getColumn();//取得列表框的数据Object data = model.getValueAt(row, column);try{System.out.println(data);table1.requestFocus();}catch(Exception e1){}}});//为数据表中"爱好"一列加入下拉列表框TableColumn sportColumn = table1.getColumnModel().getColumn(4); JComboBox comboBox = new JComboBox(new String[] {"滑雪","保龄球","保龄球","跑步","游泳"}); sportColumn.setCellEditor(new DefaultCellEditor(comboBox));//为数据表的数字列加入数字检证框final JTextField integerField = new JTextField();integerField.setHorizontalAlignment(JTextField.RIGHT);DefaultCellEditor integerEditor =new DefaultCellEditor(integerField) {//重载返回值的方法,当输入文字的时候,将文字转变为0public Object getCellEditorValue() {try {return new Double(integerField.getText());}catch(Exception e){return new Double(0);}}};table1.setDefaultEditor(Integer.class, integerEditor);//设置颜色接收器setUpColorEditor(table1);//设置颜色渲染器table1.setDefaultRenderer(Color.class,new ColorRenderer(true));//设置容器的布局及加入各种控件customTablePane.setLayout(borderLayout1);TableScrollPane.getViewport().add(table);TableScrollPane2.getViewport().add(table1);contentPane.add(TableScrollPane);contentPane.add(customTablePane, null);customTablePane.add(TableScrollPane2, BorderLayout.CENTER); }//设置颜色编辑框的方法private void setUpColorEditor(JTable table) {//创建按钮,用于激活颜色选择框final JButton button = new JButton("") {public void setText(String s) {//重新定义SetText方法,使按钮不会显示文字}};//设置按钮的背景颜色,不绘画按钮的边框,并将按钮的边框设为0 button.setBackground(Color.white);button.setBorderPainted(false);button.setMargin(new Insets(0,0,0,0));//创建颜色编辑框,并将该编辑框赋给表格final ColorEditor colorEditor = new ColorEditor(button); table.setDefaultEditor(Color.class, colorEditor);//创建颜色选择框final JColorChooser colorChooser = new JColorChooser(); ActionListener okListener = new ActionListener() {public void actionPerformed(ActionEvent e) {//将颜色选择框的颜色赋给颜色编辑框colorEditor.currentColor = colorChooser.getColor(); }};//创建颜色选择框final JDialog dialog = JColorChooser.createDialog(button, "请选择喜欢的颜色",true ,colorChooser,okListener,null );button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {//设置按钮的背景颜色button.setBackground(colorEditor.currentColor);//将颜色选择器的颜色设为原先的显示颜色colorChooser.setColor(colorEditor.currentColor);//在按钮的旁边显示颜色选择框,省略该命令,颜色选择框会显示在Window //窗口的中央dialog.setLocationRelativeTo(button);dialog.show();}});}}//表格模式类class MyTableModel extends AbstractTableModel {final Object[][] data = {{"小李",new Color(56,78,82),new ImageIcon("face1.gif"),"男","滑雪", new Integer(20), "英文",new Boolean(true)},{"小青",new Color(56,78,82),new ImageIcon("face2.gif"),"女","保龄球", new Integer(17), "绘画",new Boolean(true)},{"小吴",new Color(56,78,82),new ImageIcon("face3.gif"),"男","保龄球", new Integer(23), "管理",new Boolean(true)},{"小和",new Color(56,78,82),new ImageIcon("face4.gif"),"女","跑步", new Integer(25), "会计",new Boolean(false)},{"小许",new Color(56,78,82),new ImageIcon("face5.gif"),"女","游泳", new Integer(15), "数字",new Boolean(false)}};final String[] columnNames = {"姓名","喜欢的颜色","图片","性别","爱好","年龄","专业","是否被录取"};//下面三个方法是一定要加入AbstractTableModel类//分别是设置列数,行数与列表的数据public int getColumnCount() {return columnNames.length;}public int getRowCount() {return data.length;}public Object getValueAt(int row, int col) {return data[row][col];}//该方法不一定要加入AbstractTableModel类,该方法设置列表的标题public String getColumnName(int col) {return columnNames[col];}//通过getClass()方法设置默认的控件,如true与false的默认控件是复选框, //该方法不一定要加入AbstractTableModel类public Class getColumnClass(int c) {return getValueAt(0, c).getClass();}//定义可以编辑的单元,true表示可编辑,false表示不可编辑public boolean isCellEditable(int row, int col) {return true;}//将改变后的值保存在表格中public void setValueAt(Object value, int row, int col) { data[row][col] = value;fireTableCellUpdated(row, col);}}//颜色渲染框的代码class ColorRenderer extends JLabelimplements TableCellRenderer {Border unselectedBorder = null;Border selectedBorder = null;boolean isBordered = true;public ColorRenderer(boolean isBordered) {super();this.isBordered = isBordered;setOpaque(true);}//每当颜色改变时,该方法被激活public Component getTableCellRendererComponent(JTable table, Object color,boolean isSelected, boolean hasFocus,int row, int column) {setBackground((Color)color);if (isBordered) {if (isSelected) {if (selectedBorder == null) {selectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getSelectionBackground()); }setBorder(selectedBorder);} else {if (unselectedBorder == null) {unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getBackground());}setBorder(unselectedBorder);}}return this;}}//颜色编辑框的代码class ColorEditor extends DefaultCellEditor {Color currentColor = null;public ColorEditor(JButton b) {//由于数据表的编辑器只能是复选框,编辑框与标签,所以首先将数据表的编辑器设为 //复选框super(new JCheckBox());//利用DefaultCellEditor类的editorComponent属性将编辑器设为按钮editorComponent = b;setClickCountToStart(1); //单击按钮时动作事件激活//让编辑器停止事件的处理,让按钮处理动作事件b.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {fireEditingStopped();}});}protected void fireEditingStopped() {super.fireEditingStopped();}public Object getCellEditorValue() {return currentColor;}//当颜色改变时,该方法被激活public Component getTableCellEditorComponent(JTable table,Object value,boolean isSelected, int row,int column) {currentColor = (Color)value;return editorComponent;}}。
1.1 TableModel和读取数据库TableModel定义了存入和管理数据的方法,它还能为每一列定义数据名,并且可以设置单元格是否可编辑。
它以一个二维数组的形式存入数据。
下面有我关于如何读取数据库资料到TableModel的一个例子:public class TbModel extends AbstractTableModel{private static final long serialVersionUID = 1L;private Vector data;private Vector titles;Connection connect;Statement state;ResultSet rs;public myTableModel(){data=new Vector();try{Class.forName("com.mysql.jdbc.Driver");connect=DriverManager.getConnection("jdbc:mysql://localhost/javaproject","root","dddddd");state=connect.createStatement();rs=state.executeQuery("select * from product");while(rs.next()){data.add(rs.getString(1));data.add(rs.getString(2));data.add(rs.getString(3));data.add(rs.getString(4));data.add(rs.getString(5));}}catch(ClassNotFoundException e){System.out.println("JDBC driver not loaded:\n"+e);}catch(SQLException e){System.out.println("Connection failed:\n"+e);}}titles = new Vector();titles.add("CATEGORY");titles.add("NAME");titles.add("PRICES");titles.add("QUANTITY");titles.add("ADDRESS");public int getRowCount(){return data.size()/getColumnCount();}public int getColumnCount(){return titles.size();}public Object getValueAt(int rowIndex, int columnIndex){return data.get((rowIndex*getColumnCount())+columnIndex); }public String getColumnName(int columnIndex) {String colName = new String();if (columnIndex<=getColumnCount())colName=(String)titles.get(columnIndex);return colName;}}当从AbstractTableModel继承一个类时,getRowCount(),getColumnCount(),和getValueAt(int rowIndex,int columnIndex)等方法将自动建立(用Eclipse),记住上面所提的第三个方法,我们一会会用到。
JTable的入门详细介绍8-1:使用JTable组件:类层次结构图:ng.Objectponent--java.awt.Container--javax.swing.JComponent--javax.swing.JTabel在使用JTable以前,我们先看一下它的构造函数有哪些,以及应该如何使用:JTabel构造函数:JTable():建立一个新的JTables,并使用系统默认的Model.JTable(int numRows,int numColumns):建立一个具有numRows行,numColumns列的空表格,使用的是DefaultTableModel.JTable(Object[][] rowData,Object[][] columnNames):建立一个显示二维数组数据的表格,且可以显示列的名称。
JTable(TableModel dm):建立一个JTable,有默认的字段模式以及选择模式,并设置数据模式。
JTable(TableModel dm,TableColumnModel cm):建立一个JTable,设置数据模式与字段模式,并有默认的选择模式。
JTable(TableModel dm,TableColumnModel cm,ListSelectionModel sm):建立一个JTable,设置数据模式、字段模式、与选择模式。
JTable(Vector rowData,Vector columnNames):建立一个以Vector为输入来源的数据表格,可显示行的名称。
我们先以Array构造方式,说明如何利用JTable来建立一个简单的表格:import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;public class SimpleTable{public SimpleTable(){JFrame f=new JFrame();Object[][] playerInfo={{"阿呆",new Integer(66),new Integer(32),new Integer(98),new Boolean(false)},{"阿呆",new Integer(82),new Integer(69),new Integer(128),new Boolean(true)},};String[] Names={"姓名","语文","数学","总分","及格"};JTable table=new JTable(playerInfo,Names);table.setPreferredScrollableViewportSize(new Dimension(550,30));JScrollPane scrollPane=new JScrollPane(table);f.getContentPane().add(scrollPane,BorderLayout.CENTER);f.setTitle("Simple Table");f.pack();f.show();f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});}public static void main(String[] args){SimpleTable b=new SimpleTable();}}表格由两部份组成:分别是行标题(Column Header)与行对象(Column Object).利用JTable所提供的getTableHeader()方法取得行标题。
在这个例子中,我们将JTable放在JScrollPane中,这种做法可以将Column Header与Colmn Object完整的显示出来,因为JScrollPane会自动取得Column Header.但如果文坛读者将上面第15行去掉并修改第16行:f.getContentPane().add(table,BorderLayout.CENTER); 则运行结果你会发现Column Header 不见了。
如果你不想用JScrollPane,要解决这个问题,你必须将程序修改如下:JTable table=new JTable(p,n);table.setPreferredScrollableViewportSize(new Dimension(550,30));f.getContentPane().add(table.getTableHeader(),BorderLayout.NORTH);f.getContentPane().add(table,BorderLayout.CENTER);运行结果就会跟之前一样有行标题了.上面的运行结果就会跟发现,每个字段的宽度都是一样的,除非你自行拉曳某个列宽。
若我们想一开始就设置列宽的值,可以利用TableColumn类所提供的setPreferredWidth()方法来设置,并可利用JTable类所提供的setAutoResizeMode()方法来设置调整某个列宽时其他列宽的变化情况,我们看下面这个例子:import javax.swing.*;import javax.swing.table.*;import java.awt.*;import java.awt.event.*;import java.util.*;public class SimpleTable2{public SimpleTable2(){JFrame f=new JFrame();Object[][] p={{"阿呆",new Integer(66),new Integer(32),new Integer(98),new Boolean(false),new Boolean(false)}, {"阿呆",new Integer(82),new Integer(69),new Integer(128),new Boolean(true),new Boolean(fals e)},};String[] n={"姓名","语文","数学","总分","及格","作弊"};TableColumn column=null;JTable table=new JTable(p,n);table.setPreferredScrollableViewportSize(new Dimension(550,30));table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);//利用JTable中的getColumnModel()方法取得TableColumnModel对象;再利用TableColumnMo del界面所定义的getColumn()方法取TableColumn对象,利用此对象的setPreferredWidth()方法就可以控制字段的宽度.for (int i=0;i<6;i++){column=table.getColumnModel().getColumn(i);if ((i%2)==0) column.setPreferredWidth(150);else column.setPreferredWidth(50);}JScrollPane scrollPane=new JScrollPane(table);f.getContentPane().add(scrollPane,BorderLayout.CENTER);f.setTitle("Simple Table");f.pack();f.show();f.setVisible(true);f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});}public static void main(String[] args){new SimpleTable2();}}列可调整的5个参数:AUTO_RESIZE_SUBSEQUENT_COLUMENS:当调整某一列宽时,此字段之后的所有字段列宽都会跟着一起变动。
此为系统默认值。
AUTO_RESIZE_ALL_COLUMNS:当调整某一列宽时,此表格上所有字段的列宽都会跟着一起变动。
AUTO_RESIZE_OFF:当调整某一列宽时,此表格上所有字段列宽都不会跟着改变。
AUTO_RESIZE_NEXT_COLUMN:当调整某一列宽时,此字段的下一个字段的列宽会跟着改变,其余均不会变。
AUTO_RESIZE_LAST_COLUMN:当调整某一列宽时,最后一个字段的列宽会跟着改变,其余均不会改变。
由以上范例可知,利用Swing来构造一个表格其实很简单的,只要你利用Vector或Array来作为我们表格的数据输入,将Vector或Array 的内容填入JTable中,一个基本的表格就产生了。
不过,虽然利用JTable(Object[][] rowData,Object[][] columnNames)以及JTable(Vector rowD ata,Vector columnNames)构造函数来构造构造JTable很方便,但却有些缺点。
例如上例中,我们表格中的每个字段(cell)一开始都是默认为可修改的,用户因此可能修改到我们的数据;其次,表格中每个单元(cell)中的数据类型将会被视为同一种。
在我们的例子中,数据类型皆被显示为S tring的类型,因此,原来的数据类型声明为Boolean的数据会以String的形式出现而不是以检查框(Check Box)出现。
除此之外,如果我们所要显示的数据是不固定的,或是随情况而变,例如同样是一份成绩单,老师与学生所看到的表格就不会一样,显示的外观或操作模式也许也不相同。
为了因应这些种种复杂情况,上面简单的构造方式已不宜使用,Swing提供各种Model(如:TableModel、TableColumnModel与ListSelectionModel)来解决上述的不便,以增加我们设计表格的弹性。