首页>代码>java swing JTable的中级应用>/SwingComponents/src/com/learn/swing/jtable/celleditor/GenderEditor.java
package com.learn.swing.jtable.celleditor; import java.awt.Component; import java.util.EventObject; import javax.swing.JComboBox; import javax.swing.JTable; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.EventListenerList; import javax.swing.table.TableCellEditor; @SuppressWarnings("serial") public class GenderEditor extends JComboBox<String> implements TableCellEditor{ //EventListenerList:保存EventListener 列表的类。 private EventListenerList listenerList = new EventListenerList(); //ChangeEvent用于通知感兴趣的参与者事件源中的状态已发生更改。 private ChangeEvent changeEvent = new ChangeEvent(this); public GenderEditor(){ super(); addItem("男"); addItem("女"); //请求终止编辑操作可以包含单元格的JTable收到,也可以从编辑器组件本身(如这里的JComboBox)获得 /*addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("ActionListener"); //如同stopCellEditing,都是调用fireEditingStopped()方法 fireEditingStopped(); } });*/ } /** * 返回值传递给TableValue(TableModel)中的setValueAt()方法 */ @Override public Object getCellEditorValue() { System.err.println("getCellEditorValue:" + getSelectedIndex()); return new Boolean(getSelectedIndex() == 0 ? true : false); } /** * 单元格是否可以使用 anEvent 开始进行编辑。 */ @Override public boolean isCellEditable(EventObject anEvent) { System.err.println("isCellEditable:" + anEvent); return true; } /** * 如果应该选择正编辑的单元格,则返回true,否则返回 false。 */ @Override public boolean shouldSelectCell(EventObject anEvent) { System.err.println("shouldSelectCell:" + anEvent); return true; } /** * 编辑其中一个单元格,再点击另一个单元格时,调用。 */ @Override public boolean stopCellEditing() { //可以注释掉下面的fireEditingStopped(),然后在GenderEditor的构造函数中把 //addActionListener()的注释去掉(这时请求终止编辑操作从JComboBox获得) System.err.println("编辑其中一个单元格,再点击另一个单元格时,调用。"); fireEditingStopped();//请求终止编辑操作从JTable获得 return true; } @Override public void cancelCellEditing() { // TODO Auto-generated method stub System.err.println("cancelCellEditing"); } @Override public void addCellEditorListener(CellEditorListener l) { listenerList.add(CellEditorListener.class, l); System.err.println("addCellEditorListener"); } @Override public void removeCellEditorListener(CellEditorListener l) { listenerList.remove(CellEditorListener.class, l); System.err.println("removeCellEditorListener"); } /** * 一个单元格初始化编辑时,getTableCellEditorComponent被调用 */ @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { boolean isMale = ((Boolean)value).booleanValue(); setSelectedIndex(isMale ? 0 : 1); System.err.println("创建组件:" + "-----(" + row + "," + column + ")-----" + String.valueOf(value)); return this; } private void fireEditingStopped(){ CellEditorListener listener; Object[] listeners = listenerList.getListenerList(); for(int i = 0; i < listeners.length; i++){ if(listeners[i]== CellEditorListener.class){ //之所以是i+1,是因为一个为CellEditorListener.class(Class对象), //接着的是一个CellEditorListener的实例 listener= (CellEditorListener)listeners[i+1]; //让changeEvent去通知编辑器已经结束编辑 //在editingStopped方法中,JTable调用getCellEditorValue()取回单元格的值, //并且把这个值传递给TableValues(TableModel)的setValueAt() listener.editingStopped(changeEvent); System.err.println("fireEditingStopped" + listener); } } } }
最近下载更多
wyx065747 LV67
2022年4月7日
Demo1111 LV30
2021年12月12日
一个好人520 LV10
2021年9月29日
yangctz LV24
2021年9月10日
ysc123 LV5
2021年7月8日
香菇肉饼汤 LV8
2020年5月21日
上善_若水 LV3
2020年2月19日
liaozhensy LV1
2019年7月18日
yongzheng132 LV17
2019年6月21日
ty93pical LV2
2019年4月22日
最近浏览更多
1219610676 LV4
2023年12月7日
ezra77934 LV2
2023年9月16日
hufuman LV23
2023年4月6日
漫步的海星 LV4
2023年3月16日
2252536772 LV21
2022年11月9日
lcb813 LV1
2022年7月1日
a318888331 LV13
2022年5月30日
忧麦紫 LV18
2022年3月2日
zkingzz
2021年12月21日
暂无贡献等级
Demo1111 LV30
2021年12月12日