如同其它的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);
-
}
-
}
运行结果:
·实现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);
-
}
运行结果:
3、注意:渲染器实际上并没有像可视化组件添加到Container中那样添加到JTable实例中,即表格中不含有JComboBox实例。此时,是将唯一的JComboBox实例绘制(通过向paint()方法传递Graphics对象)到“性别”一列的每一个单元格所占用的区域中。
4、在TableValues添加如下代码(覆盖AbstractTableModel中的方法),使得JTable实例中单元格可以编辑:
-
-
-
-
publicbooleanisCellEditable(introw,intcolumn){
-
returntrue;
-
}
然而此时对“性别”一列的单元格进行编辑,会出现如下情况:
这就得使用到单元格编辑器了。
·实现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());
运行结果:
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()
分享到:
相关推荐
1.JTable与TableModel 1.TableModel与JTable的关系 2.TableModel实践 3.使用JTable+TableModel展示java中的数据对象 2.JTable展示方式的美化 1.设置表格的宽度和高度 2.要显示表头 3.新加列,将列设为下拉框 4.表格...
很久没用JAVA了,现在项目上需要在jtable里用jcombobox做显示,自己写了一些但是没有选择的时候没有下拉按钮,这个例子纠正了这个问题
实现设置JTable中某些单元格的背景色
主要介绍了Java Swing实现JTable检测单元格数据变更事件的方法,结合完整实例形式分析了Swing实现JTable检测单元格数据变更事件过程中出现的问题与相关解决方法,需要的朋友可以参考下
JTable使用 JTable使用JTable使用JTable使用
JTable合并单元格 工作中碰到了此问题,在网上找了半天资料,没有找到我想实现的功能,最后选了相近的,加以修改。放于此处做个备份,也与大家共享一下。
原创 Java JTable 操作单元格 行 列
swing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing ...
JTable使用TableModel实现数据绑定的示例,以及常用JTable时间处理中,如何获取当前选中行,选中行其他数据等。
JTable 在一个单元格放入多个按钮,
类中使用JTable 实现了对JTable中行级的增删改 JFrame为自主布局,设置了背景图片以及窗口图标 有详细注释 例如: TableModel tableModel = jTable1.getModel(); DefaultTableModel dtm = (DefaultTableModel) ...
使用JTable显示数据查询的数据集 包含数据库连接
table中插入combobox, 并能够【根据条件】【动态】修改【某一行】的combobox中可选项
组件(JButton,JLable...)继承相应的组件,并且implements TableCellRenderer,图片的方式是,将图片添加该组件中就可以了,具体方式是加入到重写的方法中.this.setIcon("path"),就可以了 3.设置Table的...
用改写 DefaultCellEditor 和 TableCellRenderer的方法实现,主要代码: table.getColumnModel().getColumn(2).setCellEditor(new MyButtonEditor()); table.getColumnModel().getColumn(2).setCellRenderer...
JTable的自动换行。挺好用的。里面还可以设置字体大小。分享一下。
JTable+显示数据库中的记录 JTable+显示数据库中的记录 JTable+显示数据库中的记录
包含:JTable 、 JList 、 JComboBox 、JSlider 、JProgressBar 、 JSpinner 这些都是 Netbeans 的基本的组件,我写了一些简单的代码,对这些组件进行熟悉。
JTable使用自定义数据类型实现Boolean类型显示成Checkbox形式,并可以更加勾选的值改变背景色。
JTable TableModel 自动更新