package propertyproj; import javax.swing.*; import javax.swing.table.*; import java.util.Hashtable; import java.awt.Component; import java.awt.*; import javax.swing.event.*; import java.awt.event.*; import java.util.*; import java.beans.*; public class PropertyEditor extends JTable { protected DefaultCellEditor dlgCellEditor; protected DefaultCellEditor booleanCellEditor; protected TableCellRenderer booleanRender; protected DefaultCellEditor longEditor; protected DefaultTableCellRenderer longRender; protected Hashtable propertyEditors = new Hashtable(10); protected Hashtable propertyRender = new Hashtable(10); protected Hashtable propertyEditable = new Hashtable(10); public PropertyEditorModel ptm = new PropertyEditorModel(); public PropertyEditor(PropertyEditorModel ptm) { super(ptm); this.ptm = ptm; } public PropertyEditor() { } public class PropertyEditorModel extends DefaultTableModel { PropertyEditorModel() { super(0, 2); } /** * Returns the name of the column at <code>columnIndex</code>. * * @param columnIndex the index of the column * @return the name of the column * @todo Implement this javax.swing.table.TableModel method */ public String getColumnName(int columnIndex) { if (columnIndex == 0) { return "属性"; } else { return "值"; } } /** * Returns true if the cell at <code>rowIndex</code> and * <code>columnIndex</code> is editable. * * @param rowIndex the row whose value to be queried * @param columnIndex the column whose value to be queried * @return true if the cell is editable * @todo Implement this javax.swing.table.TableModel method */ public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex == 0) { return false; } else { return true; } } } /** * Returns an appropriate editor for the cell specified by <code>row</code> and * <code>column</code>. * * @param row the row of the cell to edit, where 0 is the first row * @param column the column of the cell to edit, where 0 is the first column * @return the editor for this cell; if <code>null</code> return the default * editor for this type of cell * @todo Implement this javax.swing.JTable method */ public TableCellEditor getCellEditor(int row, int column) { TableCellEditor editor = null; if (column == 1) { editor = (TableCellEditor) propertyEditors.get(this.getValueAt(row, 0)); } if (editor == null) { editor = super.getCellEditor(row, column); } return editor; } /** * Returns an appropriate renderer for the cell specified by this row and * column. * * @param row the row of the cell to render, where 0 is the first row * @param column the column of the cell to render, where 0 is the first column * @return the assigned renderer; if <code>null</code> returns the default * renderer for this type of object * @todo Implement this javax.swing.JTable method */ public TableCellRenderer getCellRenderer(int row, int column) { TableCellRenderer render = null; if (column == 1) { render = (TableCellRenderer) propertyRender.get(this.getValueAt(row, 0)); } if (render == null) { render = super.getCellRenderer(row, column); } return render; } public void addProperty(String propertyName, Long longNumObj) { if (propertyName == null) { throw new RuntimeException("属性名称不能为空"); } Object[] row = new Object[2]; row[0] = propertyName; row[1] = longNumObj; this.appenRow(row); propertyEditors.put(propertyName, longEditor); this.propertyRender.put(propertyName, longRender); this.propertyEditable.put(propertyName, new Boolean(true)); } public void addProperty(String propertyName, Boolean booleanObj) { if (propertyName == null) { throw new RuntimeException("属性名称不能为空"); } Object[] row = new Object[2]; row[0] = propertyName; row[1] = booleanObj; this.appenRow(row); propertyEditors.put(propertyName, this.booleanCellEditor); this.propertyRender.put(propertyName, this.booleanRender); this.propertyEditable.put(propertyName, new Boolean(true)); } public Object getPropertyValue(String propertyName) { Object retValue = null; for (int i = 0; i ptm.getRowCount(); i++) { if (ptm.getValueAt(i, 0).equals(propertyName)) { retValue = ptm.getValueAt(i, 1); break; } } return retValue; } public void setPropertyValue(String propertyName, Object newValue) { for (int i = 0; i ptm.getRowCount(); i++) { if (ptm.getValueAt(i, 0).equals(propertyName)) { ptm.setValueAt(newValue, i, 1); break; } } } public void appenRow(Object[] row) { ptm.addRow(row); } public void createLongEditorRenderer() { final PanelInputText longTextField = new PanelInputText(); longEditor = new DefaultCellEditor(new JTextField()) { Component editor; private Object previsousValue = null; public Object getCellEditorValue() { if (editor instanceof PanelInputText) { if ( ( (PanelInputText) editor).getText().equals("")) { return (Long)null; } else { System.out.println("getCellEditorValue " + ( (PanelInputText) editor).getText()); return new Long( ( (PanelInputText) editor).getText()); } } else { return (Long)null; } } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { editor = null; if (value != null) { longTextField.setText(value.toString()); } else { longTextField.setText(""); } previsousValue = value; System.out.println("getTableCellEditorCompontOldValue: " + value); editor = longTextField; System.out.println("getTableCellEditorCompont"); return editor; } public boolean stopCellEditing() { Long lv = null; if (! ( (PanelInputText) editor).getText().equals("")) { try { System.out.println("stopCellEditing"); lv = new Long( ( (PanelInputText) editor).getText()); } catch (Exception e) { this.cancelCellEditing(); return true; } } if ( (previsousValue == null) ? (previsousValue == lv) : this.previsousValue.equals(lv)) { System.out.println("stopCellEditing"); this.cancelCellEditing(); return true; } System.out.println("DefaultstopEditing"); return super.stopCellEditing(); } }; longTextField.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { System.out.println("FocusLost"); longEditor.stopCellEditing(); } } ); longEditor.setClickCountToStart(2); this.longRender = new DefaultTableCellRenderer() { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JLabel jLabel; jLabel = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (value == null) { jLabel.setText(""); } else if ( ( (Long) value).toString().equals("11")) { jLabel.setText("测试代码名称转换"); } else { jLabel.setText( ( (Long) value).toString()); } if (! (value == null)) { System.out.println("getRender" + value.getClass().getName()); } return jLabel; } } ; longRender.setHorizontalAlignment(JLabel.LEFT); longRender.setBackground(Color.pink); } public void createBooleanEditorRender() { JCheckBox jcb = new JCheckBox(""); this.booleanCellEditor = new DefaultCellEditor(jcb); booleanCellEditor.setClickCountToStart(1); this.booleanRender = new TableCellRenderer() { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { BooleanRender booleanRender = new BooleanRender(); if (value != null) { if ( ( (Boolean) value).booleanValue()) { booleanRender.selJCheckBox(new Boolean(true)); } else { booleanRender.selJCheckBox(new Boolean(false)); } } else { booleanRender.selJCheckBox(new Boolean(false)); } return booleanRender; } }; } }