如同其它的Swing组件,JTable使用MVC(模型、试图、控制器)设计方式,将可视化组件(JTable实例)从其数据(TableModel实现)中分离出来。
·TableModel接口
1、TableModel为JTable提供
·显示的数据
·表格的维数
·表格中每一列所包含的数据类型
·应该显示的列标题
·是否允许编辑指定单元格的值
2、实现TableModel:
TableValues类
-
importjavax.swing.table.AbstractTableModel;
-
-
-
-
publicclassTableValuesextendsAbstractTableModel{
-
privatestaticfinallongserialVersionUID=-8430352919270533604L;
-
publicfinalstaticintNAME=0;
-
publicfinalstaticintGENDER=1;
-
publicfinalstaticString[]columnNames={"姓名","性别"};
-
publicObject[][]values={
-
{"Cannel_2020",true},
-
{"Lucy",false},
-
{"韩梅",false},
-
{"李雷",true},
-
{"Jim",true}
-
};
-
publicintgetColumnCount(){
-
returnvalues[0].length;
-
}
-
publicintgetRowCount(){
-
returnvalues.length;
-
}
-
publicObjectgetValueAt(introwIndex,intcolumnIndex){
-
returnvalues[rowIndex][columnIndex];
-
}
-
-
-
-
publicStringgetColumnName(intcolumn){
-
returncolumnNames[column];
-
}
-
}
SimpleTableTest类
-
importjava.awt.BorderLayout;
-
importjava.awt.Container;
-
importjavax.swing.JFrame;
-
importjavax.swing.JScrollPane;
-
importjavax.swing.JTable;
-
importjavax.swing.table.TableColumn;
-
importjavax.swing.table.TableColumnModel;
-
publicclassSimpleTableTestextendsJFrame{
-
-
privatestaticfinallongserialVersionUID=-4172876583187222326L;
-
protectedJTabletable;
-
publicSimpleTableTest(){
-
Containerpane=getContentPane();
-
pane.setLayout(newBorderLayout());
-
TableValuestv=newTableValues();
-
table=newJTable(tv);
-
-
table.setRowHeight(30);
-
-
JScrollPanejsp=newJScrollPane(table);
-
pane.add(jsp,BorderLayout.CENTER);
-
}
-
publicstaticvoidmain(String[]args){
-
SimpleTableTeststt=newSimpleTableTest();
-
stt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
stt.setSize(400,200);
-
stt.setVisible(true);
-
}
-
}
运行结果:
![](http://hi.csdn.net/attachment/201202/17/0_1329485190vdQ2.gif)
·实现TableCellRenderer(单元格渲染器)接口
1、使表格“性别”一列的单元格出现JComboBox组件
GenderRenderer类
-
importjava.awt.Component;
-
importjavax.swing.JComboBox;
-
importjavax.swing.JTable;
-
importjavax.swing.table.TableCellRenderer;
-
-
publicclassGenderRendererextendsJComboBoximplementsTableCellRenderer{
-
privatestaticfinallongserialVersionUID=-8624401777277852691L;
-
publicGenderRenderer(){
-
super();
-
addItem("男");
-
addItem("女");
-
}
-
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
-
booleanisSelected,booleanhasFocus,introw,intcolumn){
-
if(isSelected){
-
setForeground(table.getForeground());
-
super.setBackground(table.getBackground());
-
}else{
-
setForeground(table.getForeground());
-
setBackground(table.getBackground());
-
}
-
booleanisMale=((Boolean)value).booleanValue();
-
setSelectedIndex(isMale?0:1);
-
returnthis;
-
}
-
-
}
2、把SimpleTableTest类的构造函数改变如下:
-
publicSimpleTableTest(){
-
setTitle("FromCannel_2020'sblog(CSDN)");
-
setLayout(newBorderLayout());
-
TableValuestv=newTableValues();
-
table=newJTable(tv);
-
-
table.setRowHeight(30);
-
-
TableColumnModeltcm=table.getColumnModel();
-
TableColumntc=tcm.getColumn(TableValues.GENDER);
-
-
tc.setCellRenderer(newGenderRenderer());
-
-
-
JScrollPanejsp=newJScrollPane(table);
-
add(jsp,BorderLayout.CENTER);
-
}
运行结果:
![](http://hi.csdn.net/attachment/201202/17/0_1329485341H3Ig.gif)
3、注意:渲染器实际上并没有像可视化组件添加到Container中那样添加到JTable实例中,即表格中不含有JComboBox实例。此时,是将唯一的JComboBox实例绘制(通过向paint()方法传递Graphics对象)到“性别”一列的每一个单元格所占用的区域中。
4、在TableValues添加如下代码(覆盖AbstractTableModel中的方法),使得JTable实例中单元格可以编辑:
-
-
-
-
publicbooleanisCellEditable(introw,intcolumn){
-
returntrue;
-
}
然而此时对“性别”一列的单元格进行编辑,会出现如下情况:
![](http://hi.csdn.net/attachment/201202/17/0_1329485389WMW6.gif)
这就得使用到单元格编辑器了。
·实现TableCellEditor(单元格编辑器)接口
1、
-
importjava.awt.Component;
-
importjava.util.EventObject;
-
importjavax.swing.JComboBox;
-
importjavax.swing.JTable;
-
importjavax.swing.event.CellEditorListener;
-
importjavax.swing.event.ChangeEvent;
-
importjavax.swing.event.EventListenerList;
-
importjavax.swing.table.TableCellEditor;
-
-
publicclassGenderEditorextendsJComboBoximplementsTableCellEditor{
-
-
privatestaticfinallongserialVersionUID=5860619160549087886L;
-
-
privateEventListenerListlistenerList=newEventListenerList();
-
-
privateChangeEventchangeEvent=newChangeEvent(this);
-
publicGenderEditor(){
-
super();
-
addItem("男");
-
addItem("女");
-
-
-
-
-
-
-
-
-
-
}
-
publicvoidaddCellEditorListener(CellEditorListenerl){
-
listenerList.add(CellEditorListener.class,l);
-
}
-
publicvoidremoveCellEditorListener(CellEditorListenerl){
-
listenerList.remove(CellEditorListener.class,l);
-
}
-
privatevoidfireEditingStopped(){
-
CellEditorListenerlistener;
-
Object[]listeners=listenerList.getListenerList();
-
for(inti=0;i<listeners.length;i++){
-
if(listeners[i]==CellEditorListener.class){
-
-
-
listener=(CellEditorListener)listeners[i+1];
-
-
<spanstyle="white-space:pre"></span>
-
-
listener.editingStopped(changeEvent);
-
}
-
}
-
}
-
publicvoidcancelCellEditing(){
-
}
-
-
-
-
publicbooleanstopCellEditing(){
-
-
-
System.out.println("编辑其中一个单元格,再点击另一个单元格时,调用。");
-
fireEditingStopped();
-
returntrue;
-
}
-
-
-
-
publicComponentgetTableCellEditorComponent(JTabletable,Objectvalue,
-
booleanisSelected,introw,intcolumn){
-
booleanisMale=((Boolean)value).booleanValue();
-
setSelectedIndex(isMale?0:1);
-
returnthis;
-
}
-
-
-
-
publicbooleanisCellEditable(EventObjectanEvent){
-
returntrue;
-
}
-
-
-
-
publicbooleanshouldSelectCell(EventObjectanEvent){
-
returntrue;
-
}
-
-
-
-
-
publicObjectgetCellEditorValue(){
-
returnnewBoolean(getSelectedIndex()==0?true:false);
-
}
-
}
2、把SimpleTableTest类的构造函数中
-
tc.setCellRenderer(newGenderRenderer());
后面加入:
-
-
tc.setCellEditor(newGenderEditor());
运行结果:
![](http://hi.csdn.net/attachment/201202/17/0_1329485518pty6.gif)
3、还有一点别忘了再在TableValues加入如下代码(原因:看第4的最后一点)
-
-
-
-
publicvoidsetValueAt(Objectvalue,introw,intcolumn){
-
values[row][column]=value;
-
}
4、GenderEditor类的工作流程:
1)、调用TableCellEditor接口中的getTableCellEditorComponent()方法初始化编辑
2)、编辑当前的单元格,再点击另一个单元格时,调用CellEditor中的stopCellEditing(),通过fireEditingStopped()调用到editingStopped()。
3)、在editingStopped方法中,JTable调用getCellEditorValue()取回单元格的值,并且把这个值传递给TableValues(TableModel)的setValueAt()
分享到:
相关推荐
为了在`JTable`的某一列显示`JComboBox`,我们需要实现`TableCellEditor`接口,它定义了如何编辑表格的单元格。 1. **创建自定义的TableModel** 我们需要创建一个继承自`AbstractTableModel`的类,以便定制数据...
1.JTable与TableModel 1.TableModel与JTable的关系 2.TableModel实践 3.使用JTable+TableModel展示java中的数据对象 2.JTable展示方式的美化 1.设置表格的宽度和高度 2.要显示表头 3.新加列,将列设为下拉框 4.表格...
实现设置JTable中某些单元格的背景色
JTable组件通过TableModel接口与数据模型进行交互,以显示和编辑数据。 2. TableModel的实现 TableModel接口有多种实现方式,常见的有DefaultTableModel和AbstractTableModel。DefaultTableModel是Swing提供的默认...
当`JTable`需要获取数据时,`TableModel`可以根据这个信息返回正确的值。 3. **设置`JTable`的行头和列头**: 如果你需要合并行头或列头,`JTableHeader`提供了`setResizingModel`和`setHeaderView`方法,你可以...
4. **隐藏/显示行**:尽管`JTable`没有直接的隐藏行方法,但可以通过修改`TableModel`的数据或使用`JScrollPane`的`setRowHeaderView()`来实现类似效果。 5. **排序行**:`JTable`本身不支持排序,但可以结合`...
在动态刷新数据时,需要使用 DefaultTableModel,这是一个实现了 TableModel 接口的类,默认情况下,它会将数据存储在一个 Vector 中。Vector 的每个元素都是一个行数据,行数据又是一个 Vector,包含了每个单元格的...
在 JTable 的初级教程中,我们往往会提到,使用 TableModel 的 addTableModelListener 方法可以监听单元格数据的变更。在其事件处理函数 tableChanged 中,我们可以通过 e.getColumn(),e.getFirstRow(),e....
`JTable`依赖于`TableModel`来获取和设置单元格的值。在这个例子中,我们需要创建一个自定义的`TableModel`,以便支持`CheckBox`作为单元格的视图。这通常意味着我们需要重写`getValueAt()`和`setValueAt()`方法,以...
总之,将`JComboBox`与`JTable`结合使用,需要自定义渲染器和编辑器来确保其正确显示和交互。通过上述步骤,你可以在`JTable`中创建一个具有下拉箭头的`JComboBox`,解决了无下拉箭头的问题。在实际开发中,你可能...
Swing JTable组件设置单元格合并,内置Test测试类,核心API GridBagTable tasktable = new GridBagTable(model); tasktable.mergeCells(startRow, endRow, 0, 0);
在Java编程中,JTable通常与TableModel接口一起使用,该接口定义了表格的数据模型。开发者可以实现自己的TableModel来存储和处理特定的数据。例如,AbstractTableModel是一个抽象类,可以作为自定义数据模型的基础,...
`TableModel`接口定义了表格数据的结构和行为,如获取和设置单元格值、监听数据变化等。`DefaultTableModel`是`TableModel`的一个实现,通常用于简单场景。 JTable的一些关键方法包括: - `getTableHeader()`: ...
JTable 使用 TableModel 来获取数据,并将其显示在界面上。 TableModel 实践 TableModel 的实现可以是静态的,也可以是动态的。静态实现中,数据是预先定义好的,而动态实现中,数据可以来自数据库或其他数据源。...
在Java Swing中,`TableCellRenderer` 是一个接口,它在创建和显示JTable组件中的单元格内容时扮演着至关重要的角色。标题“*Renderer implements TableCellRenderer”表明我们正在讨论一个自定义的渲染器,该渲染器...
开发者可以根据需要自定义`TableModel`来适应不同的数据结构,或者通过监听`JTable`的各种事件来实现特定的功能,如单元格更改、行选择等。`JTable`是Java Swing中非常重要的组件,广泛应用于数据展示和用户交互场景...
### jTable的基本结构与使用 jTable由`DefaultTableModel`类驱动,它负责存储表格的数据和列信息。创建一个jTable通常涉及以下几个步骤: 1. **创建TableModel**:首先,你需要创建一个`TableModel`实例,这可以是`...
然后,为了在`JTable`的特定列显示`JComboBox`,我们需要实现`TableCellEditor`接口。`TableCellEditor`负责编辑单元格的内容,这里我们将它实现为一个`JComboBox`。我们可以在`getTableCellEditorComponent`方法中...
4. `JTable(TableModel dm)`:使用自定义的`TableModel`实例创建表格。 5. `JTable(TableModel dm, TableColumnModel cm)`:除了`TableModel`外,还传入`TableColumnModel`以定制列的行为。 6. `JTable(TableModel ...
首先,`TableCellRenderer`是`JTable`用来决定单元格如何显示的组件。在这个案例中,我们需要创建一个自定义的`TableCellRenderer`,它将Boolean值转换为`JCheckBox`。通常,我们继承`DefaultTableCellRenderer`并...