程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java實現數據驅動的命令用戶界面

Java實現數據驅動的命令用戶界面

編輯:關於JAVA

摘 要: 本文提出並實現了一種數據驅動的命令界面生成方案,以一致的方式生成所有命令的界面元素,能方便靈活地適應命令的修改變化。

關鍵詞: 數據驅動;命令; Java

在典型的企業應用軟件中,應用一般會提供一組命令作為用戶與應用程序之間的接口。隨著企業需求的變化和技術的發展,要求對原來的命令需要做出調整,比如增加命令,修改命令參數等,這可能需要修改應用程序,以生成調整後的命令界面。本文提出並實現了一種數據驅動的命令界面生成方案,該方案以一致的方式來處理所有命令,最大限度地保證命令的增加、刪除、修改,不需要或很少需要修改應用程序。

1 數據驅動方案的提出和思想

通常情況下,應用程序根據自己的業務邏輯進行界面設計,對於一條具體的命令,開發人員需要編寫界面生成代碼以生成該命令的界面元素,如菜單項、參數輸入對話框等.在應用的命令數量不大時,這是比較直接的做法.但當應用包含有成百上千條命令時,還要逐一地為每條命令生成界面元素,無疑是件繁瑣的事情。此外,隨著應用的升級,可能要求對原有的命令系統做出修改,這又要求修改代碼以生成修改後的命令界面元素。我們希望能有一種實現方法可以方便靈活生成命令的界面元素並適應命令將來調整的需要,而對我們程序的影響最小。

考察應用的所有命令可發現,雖然各命令的功能意義不同,但命令組成形式卻有很大的相似性,都包括命令標識和零個或多個參數,而且為每條命令編寫的界面生成代碼也非常近似。因此我們可以以一種統一的方法來處理所有命令。數據驅動的命令界面生成方案的主要思想正基於此,以某種方式對應用的所有命令統一進行描述,通過描述數據來驅動所有命令的界面元素生成。本文使用數據庫表完成對所有命令的原始描述。

參數的性質是通過其數據類型來反映的,只需根據實際應用,定義本應用中參數可能的各種數據類型.而數據類型的種類總是有限的,通過對每一種數據類型給出其處理辦法,就可以實現對為數眾多的參數的處理轉為對有限種的數據類型的處理。

2 命令的數據庫表描述

以數據庫表中對命令的描述為出發點,以後命令的增加、刪除、修改及命令參數的變動只需修改描述表中的相關項.命令一般包括命令標識和參數,但為更有效地對命令進行組織管理和適應更復雜應用的需要,對命令的描述通過定義命令類型描述表、命令描述表、命令參數描述表、枚舉描述表四級結構來完成.命令類型字段和命令字段聯合確定一條唯一的命令,提供直觀的名字字符和數值編碼兩種方式以適應不同需要。參數表中定義了參數類型和取值要求,枚舉表是為特殊的參數類型設置的,其取值是在一些選擇項中選取。各級表除了給出本表定義對象的基本屬性外,如果有下級元素,還給出了下級元素的個數及其在下級表中的位置,通過這種方式將一條命令的各構成部分關聯起來.下面給出這種表結構的一個簡單示例。

· 命令類型描述表:描述命令的分類.

唯一標志 編號 名字 命令的個數 命令描述位置 ct_00010 248 系統管理類 2 c_00010

表1 命令類型描述

· 命令描述表: 描述具體命令

唯一標志 編號 名字 參數的個數 參數描述位置 c_00010 1 系統聯絡請求 1 p_00010 c_00011 2 系統復位 0  

表2 命令描述表

· 命令參數描述表: 描述各命令的參數.參數的值是在用戶調用命令時設定的,事先無法確定.我們只是對參數的性質做出一些約束。數據類型的種類視具體應用而定,應用可以為每種類型指定一數值編號,在表中填寫參數數據類型的編號值。參數的最大值最小值給出了參數的取值范圍或長度限制。

唯一標志 名字 數據類型 最大值 最小值 枚舉的個數 枚舉描述位置 p_00010 是否要求響應 9     2 e_00010 p_00020 源文件名 13 32   0  

表3 命令參數描述表

· 枚舉描述表:給出枚舉類型參數的枚舉項

唯一標志 枚舉名 枚舉值 e_00010 要求響應 1 e_00011 不要求響應 0

表4:枚舉描述表

以上表1只表4的內容僅提供一般性的示范,實際應用可根據業務邏輯的需要定義自己的命令內容,命令的規模不受限制.

3 數據驅動方案的Java語言實現

3.1 命令的內存結構

為了在程序中反映命令結構,定義CmdType、Cmd、CmdField、Enum四個類分別與數據庫中的命令類型描述表、命令描述表、命令參數描述表、枚舉描述表相對應.每個類包含與其對應表中各列所描述的屬性,表的記錄在讀表到內存時表現為類的實例。下面以其中的一個類CmdType來說明.

public class CmdType{
public String key;
public short code;
public String name;
public short childCount;
public String childPointer;
public Cmd[] cmds;
public Cmd[] getCmds() throws IOException {
… /* implementation code */
}
}

在CmdType類中,從key到 childPointer之間的屬性與命令類型描述表中唯一標志到命令描述位置的各列對應,數組cmds[]表示該命令類型所包含的命令,可由getCmds方法訪問數據庫得到。其他三個類的定義與CmdType相似,因Enum類已經是命令結構的最後一級,故不提供得到下一級對象的方法。

應用程序啟動時訪問數據庫的命令類型描述表以獲得命令結構層次中的第一級對象,結果保存在cmdTypes數組中。可以根據應用對內存和速度的要求決定是否需要讀下一級表數據到內存。

3.2 界面元素的生成

應用程序可以為用戶提供多種方式來調用命令,例如下拉菜單、彈出式菜單、樹型菜單、命令行、圖形浏覽菜單等。創建這些界面元素只需根據內存中命令的數據結構,其內容包含在從數據庫中讀出的cmdTypes數組對象中。其中命令行方式在界面創建時不需要用到命令的內存結構,但可以利用內存結構幫助用戶完成命令和參數輸入。

下面的代碼說明在Java語言下如何利用命令結構在界面上生成命令的樹型菜單,假設命令要添加於父節點father下。

DefaultMutableTreeNode node;
DefaultMutableTreeNode childnode;
for(int i = 0; i < cmdTypes.length; i++) {
node = new DefaultMutableTreeNode();
node.setUserObject(cmdTypes[i]);
node.setAllowsChildren(true);
father.add(node);
cmds = cmdTypes[i].getCmds();
if(cmds == null ) continue;
for(int j = 0;j<cmds.length;j++) {
childnode = new DefaultMutableTreeNode();
childnode.setUserObject(cmds[j]);
childnode.setAllowsChildren(false);
node.add( childnode );
}
}

可以看出,只需簡單使用兩重循環,就可為應用的所有命令在界面上生成命令導航樹。

下面說明如何為所有命令,實現一種通用一致的參數輸入方式.根據我們的命令結構組織方式,如果用戶選擇了某一Cmd節點,則其所需的參數在該Cmd對象的cmdFields數組中描述。對每一個參數,在界面上表現為一Label-Component對形式。Laber用於標識參數,Component組件供用戶輸入參數的實際值。每個參數在界面上占一行,按GridBagLayout布局加入到參數面板中.這部分代碼示例如下:

for (int i = 0; i < cmdFields.length; i++){
label = new JLabel(cmdFields[i].name);
…/*根據參數內容設置label的其他屬性,如label的提示信息tip等*/
gbc.anchor = GridBagConstraints.EAST;
gbc.gridwidth = GridBagConstraints.RELATIVE;
paraPanel.add( label,gbc);
gbc.anchor = GridBagConstraints.WEST;
gbc.gridwidth = GridBagConstraints.REMAINDER;
switch(cmdFields[i].type){
case 0:
component = new JTextField(16) /*不妨設參數類型為0時對應JTextField組件*/
…/*根據參數內容添加對組件的控制*/
paraPanel.add( component,gbc);
break;
case 1:
component = new JComboBox() /*假設參數類型為1時對應 JComboBox組件*/
…/*根據參數內容添加對組件的控制*/
paraPanel.add( component,gbc);
break;


case n:
…/* 添加類型為n時的組件*/
default:
…/*參數數據類型未定義*/
}
}

參數類型上的差異,在界面上表現為所添加的Component種類不同。我們只需為應用的每一種數據類型確定一種Component供用戶輸入.多數類型,在JTextField 組件下就能完成參數輸入,輸入的同時可以根據CmdField對象對其輸入范圍作出限定.我們的方案在設計時已經考慮到參數取值是枚舉的情況,對枚舉類型參數,其可能的取值項被添加到一個JList或JComboBox組件中。用戶也可以為自己的數據類型定制一個專用的輸入組件。一個應用程序到底設有哪些數據類型,可視具體應用情況而定.簡單的情況提供字串值和二進制值兩種類型就可以完成所有輸入。更一般的情況可包括常用的整數類型、浮點類型、時間類型等。我們的方案不直接支持復雜的構造類型,一個構造類型的參數可視為由其包含的多個基本類型參數組成。

4 結束語

數據驅動的命令界面生成方案充分考慮了命令間的相似性,以一致的方式生成所有命令的界面元素,具有更好的伸縮性和擴展性.本方案非常有利於大規模命令的實現並能方便地適應命令的修改變化。本方案同時也有利於用戶界面和業務邏輯分離.命令可以由對命令功能含義非常熟悉的業務人員來定義,而界面設計人員可以在對命令毫無所知的情況下根據業務人員提供的命令描述在界面上生成所需要的命令界面元素。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved