国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

用Java制作屬性編輯器

2019-11-18 13:29:30
字體:
供稿:網(wǎng)友

  作者長期從事網(wǎng)管軟件的開發(fā)工作,網(wǎng)絡(luò)設(shè)備的配置治理模塊,需要對網(wǎng)絡(luò)設(shè)備的大量參數(shù)進行配置工作,設(shè)計、開發(fā)配置治理模塊的界面成為整個網(wǎng)管系統(tǒng)的難點,尤其是用java語言開發(fā)時,需要編制大量的界面布局、事件處理等代碼,網(wǎng)管軟件開發(fā)的主要工作量就集中在此。制作一個類似于Delphi、JBuilder等可視化開發(fā)工具的對象查看器的參數(shù)配置控件用于項目的優(yōu)點是顯而易見的:
  1、界面顯得很專業(yè);
  2、輕易做到使整個系統(tǒng)的風(fēng)格趨于一致;
  3、使用靈活,代碼量大大減小;
  4、……
  最終的使用效果如下圖所示:
   用Java制作屬性編輯器(圖一)


  作者本人把它稱為屬性編輯器,它的主要特征是:是一個兩列多行的表格,第一列用來顯示屬性名稱,第二列用來顯示和編輯屬性值;屬性值的顯示和編輯可以有多種方式,如文本框輸入、下拉框選擇、組合框選擇、自定義的彈出式對話框等;當(dāng)屬性被編輯后,可以向感愛好的對象發(fā)出通知。
  下面就屬性編輯器的設(shè)計思路和編制過程進行具體的解釋說明。
  設(shè)計思路
  根據(jù)屬性編輯器的主要界面特征,選擇JTable作為編輯器的基類。JTable是Swing中最復(fù)雜的組件之一,它主要被用來顯示數(shù)據(jù)行和數(shù)據(jù)列,它可以為每個數(shù)據(jù)單元分別提供繪制器和編輯器,是典型的MVC(模型Model、視圖View、控制Control)模式的實現(xiàn)者。
  設(shè)計屬性編輯器為一個兩列的JTable,每一行數(shù)據(jù)的第一列存放不重復(fù)的字符串,作為屬性的名稱;第二列保存Object對象,根據(jù)其具體數(shù)據(jù)類型,設(shè)置其單元繪制器和單元編輯器,一般單元繪制器用系統(tǒng)默認的JLabel即可,而單元編輯器則必須提供定制的控件,如對字符串型數(shù)據(jù),用JTextField或者JComboBox;對布爾型數(shù)據(jù),用JCheckBox;對非凡類型,可以提供JDialog,對話框的主要界面可以由使用本屬性編輯器的程序員自行定制。
  屬性編輯器還要提供相關(guān)接口,如屬性值是否只讀;屬性值變化時必須通知監(jiān)聽者;等等;
  屬性編輯器的具體設(shè)計,請參見下圖,限于篇幅,該圖只簡單列舉了幾個主要的類之間的關(guān)系和一些重要的變量和方法:
  用Java制作屬性編輯器(圖二)
  屬性編輯器的制作過程
  
  屬性編輯器是從JTable上繼續(xù)下來的,必須給它定義一個DefaultTableModel的子類,用來作為屬性編輯器的數(shù)據(jù)模型,存放屬性名和屬性值,因為它只在屬性編輯器內(nèi)部使用,所以可以定義為屬性編輯器的內(nèi)部類:
  
  public class PRopertyEditor extends JTable {
  
  protected class PropertyEditorModel extends DefaultTableModel{
  
  public PropertyEditorModel() {
  
  super(0, 2); // 只有兩個列
  
  }
  
  public String getColumnName(int col) {
  
  return " "; // 不需要列標(biāo)題
  
  }
  
  public boolean isCellEditable(int row, int col) {
  
  if(col == 0)
  
  return false; // 第一列是屬性名,不可編輯
  
  else
  
  // 屬性值是否可編輯要看用戶指定的情況
  
  return ((Boolean)propertyEditable.get(this.getValueAt(row, 0))).booleanValue();
  
  }
  
  }
  
  }
  
  要實現(xiàn)定制的單元繪制器和編輯器,必須覆蓋JTable的getCellEditor和getCellRenderer方法,那些已經(jīng)做好的繪制器、編輯器和該屬性值是否答應(yīng)編輯都可以根據(jù)屬性名保存在Hashtable里,需要的時候根據(jù)屬性名取出來:
  
  /**
  
  * 每一個屬性項都對應(yīng)一個單元編輯器,用Hashtable來保存這些編輯器
  
  */
  
  protected Hashtable propertyEditors = new Hashtable(10);
  
  /**
  
  * 每一個屬性項都對應(yīng)一個單元渲染器
  
  */
  
  protected Hashtable propertyRenderers = new Hashtable(10);
  
  /**
  
  * 屬性是否可編輯
  
  */
  
  protected Hashtable propertyEditable = new Hashtable(10);
  
  
  /**
  
  * 獲取指定單元格的編輯器
  
  * @param row 行
  
  * @param col 列
  
  */
  
  public TableCellEditor getCellEditor(int row, int col) {
  
  TableCellEditor editor = null;
  
  if(col == 1) { // 屬性值列才需要編輯器。這個判定條件不要也可,效率會低一點。
  
  editor = (TableCellEditor)propertyEditors.get(this.getValueAt(row, 0));
  
  }
  
  if(editor == null) { // 沒找到編輯器,則用系統(tǒng)默認的。
  
  editor = super.getCellEditor(row, col);
  
  }
  
  return editor;
  
  }
  
  
  /**
  
  * 獲取指定單元格的渲染器
  
  */
  
  public TableCellRenderer getCellRenderer(int row, int col) {
  
  TableCellRenderer renderer = null;
  
  if(col == 1) {
  
  renderer = (TableCellRenderer)propertyRenderers.get(this.getValueAt(row, 0));
  
  }
  
  if(renderer == null) {
  
  renderer = super.getCellRenderer(row, col);
  
  }
  
  // 給表格元素提供Hint提示
  
  if(renderer instanceof JComponent) {
  
  Object v = this.getModel().getValueAt(row, col);
  
  if(v == null) { // 屬性值有可能為空,則取屬性名;屬性名必不為空。
  
  v = this.getModel().getValueAt(row, 0);
  
  }
  
  ((JComponent)renderer).setToolTipText(v.toString());
  
  }
  
  return renderer;
  
  }
  
  
  如何確定哪個屬性用哪一種編輯器呢?可以根據(jù)用戶程序員傳入的參數(shù)來確定,對傳入的整數(shù)型數(shù)據(jù),則用LongCellEditor;字符串型的當(dāng)然用StringCellEditor了,其它依次類推。以整數(shù)型來舉例:
  
  /**
  
  * 在屬性表中增加整數(shù)屬性,答應(yīng)為空值,編輯器和渲染器為long型編輯器和渲染器。
  
  * 當(dāng)屬性值為空值時,必須寫成:
  
  * 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[2];
  
  row[0] = propertyName;
  
  row[1] = longNumObj;
  
  appendRow(row); // 往表格增加行
  
  propertyEditors.put(propertyName, longEditor); // 添加整型編輯器
  
  propertyRenderers.put(propertyName, longRenderer); // 添加整型繪制器
  
  propertyEditable.put(propertyName, new Boolean(true)); // 設(shè)置該屬性答應(yīng)編輯
  
  }
  
  
  給屬性編輯器加上get和set接口:
  
  /**
  
  * 根據(jù)屬性名得到屬性值
  
  * @param propertyName 屬性名
  
  */
  
  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;
  
  }
  
  
  /**
  
  * 設(shè)置屬性值
  
  * @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īng)完成了,下面以整數(shù)型的單元編輯器為例,簡單說明單元編輯器的制作方法,雙精度型和字符串型的和它類似,最復(fù)雜的用戶自定義對話框型的,留待讀者自己看源代碼吧(反正源代碼里面有具體的注釋的J)。
  
  /**
  
  * 創(chuàng)建并初始化long型數(shù)據(jù)的編輯器和渲染器
  
  */
  
  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("")

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 衡南县| 陈巴尔虎旗| 泸定县| 老河口市| 紫金县| 双鸭山市| 改则县| 上饶县| 北海市| 吉木萨尔县| 股票| 根河市| 鹤岗市| 南丰县| 绍兴县| 棋牌| 宁强县| 泰来县| 德江县| 金湖县| 平安县| 嘉鱼县| 定南县| 青岛市| 崇仁县| 枝江市| 丘北县| 阿鲁科尔沁旗| 武宣县| 水富县| 砚山县| 南康市| 临泉县| 滦南县| 略阳县| 佳木斯市| 奎屯市| 徐州市| 双城市| 涿鹿县| 徐水县|