作者長期從事網管軟件的開發工作
最終的使用效果如下圖所示
作者本人把它稱為屬性編輯器
下面就屬性編輯器的設計思路和編制過程進行具體的解釋說明
設計思路
根據屬性編輯器的主要界面特征
設計屬性編輯器為一個兩列的JTable
屬性編輯器還要提供相關接口
屬性編輯器的具體設計
屬性編輯器的制作過程
屬性編輯器是從JTable上繼承下來的
public class PropertyEditor extends JTable {
protected class PropertyEditorModel extends DefaultTableModel{
public PropertyEditorModel() {
super(
}
public String getColumnName(int col) {
return
}
public boolean isCellEditable(int row
if(col ==
return false; // 第一列是屬性名
else
// 屬性值是否可編輯要看用戶指定的情況
return ((Boolean)propertyEditable
}
}
}
要實現定制的單元繪制器和編輯器
/**
* 每一個屬性項都對應一個單元編輯器
*/
protected Hashtable propertyEditors = new Hashtable(
/**
* 每一個屬性項都對應一個單元渲染器
*/
protected Hashtable propertyRenderers = new Hashtable(
/**
* 屬性是否可編輯
*/
protected Hashtable propertyEditable = new Hashtable(
/**
* 獲取指定單元格的編輯器
* @param row 行
* @param col 列
*/
public TableCellEditor getCellEditor(int row
TableCellEditor editor = null;
if(col ==
editor = (TableCellEditor)propertyEditors
}
if(editor == null) { // 沒找到編輯器
editor = super
}
return editor;
}
/**
* 獲取指定單元格的渲染器
*/
public TableCellRenderer getCellRenderer(int row
TableCellRenderer renderer = null;
if(col ==
renderer = (TableCellRenderer)propertyRenderers
}
if(renderer == null) {
renderer = super
}
// 給表格元素提供Hint提示
if(renderer instanceof JComponent) {
Object v = this
if(v == null) { // 屬性值有可能為空
v = this
}
((JComponent)renderer)
}
return renderer;
}
如何確定哪個屬性用哪一種編輯器呢?可以根據用戶程序員傳入的參數來確定
/**
* 在屬性表中增加整數屬性
* 當屬性值為空值時
* addProperty(
* @param propertyName 屬性名
* @param longNumObj 屬性初始值
*/
public void addProperty(String propertyName
if(propertyName == null) throw new RuntimeException(
Object[] row = new Object[
row[
row[
appendRow(row); // 往表格增加行
propertyEditors
propertyRenderers
propertyEditable
}
給屬性編輯器加上get和set接口
/**
* 根據屬性名得到屬性值
* @param propertyName 屬性名
*/
public Object getPropertyValue(String propertyName) {
Object retValue = null;
for(int i =
if(ptm.getValueAt(i, 0).equals(propertyName)) {
retValue = ptm.getValueAt(i, 1);
break;
}
}
return retValue;
}
/**
* 設置屬性值
* @param propertyName 屬性名
* @param newValue 新的屬性值
*/
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;
}
}
}
好了,屬性值編輯器的大框架已經完成了,下面以整數型的單元編輯器為例,簡單說明單元編輯器的制作方法,雙精度型和字符串型的和它類似,最復雜的用戶自定義對話框型的,留待讀者自己看源代碼吧(反正源代碼裡面有詳細的注釋的J)。Tw.WinGwiT.Com
/**
* 創建並初始化long型數據的編輯器和渲染器
*/
private void createLongEditorRenderer() {
final JTextField longTextField = new JTextField("0", 5); // 用文本輸入框做輸入控件
longTextField.setHorizontalAlignment(JTextField.LEFT);
longEditor = new DefaultCellEditor(longTextField) {
private Object previousValue = null;
public Object getCellEditorValue() {
if(longTextField.getText().equals("")
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19202.html