亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用Java制作屬性編輯器

2019-11-18 13:29:30
字體:
來源:轉載
供稿:網友

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


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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲视频一区| 国产精品最新在线观看| 成人性生交大片免费观看嘿嘿视频| 2019中文字幕在线免费观看| 国产日产久久高清欧美一区| 国产精品亚洲自拍| 国产精品美女999| 亚洲国产精品va在线观看黑人| 97成人精品区在线播放| 国产日本欧美一区| 亚洲视频电影图片偷拍一区| 91精品综合久久久久久五月天| 久久躁日日躁aaaaxxxx| 久久99亚洲精品| 精品久久久999| 色综合久久悠悠| 亚洲综合一区二区不卡| 97久久超碰福利国产精品…| 国产99久久精品一区二区 夜夜躁日日躁| 日韩av在线免费| 色在人av网站天堂精品| 欧美剧在线观看| 久久精品中文字幕电影| 97国产在线视频| 欧美视频在线观看免费| 国产精品美女无圣光视频| 国产欧美久久一区二区| 亚洲第一福利网站| 亚洲精品美女网站| 久久精品一区中文字幕| 欧美日韩黄色大片| 精品视频www| 欧美在线一区二区视频| 国产精品91在线| 一本色道久久综合狠狠躁篇的优点| 国产精品久久久久久久久久久久久| 亚洲天堂男人天堂女人天堂| 久久中文久久字幕| 在线成人一区二区| 中文字幕精品久久| 国产精品视频午夜| 超在线视频97| 欧美成人精品三级在线观看| 日本精品久久电影| 国内精品久久久久久影视8| 一本大道香蕉久在线播放29| 色婷婷**av毛片一区| 欧美黑人xxxx| 国产午夜精品美女视频明星a级| 一区二区三区回区在观看免费视频| 欧美中文字幕在线| 国产精品视频一区二区三区四| 欧美成人午夜影院| 97超碰国产精品女人人人爽| 日韩中文字幕精品视频| 国产精品免费小视频| 日日狠狠久久偷偷四色综合免费| 欧美成人在线免费视频| 日韩视频在线一区| 精品久久久一区| 久热爱精品视频线路一| 成人亚洲欧美一区二区三区| 国产成人精品免费视频| 亚洲第一免费播放区| 国产偷国产偷亚洲清高网站| 日韩欧美亚洲综合| 亚洲va欧美va国产综合剧情| 日韩亚洲综合在线| 在线观看欧美视频| 日韩久久午夜影院| 欧美国产日韩在线| 久久久噜久噜久久综合| 97国产真实伦对白精彩视频8| 亚洲女人天堂视频| 亚洲a∨日韩av高清在线观看| 国色天香2019中文字幕在线观看| 成人av资源在线播放| 欧美成人精品影院| 成人有码在线视频| 亚洲最大激情中文字幕| 97视频在线观看免费高清完整版在线观看| 中文字幕欧美专区| 久久久久中文字幕| 欧亚精品在线观看| 亚洲毛片在线看| 久久久久这里只有精品| 色香阁99久久精品久久久| 91精品视频大全| 一本色道久久88综合亚洲精品ⅰ| www.亚洲成人| 日韩在线高清视频| 日本一区二区三区四区视频| 欧美国产日本高清在线| 日韩中文字幕欧美| 欧美日韩亚洲成人| 欧美区在线播放| 国产精品∨欧美精品v日韩精品| 亚洲综合最新在线| 亚洲午夜久久久久久久| 欧美日韩裸体免费视频| 欧美福利在线观看| 欧美视频一二三| 久久亚洲一区二区三区四区五区高| 亚洲另类激情图| 欧美精品在线观看91| 国产精品丝袜白浆摸在线| 亚洲欧美一区二区精品久久久| 精品美女国产在线| 欧美电影《睫毛膏》| 国产精品va在线播放我和闺蜜| 成人黄色免费网站在线观看| 另类专区欧美制服同性| 美日韩精品视频免费看| 国产成人高清激情视频在线观看| 久久精品国产亚洲一区二区| 成人免费在线视频网址| 日韩一级黄色av| 久久精品国产亚洲7777| 成人乱人伦精品视频在线观看| 国产97在线观看| 亚洲国产精品va在线| 国产精品久久久久久久久久久新郎| 中文字幕久精品免费视频| 精品美女久久久久久免费| 久久天天躁夜夜躁狠狠躁2022| 欧美激情第99页| 91美女福利视频高清| 国产成人亚洲综合青青| 欧美日韩在线影院| 亚洲一区二区三区xxx视频| 91黑丝在线观看| 欧美性生活大片免费观看网址| 激情懂色av一区av二区av| 超碰91人人草人人干| 97婷婷涩涩精品一区| 国产国语videosex另类| 欧美理论电影网| 日韩免费在线观看视频| 91免费精品国偷自产在线| 91免费在线视频网站| 久久综合久久八八| 国内揄拍国内精品少妇国语| 中文字幕无线精品亚洲乱码一区| 国产精品一区电影| 国模叶桐国产精品一区| 久久精品国产欧美激情| 欧美做爰性生交视频| 97视频免费看| 午夜精品久久久久久久99热浪潮| 欧美日韩国产色| 亚洲www在线观看| 亚洲奶大毛多的老太婆| 91tv亚洲精品香蕉国产一区7ujn| 91精品国产成人www| 日韩精品视频在线免费观看| 欧美激情视频在线观看| 国产成人久久精品| 日韩高清av一区二区三区| 日韩av在线最新| 97精品视频在线观看| 亚洲人免费视频| 欧美第一黄网免费网站| 午夜精品福利视频| 91精品国产免费久久久久久|