熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

用Java制作屬性編輯器

2013-11-15 09:50:25  來源: JSP教程 

  作者長期從事網管軟件的開發工作網絡設備的配置管理模塊需要對網絡設備的大量參數進行配置工作設計開發配置管理模塊的界面成為整個網管系統的難點尤其是用Java語言開發時需要編制大量的界面布局事件處理等代碼網管軟件開發的主要工作量就集中在此制作一個類似於DelphiJBuilder等可視化開發工具的對象查看器的參數配置控件用於項目的優點是顯而易見的
  界面顯得很專業
  容易做到使整個系統的風格趨於一致
  使用靈活代碼量大大減小
  ……
  最終的使用效果如下圖所示
   
  作者本人把它稱為屬性編輯器它的主要特征是是一個兩列多行的表格第一列用來顯示屬性名稱第二列用來顯示和編輯屬性值屬性值的顯示和編輯可以有多種方式如文本框輸入下拉框選擇組合框選擇自定義的彈出式對話框等當屬性被編輯後可以向感興趣的對象發出通知
  下面就屬性編輯器的設計思路和編制過程進行具體的解釋說明
  設計思路
  根據屬性編輯器的主要界面特征選擇JTable作為編輯器的基類JTable是Swing中最復雜的組件之一它主要被用來顯示數據行和數據列它可以為每個數據單元分別提供繪制器和編輯器是典型的MVC(模型Model視圖View控制Control)模式的實現者
  設計屬性編輯器為一個兩列的JTable每一行數據的第一列存放不重復的字符串作為屬性的名稱第二列保存Object對象根據其具體數據類型設置其單元繪制器和單元編輯器一般單元繪制器用系統默認的JLabel即可而單元編輯器則必須提供定制的控件如對字符串型數據用JTextField或者JComboBox對布爾型數據用JCheckBox對特殊類型可以提供JDialog對話框的主要界面可以由使用本屬性編輯器的程序員自行定制
  屬性編輯器還要提供相關接口如屬性值是否只讀屬性值變化時必須通知監聽者等等
  屬性編輯器的具體設計請參見下圖限於篇幅該圖只簡單列舉了幾個主要的類之間的關系和一些重要的變量和方法
  
  屬性編輯器的制作過程
  
  屬性編輯器是從JTable上繼承下來的必須給它定義一個DefaultTableModel的子類用來作為屬性編輯器的數據模型存放屬性名和屬性值因為它只在屬性編輯器內部使用所以可以定義為屬性編輯器的內部類
  
  public class PropertyEditor extends JTable {
  
  protected class PropertyEditorModel extends DefaultTableModel{
  
  public PropertyEditorModel() {
  
  super( ); // 只有兩個列
  
  }
  
  public String getColumnName(int col) {
  
  return ; // 不需要列標題
  
  }
  
  public boolean isCellEditable(int row int col) {
  
  if(col == )
  
  return false; // 第一列是屬性名不可編輯
  
  else
  
  // 屬性值是否可編輯要看用戶指定的情況
  
  return ((Boolean)propertyEditableget(thisgetValueAt(row )))booleanValue();
  
  }
  
  }
  
  }
  
  要實現定制的單元繪制器和編輯器必須覆蓋JTable的getCellEditor和getCellRenderer方法那些已經做好的繪制器編輯器和該屬性值是否允許編輯都可以根據屬性名保存在Hashtable裡需要的時候根據屬性名取出來
  
  /**
  
  * 每一個屬性項都對應一個單元編輯器用Hashtable來保存這些編輯器
  
  */
  
  protected Hashtable propertyEditors = new Hashtable();
  
  /**
  
  * 每一個屬性項都對應一個單元渲染器
  
  */
  
  protected Hashtable propertyRenderers = new Hashtable();
  
  /**
  
  * 屬性是否可編輯
  
  */
  
  protected Hashtable propertyEditable = new Hashtable();
  
  
  /**
  
  * 獲取指定單元格的編輯器
  
  * @param row 行
  
  * @param col 列
  
  */
  
  public TableCellEditor getCellEditor(int row int col) {
  
  TableCellEditor editor = null;
  
  if(col == ) { // 屬性值列才需要編輯器這個判斷條件不要也可效率會低一點
  
  editor = (TableCellEditor)propertyEditorsget(thisgetValueAt(row ));
  
  }
  
  if(editor == null) { // 沒找到編輯器則用系統默認的
  
  editor = supergetCellEditor(row col);
  
  }
  
  return editor;
  
  }
  
  
  /**
  
  * 獲取指定單元格的渲染器
  
  */
  
  public TableCellRenderer getCellRenderer(int row int col) {
  
  TableCellRenderer renderer = null;
  
  if(col == ) {
  
  renderer = (TableCellRenderer)propertyRenderersget(thisgetValueAt(row ));
  
  }
  
  if(renderer == null) {
  
  renderer = supergetCellRenderer(row col);
  
  }
  
  // 給表格元素提供Hint提示
  
  if(renderer instanceof JComponent) {
  
  Object v = thisgetModel()getValueAt(row col);
  
  if(v == null) { // 屬性值有可能為空則取屬性名屬性名必不為空
  
  v = thisgetModel()getValueAt(row );
  
  }
  
  ((JComponent)renderer)setToolTipText(vtoString());
  
  }
  
  return renderer;
  
  }
  
  
  如何確定哪個屬性用哪一種編輯器呢?可以根據用戶程序員傳入的參數來確定對傳入的整數型數據則用LongCellEditor字符串型的當然用StringCellEditor了其它依次類推以整數型來舉例
  
  /**
  
  * 在屬性表中增加整數屬性允許為空值編輯器和渲染器為long型編輯器和渲染器
  
  * 當屬性值為空值時必須寫成
  
  * addProperty(pName (Long)null)
  
  * @param propertyName 屬性名
  
  * @param longNumObj 屬性初始值
  
  */
  
  public void addProperty(String propertyName Long longNumObj) {
  
  if(propertyName == null) throw new RuntimeException(Coding error : property name can NOT be null !);
  
  
  Object[] row = new Object[];
  
  row[] = propertyName;
  
  row[] = longNumObj;
  
  appendRow(row); // 往表格增加行
  
  propertyEditorsput(propertyName longEditor); // 添加整型編輯器
  
  propertyRenderersput(propertyName longRenderer); // 添加整型繪制器
  
  propertyEditableput(propertyName new Boolean(true)); // 設置該屬性允許編輯
  
  }
  
  
  給屬性編輯器加上get和set接口
  
  /**
  
  * 根據屬性名得到屬性值
  
  * @param propertyName 屬性名
  
  */
  
  public Object getPropertyValue(String propertyName) {
  
  Object retValue = null;
  
  for(int i = ; i < ptm.getRowCount(); 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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.