最近在写一些表格程序,但由于对Jtable不熟悉,写起来很费劲,于是就顺便把JTable的APi
看了一下,写了几个测试程序,与大家共同分享,希望可以帮助那些对Jtable不熟悉的同学有所帮助
首先来看一看类层次结构图:
Java.lang.Object
--Java.awt.Component
--Java.awt.Container
--Javax.swing.JComponent
--Javax.swing.JTabel
从类的层次结构可以看出,jtable的直接父类是JComponent,因此jtable也就具备JComponent的属性和方法(私有的除外)
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为输入来源的数据表格,可显示行的名称。
JTable与TableModel
我们经常看到TableModel,AbstractTableModel,DefaultTableModel ,那么JTable已经有了自己的构造函数,为什么还要有这些TableModel呢?如果JTable比作一个人的话,TableModel就相当于形式各样的衣服,“人”要改变自己的外在表现,只需要“换衣服”,就可以了。利用jtable的默认构造方法只能创造一个静态的表格,使用MOdel,我们可以根据改变model来改变table。
既然如此,那为什么有上面三个呢?他们是什么关系呢?
TableModel是一个接口,AbstractTableModel是一个抽象类,继承了接口的部分方法,DefaultTableModel 是AbstractTableModel的一个实现类,包含了表格的基本操作。
TableModel---implements--->AbstractTableModel-----extends--->DefaultTableModel
1、使用TableModel接口更灵活,可以根据用户需求建立相应的表格
package jtable_v1; import java.util.Vector; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; public class MyTableModel1 implements TableModel{ private Vector<String> ziduan; private Vector<Object> dataVec; public MyTableModel1(Vector<String> ziduan,Vector<Object> dataVec){ this.ziduan=ziduan; this.dataVec=dataVec; } @Override public int getRowCount() { return dataVec.size(); } @Override public int getColumnCount() { // TODO Auto-generated method stub return ziduan.size(); } @Override public String getColumnName(int columnIndex) { // 返回列的名称 return ziduan.elementAt(columnIndex); } @Override public Class<?> getColumnClass(int columnIndex) { // 得到列的类型属性 return String.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { // 单元格是否可编辑 if(rowIndex==0){ //第一行不可编辑 return false; } return true; } @Override public Object getValueAt(int rowIndex, int columnIndex) { // TODO Auto-generated method stu Vector<String> vec=(Vector<String>)dataVec.elementAt(rowIndex); String str=vec.elementAt(columnIndex).toString(); return str; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { // TODO Auto-generated method stub Vector<String> vec=(Vector<String>)dataVec.elementAt(rowIndex); vec.setElementAt(aValue.toString(), columnIndex); } @Override public void addTableModelListener(TableModelListener l) { // TODO Auto-generated method stub } @Override public void removeTableModelListener(TableModelListener l) { // TODO Auto-generated method stub } }
对应的测试主类
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class Table1Text {
private JTable table;
public static void main(String[] args) {
// TODO Auto-generated method stub
new Table1Text().init();
}
public void init(){
JFrame jf=new JFrame();
jf.setSize(400, 300);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(3);
MyTableModel1 tableModel=initTableModel();
table=new JTable(tableModel);
//表格排序,当单击表头时,所在列会自动排序
RowSorter<javax.swing.table.TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
table.setRowSorter(sorter);
table.addMouseListener(new java.awt.event.MouseAdapter(){
public void mouseClicked(MouseEvent e) {//仅当鼠标单击时响应
//得到选中的行列的索引值
int r= table.getSelectedRow();
int c= table.getSelectedColumn();
//得到选中的单元格的值,表格中都是字符串
Object value= table.getValueAt(r, c);
String info=r+"行"+c+"列 值 : "+value.toString();
javax.swing.JOptionPane.showMessageDialog(null,info);
}
});
JScrollPane jsp=new JScrollPane(table);
jf.add(jsp);
jf.setVisible(true);
}
public MyTableModel1 initTableModel(){
Vector<String> ziduan=new Vector<String>();
ziduan.add("学号");
ziduan.add("姓名");
ziduan.add("班级");
ziduan.add("年龄");
Vector<Object> dataVec=new Vector<Object>();
for(int i=0;i<40;i++){
Vector<String> vec=new Vector<String>();
for(int j=0;j<ziduan.size();j++){
vec.add(i+"---"+j);
}
dataVec.add(vec);
}
MyTableModel1 tableModel=new MyTableModel1(ziduan, dataVec);
return tableModel;
}
}
2、使用AbstractTableModel抽象类,只需在实例类中实现下面三个方法就可以了,比较简单,用于显示数据,简化操作
public int getRowCount();//得到行数
public int getColumnCount();//得到列数
public Object getValueAt(int row, int column);//得到某行某列的值
3、使用DefaultTableModel,这个类是java类库中已经有的,可以直接使用,但是里面的内容很多,有许多用不到时,我们还是可以考虑自己写一个tablemodel的实现类
package jtable_v3; import java.awt.event.MouseEvent; import java.util.Vector; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.RowSorter; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class Table1Text { private JTable table; public static void main(String[] args) { // TODO Auto-generated method stub new Table1Text().init(); } public void init(){ JFrame jf=new JFrame(); jf.setSize(400, 300); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(3); // DeFaultTableModel1 tableModel=initTableModel1(); DeFaultTableModel1 tableModel=new DeFaultTableModel1(4,4); table=new JTable(tableModel); Object[] columnData=new Object[]{"中国","日本","美国","俄罗斯"}; tableModel.addColumn("国家",columnData); tableModel.addRow(columnData); //表格排序,当单击表头时,所在列会自动排序 RowSorter<javax.swing.table.TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()); table.setRowSorter(sorter); table.addMouseListener(new java.awt.event.MouseAdapter(){ public void mouseClicked(MouseEvent e) {//仅当鼠标单击时响应 //得到选中的行列的索引值 int r= table.getSelectedRow(); int c= table.getSelectedColumn(); //得到选中的单元格的值,表格中都是字符串 Object value= table.getValueAt(r, c); String info=r+"行"+c+"列 值 : "+value.toString(); javax.swing.JOptionPane.showMessageDialog(null,info); } }); JScrollPane jsp=new JScrollPane(table); jf.add(jsp); jf.setVisible(true); } public DeFaultTableModel1 initTableModel(){ Vector<String> ziduan=new Vector<String>(); ziduan.add("学号"); ziduan.add("姓名"); ziduan.add("班级"); ziduan.add("年龄"); Vector<Object> dataVec=new Vector<Object>(); for(int i=0;i<40;i++){ Vector<String> vec=new Vector<String>(); for(int j=0;j<ziduan.size();j++){ vec.add(i+"---"+j); } dataVec.add(vec); } DeFaultTableModel1 tableModel=new DeFaultTableModel1(ziduan, dataVec); return tableModel; } }
注意,我为了练习,将 DefaultTableModel变为自己的DeFaultTableModel1,读者在使用时,可不必,我只是为了我能理解每个函数的实现
import java.io.Serializable;
import java.util.Vector;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
public class DeFaultTableModel1 extends AbstractTableModel implements Serializable{
protected Vector dataVector;
protected Vector columnIdentifiers;
public DeFaultTableModel1() {
this(0, 0);
}
public DeFaultTableModel1(int rowCount, int columnCount) {
this(newVector(columnCount), rowCount);
System.out.println(rowCount+"==="+columnCount);
}
public DeFaultTableModel1(Vector columnNames, int rowCount) {
setDataVector(newVector(rowCount), columnNames);
}
private static Vector newVector(int size) {
Vector v = new Vector(size);
v.setSize(size);
return v;
}
private static Vector nonNullVector(Vector v) {
return (v != null) ? v : new Vector();
}
public DeFaultTableModel1(Object[] columnNames, int rowCount) {
this(convertToVector(columnNames), rowCount);
}
public DeFaultTableModel1(Vector data, Vector columnNames) {
setDataVector(data, columnNames);
}
public DeFaultTableModel1(Object[][] data, Object[] columnNames) {
setDataVector(data, columnNames);
}
public Vector getDataVector() {
return dataVector;
}
public void setDataVector(Vector dataVector, Vector columnIdentifiers) {
this.dataVector = nonNullVector(dataVector);
this.columnIdentifiers = nonNullVector(columnIdentifiers);
justifyRows(0, getRowCount());
fireTableStructureChanged();
}
public void setDataVector(Object[][] dataVector, Object[] columnIdentifiers) {
setDataVector(convertToVector(dataVector), convertToVector(columnIdentifiers));
}
public void newDataAvailable(TableModelEvent event) {
fireTableChanged(event);
}
private void justifyRows(int from, int to) {
// Sometimes the DefaultTableModel is subclassed
// instead of the AbstractTableModel by mistake.
// Set the number of rows for the case when getRowCount
// is overridden.
dataVector.setSize(getRowCount());
for (int i = from; i < to; i++) {
if (dataVector.elementAt(i) == null) {
dataVector.setElementAt(new Vector(), i);
}
((Vector)dataVector.elementAt(i)).setSize(getColumnCount());
}
}
public void newRowsAdded(TableModelEvent e) {
justifyRows(e.getFirstRow(), e.getLastRow() + 1);
fireTableChanged(e);
}
public void rowsRemoved(TableModelEvent event) {
fireTableChanged(event);
}
public void setNumRows(int rowCount) {
int old = getRowCount();
if (old == rowCount) {
return;
}
dataVector.setSize(rowCount);
if (rowCount <= old) {
fireTableRowsDeleted(rowCount, old-1);
}
else {
justifyRows(old, rowCount);
fireTableRowsInserted(old, rowCount-1);
}
}
public void setRowCount(int rowCount) {
setNumRows(rowCount);
}
public void addRow(Vector rowData) {
insertRow(getRowCount(), rowData);
}
public void addRow(Object[] rowData) {
addRow(convertToVector(rowData));
}
public void insertRow(int row, Vector rowData) {
dataVector.insertElementAt(rowData, row);
justifyRows(row, row+1);
fireTableRowsInserted(row, row);
}
public void insertRow(int row, Object[] rowData) {
insertRow(row, convertToVector(rowData));
}
private static int gcd(int i, int j) {
return (j == 0) ? i : gcd(j, i%j);
}
private static void rotate(Vector v, int a, int b, int shift) {
int size = b - a;
int r = size - shift;
int g = gcd(size, r);
for(int i = 0; i < g; i++) {
int to = i;
Object tmp = v.elementAt(a + to);
for(int from = (to + r) % size; from != i; from = (to + r) % size) {
v.setElementAt(v.elementAt(a + from), a + to);
to = from;
}
v.setElementAt(tmp, a + to);
}
}
public void moveRow(int start, int end, int to) {
int shift = to - start;
int first, last;
if (shift < 0) {
first = to;
last = end;
}
else {
first = start;
last = to + end - start;
}
rotate(dataVector, first, last + 1, shift);
fireTableRowsUpdated(first, last);
}
public void removeRow(int row) {
dataVector.removeElementAt(row);
fireTableRowsDeleted(row, row);
}
public void setColumnIdentifiers(Vector columnIdentifiers) {
setDataVector(dataVector, columnIdentifiers);
}
public void setColumnIdentifiers(Object[] newIdentifiers) {
setColumnIdentifiers(convertToVector(newIdentifiers));
}
public void setColumnCount(int columnCount) {
columnIdentifiers.setSize(columnCount);
justifyRows(0, getRowCount());
fireTableStructureChanged();
}
public void addColumn(Object columnName) {
addColumn(columnName, (Vector)null);
}
public void addColumn(Object columnName, Vector columnData) {
columnIdentifiers.addElement(columnName);
if (columnData != null) {
int columnSize = columnData.size();
if (columnSize > getRowCount()) {
dataVector.setSize(columnSize);
}
justifyRows(0, getRowCount());
int newColumn = getColumnCount() - 1;
for(int i = 0; i < columnSize; i++) {
Vector row = (Vector)dataVector.elementAt(i);
row.setElementAt(columnData.elementAt(i), newColumn);
}
}
else {
justifyRows(0, getRowCount());
}
fireTableStructureChanged();
}
public void addColumn(Object columnName, Object[] columnData) {
addColumn(columnName, convertToVector(columnData));
}
public int getRowCount() {
return dataVector.size();
}
public int getColumnCount() {
return columnIdentifiers.size();
}
public String getColumnName(int column) {
Object id = null;
// This test is to cover the case when
// getColumnCount has been subclassed by mistake ...
if (column < columnIdentifiers.size() && (column >= 0)) {
id = columnIdentifiers.elementAt(column);
}
return (id == null) ? super.getColumnName(column)
: id.toString();
}
public boolean isCellEditable(int row, int column) {
return true;
}
public Object getValueAt(int row, int column) {
Vector rowVector = (Vector)dataVector.elementAt(row);
return rowVector.elementAt(column);
}
public void setValueAt(Object aValue, int row, int column) {
Vector rowVector = (Vector)dataVector.elementAt(row);
rowVector.setElementAt(aValue, column);
fireTableCellUpdated(row, column);
}
protected static Vector convertToVector(Object[] anArray) {
if (anArray == null) {
return null;
}
Vector<Object> v = new Vector<Object>(anArray.length);
for (Object o : anArray) {
v.addElement(o);
}
return v;
}
protected static Vector convertToVector(Object[][] anArray) {
if (anArray == null) {
return null;
}
Vector<Vector> v = new Vector<Vector>(anArray.length);
for (Object[] o : anArray) {
v.addElement(convertToVector(o));
}
return v;
}
// @Override
// public int getRowCount() {
// // TODO Auto-generated method stub
// return 0;
// }
//
// @Override
// public int getColumnCount() {
// // TODO Auto-generated method stub
// return 0;
// }
//
// @Override
// public Object getValueAt(int rowIndex, int columnIndex) {
// // TODO Auto-generated method stub
// return null;
// }
//
}
相关推荐
JTable使用 JTable使用JTable使用JTable使用
swing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing ...
在这个“JAVA JTable使用实例”中,我们将深入探讨如何有效地利用`JTable`来显示和操作数据。 首先,`JTable`是`javax.swing.JTable`类的实例,它允许我们以表格的形式展示数据。这个实例可能包括创建一个`...
jtable使用方法介绍,很专业,内容详细,蛮有用。
在这个详细的JTable使用例子中,我们主要探讨如何利用Java Swing组件JTable来展示、操作数据库中的数据。JTable是Swing GUI中用于显示和编辑表格数据的重要组件,它提供了丰富的功能,包括添加、删除和修改表格中的...
最后,这个"JTable使用自定义数据类型示例工程"可能包含了MWorkpace文件夹,其中可能包含了项目的源代码、编译后的类文件或相关的配置文件。这个工程提供了一个实际操作的例子,帮助开发者理解和学习如何在Swing应用...
Java jtable使用 包括读取数据库 虚拟表模型
#### jtable使用方法介绍 ##### 创建表格 在创建表格之前,我们需要导入必要的包: ```java import javax.swing.JTable; import javax.swing.table.DefaultTableModel; ``` 有两种主要的方式创建表格:一种是...
在这个主题中,我们将深入探讨JTable的使用,包括它的基本概念、创建方法、与数据库的连接以及其强大的功能。 1. **基本概念** - **JTable组件**:JTable是Java AWT/Swing GUI的一部分,它继承自JComponent,用于...
JTable的使用收藏 1.JTable与TableModel 1.TableModel与JTable的关系 2.TableModel实践 3.使用JTable+TableModel展示java中的数据对象 2.JTable展示方式的美化 1.设置表格的宽度和高度 2.要显示表头 3.新加列,将...
在Java Swing库中,`JTable`是一个非常重要的组件,用于在GUI应用程序中展示数据集。它是Swing的`javax....通过实践和研究提供的示例代码,你将能够熟练地在Java Swing应用中使用`JTable`来构建功能丰富的用户界面。
下面我们将深入探讨`JTable`的使用方法。 1. **`JTable`的基本概念** `JTable`是`javax.swing.JTable`类的实例,它继承自`JComponent`并实现了`TableModelListener`接口。`JTable`的核心在于`TableModel`,它定义...
深入学习jTable的使用,能够帮助开发者创建用户友好的界面,使得数据的管理与展示更加直观高效。** ### jTable的基本结构与使用 jTable由`DefaultTableModel`类驱动,它负责存储表格的数据和列信息。创建一个jTable...
JTable 使用 TableModel 来获取数据,并将其显示在界面上。 TableModel 实践 TableModel 的实现可以是静态的,也可以是动态的。静态实现中,数据是预先定义好的,而动态实现中,数据可以来自数据库或其他数据源。...
JTable 动态刷新数据是指在 Java Swing 应用程序中,使用 JTable 组件展示数据,并实时更新数据的过程。这种技术在很多实际应用场景中非常有用,如股票交易平台、实时监控系统、电子表格等。 首先,在使用 JTable ...
`一个详细的JTable使用例子.docx`则提供了实际的代码示例,帮助理解如何在程序中集成`JTable`,并实现特定功能,比如合并单元格。 在实际编程中,你可能会遇到一些常见问题,比如如何自定义表格的行高、列宽,或者...
在"swing中JTable的简单使用"这个主题中,我们将深入探讨如何在Java Swing应用中有效地使用JTable。 首先,JTable是javax.swing.JTable类的实例,它是JFrame或JPanel等容器中的一个组件。JTable通常与TableModel...
this.setTitle("JTable使用示例"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } ``` 在这个修正后的代码中,首先确保了`column`中的每个元素都是有效的表头名称,去除了...
总的来说,这个文档提供了一个基础的JTable使用示例,包括创建、设置表格样式以及可能的自定义渲染。在实际项目中,开发者可能需要扩展这些基础功能,比如动态更新数据、响应用户交互、处理更复杂的数据显示逻辑等。
这个"JTable 练习例子exa"显然是一个实践项目,旨在帮助开发者巩固和理解`JTable`的使用。 `JTable`的基本构造函数通常需要一个`TableModel`,这是`JTable`的数据源,它可以是`DefaultTableModel`或其他自定义实现...