第4章Swing設(shè)計思想_第1頁
第4章Swing設(shè)計思想_第2頁
第4章Swing設(shè)計思想_第3頁
第4章Swing設(shè)計思想_第4頁
第4章Swing設(shè)計思想_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第四章Swing界面設(shè)計課程目標JList控件JTree控件JTable控件課程定位JList控件及其應(yīng)用JList控件用于顯示對象列表的組件,并且允許用戶選擇列表中的一項或多項。JList與JCheckbox有些相似,都可以選擇其中的一個或多個選項,不同的是,JList的選取方式是整列選取。我們先來看看JList所提供的構(gòu)造函數(shù)。 JList提供了以下四個構(gòu)造函數(shù): JList() 建立一個新的JList控件 JList(ListModeldataModel) 利用ListModel建立一個新的JList控件 JList(Object[]listData) 利用Array(數(shù)組)對象建立一個新的JList控件 JList(VectorlistData) 利用Vector(矢量集)對象建立一個新的JList控件JList常用方法voidclearSelection() 清除已選中項。int[]getSelectedIndices() 獲得已選擇項的索引值。Object[]getSelectedValues() 獲得已選擇項的內(nèi)容。booleanisSelectedIndex(intindex) 判斷index位置上的項目是否被選中,并返回值。voidsetListData(Object[]listData) 設(shè)置創(chuàng)建列表框的數(shù)組對象。voidsetListData(VectorlistData) 設(shè)置創(chuàng)建列表框的矢量集對象。voidsetModel(ListModeldataModel)設(shè)置創(chuàng)建列表框的列表框模板。voidsetSelectionModel(ListSelectionModelmodel) 設(shè)置列表框的選擇方式,由ListSelectionModel提供3個靜態(tài)參數(shù):MULTIPLE_INTERVAL_SELECTIONSINGLE_INTERVAL_SELECTIONSINGLE_SELECTION允許隔項多選允許連續(xù)多選只允許單選示例

importjava.awt.*; importjava.awt.event.*; importjavax.swing.*; importjava.util.Vector; publicclassJListAppextendsJFrame{ publicJListApp(){ super("JList示例");

ContainercontentPane=this.getContentPane();

contentPane.setLayout(newGridLayout(1,2)); String[]s2={"喬丹","李翔","科比","姚明","丁俊輝","SKY","其他"}; Vectorv=newVector();

v.addElement("Nokia3310");

v.addElement("Nokia8850");

v.addElement("MotorolaV8088");

v.addElement("PanasonicGD92");

v.addElement("PanasonicGD93");

v.addElement("NECDB2100");

v.addElement("其他");

JListlist2=newJList(s2); list2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list2.setBorder(BorderFactory.createTitledBorder("您最喜歡哪個運動員呢?"));

JListlist3=newJList(v); list3.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); list3.setBorder(BorderFactory.createTitledBorder("您最喜歡哪一種手機?"));

contentPane.add(newJScrollPane(list2));

contentPane.add(newJScrollPane(list3));

this.pack();

this.show();

this.addWindowListener(new

WindowAdapter(){ publicvoidwindowClosing(WindowEvente){ System.exit(0); } }); } publicstaticvoidmain(String

args[]) { newJListApp(); } }JTree控件及其應(yīng)用顯示一組層次關(guān)系分明的數(shù)據(jù),用“樹狀圖”表示能提供給用戶一個直觀易用的界面JTree類實現(xiàn)類似Windows資源管理器左半部分的樹型層次結(jié)構(gòu)通過點擊樹型結(jié)構(gòu)的結(jié)點可以展開或合并樹狀結(jié)構(gòu)的圖表數(shù)據(jù)。JTree同樣是根據(jù)MVC設(shè)計思想設(shè)計出來的JTree的主要功能是把數(shù)據(jù)按照層次關(guān)系通過樹狀結(jié)構(gòu)顯示出來,其數(shù)據(jù)來源于其它對象,如Hashtable、Vector等。JTree的構(gòu)造函數(shù) JTree() 創(chuàng)建JTree組件。JTree(Hashtablevalue) 通過Hashtable對象創(chuàng)建一個JTree組件,不顯示根結(jié)點。JTree(Object[]value) 使用數(shù)組建立JTree組件,只有這個構(gòu)造函數(shù)可以創(chuàng)建多個根結(jié)點。JTree(TreeModelnewModel) 顯示根節(jié)點,使用指定的數(shù)據(jù)模型創(chuàng)建樹。JTree(TreeNoderoot) 使用TreeNode對象創(chuàng)建一個含有根接點的JTree組件。JTree(TreeNoderoot,booleanasksAllowsChildren) 通過TreeNode對象建立一個JTree組件,設(shè)置其是否允許添加子樹。JTree(Vectorvalue) 通過用Vector對象創(chuàng)建一個JTree組件。JTree控件的常用方法addSelectionRow(introw) 將指定行的路徑添加到當前選擇。cancelEditing() 取消當前編輯會話。clearSelection() 清除該選擇。TreeModelgetModel() 創(chuàng)建并返回一個TreeModel示例。TreePathgetSelectionPath() 返回首選節(jié)點的路徑。intgetSelectionCount() 返回選擇的節(jié)點數(shù)。int[]getSelectionRows() 返回所有當前選擇的行。intgetRowCount() 返回當前顯示的行數(shù)。booleanisEditable() 如果樹可編輯,則返回true。booleanisSelectionEmpty() 如果該選擇當前為空,則返回true。removeSelectionInterval(intindex0,intindex1) 從該選擇中移除index0和index1(包含)之間的節(jié)點。removeSelectionRow(introw) 從當前選擇移除索引row處的行。setEditable(booleanflag) 設(shè)置樹是否可編輯。setRowHeight(introwHeight) 設(shè)置每個單元格的高度(以像素為單位)。setSelectionRow(introw) 選擇顯示的指定行的節(jié)點。setVisibleRowCount(intnewCount) 設(shè)置要顯示的行數(shù)。JTree控件的創(chuàng)建通過Hashtabel、Vector或字符串數(shù)組對象為參數(shù),創(chuàng)建JTree對象。語句如下: String[]s1={"公司文件","個人信件","私人文件"}; Hashtablehashtable1=newHashtable(); hashtable1.put("我的公文包",s1); JTreetree=newJTree(hashtable1);

示例

importjava.awt.BorderLayout; importjavax.swing.*; importjavax.swing.event.*; importjavax.swing.tree.DefaultMutableTreeNode; publicclassJTreeEventAppextendsJFrameimplementsTreeSelectionListener{ publicJTreeEventApp(){ super("學生管理系統(tǒng)示意圖");

DefaultMutableTreeNodehome=newDefaultMutableTreeNode("學生管理系統(tǒng)");

DefaultMutableTreeNodestu1=newDefaultMutableTreeNode(new

UserInfo("張三","beijing",));

DefaultMutableTreeNodestu2=newDefaultMutableTreeNode(new

UserInfo("李四","shanghai",));

DefaultMutableTreeNodestu3=newDefaultMutableTreeNode(new

UserInfo("小剛","wuhan",)); home.add(stu1);home.add(stu2);home.add(stu3);

JTreetree=newJTree(home);

tree.addTreeSelectionListener(this);

JScrollPane

scrollPane=newJScrollPane(tree);

this.getContentPane().add(scrollPane,BorderLayout.CENTER);

this.pack();

this.setVisible(true);

this.show(); }

publicvoidvalueChanged(TreeSelectionEvente){

JTreetree=(JTree)e.getSource();

DefaultMutableTreeNodenode= (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();

if(node.isLeaf()){

UserInfouser=(UserInfo)node.getUserObject();

System.out.println("姓名為:"+user.getUsername()+ "地址為:"+user.getAddress()+"電話為:"+user.getPhone()); } } publicstaticvoidmain(String[]args){ newJTreeEventApp(); } } classUserInfo{ privateStringusername; privateStringaddress; privateStringphone;

UserInfo(Stringusername,Stringaddress,Stringphone){

this.username=username;

this.address=address;

this.phone=phone; } publicStringtoString(){ returnusername; } publicStringgetAddress(){ returnaddress; } publicStringgetPhone(){ returnphone; } publicStringgetUsername(){ returnusername; } }使用TreeModel構(gòu)造JTree通過TreeModel創(chuàng)建JTree對象時要用到一個重要的類:DefaultMutableTreeNode,這個類生成的對象是樹中的通用節(jié)點。要知道一個樹節(jié)點最多可以有一個父節(jié)點、0個或多個子節(jié)點。通過DefaultMutableTreeNode類,某個節(jié)點可以很方便的查找或修改父節(jié)點和子節(jié)點,同時能查找某個節(jié)點屬于哪個樹。 DefaultMutableTreeNode類的常用方法:add(MutableTreeNode

newChild)

將newChild添加到某節(jié)點的子數(shù)組的結(jié)尾,使其成為此節(jié)點的子節(jié)點。remove(int

childIndex)

從此節(jié)點的子節(jié)點中移除指定索引處的子節(jié)點,并將該節(jié)點的父節(jié)點設(shè)置為null。removeAllChildren()

通過將其父節(jié)點設(shè)置為null,移除此節(jié)點的所有子節(jié)點。JTable控件及應(yīng)用JTable是Swing包新增加的組件,主要功能是把數(shù)據(jù)以二維表格的形式顯示出來。使用表格最好先生成一個MyTableModel類型的對象來裝載數(shù)據(jù),這個類是從AbstractTableModel類中繼承而來的,其中有幾個方法是一定要重寫。例如getColumnCount()方法、getRowCount()方法、getColumnName()方法和getValueAt()方法。因為JTable會從這個對象中自動獲取表格顯示所必需的數(shù)據(jù),AbstractTableModel類封裝了表格(行、列)設(shè)置、內(nèi)容的填寫、賦值、表格單元更新的檢測等等,一切跟表格內(nèi)容有關(guān)的屬性及其操作。JTable類生成的對象以TableModel對象為參數(shù),并負責將TableModel對象中的數(shù)據(jù)以表格的形式顯示出來。JTable的構(gòu)造函數(shù)JTable() 構(gòu)造默認的JTable,使用默認的數(shù)據(jù)模型、列模型和選擇模型對其進行初始化JTable(intnumRows,intnumColumns) 使用DefaultTableModel構(gòu)造具有空單元格,包含numRows行和numColumns列的JTable。JTable(Object[][]rowData,Object[]columnNames) 構(gòu)造JTable,用來顯示二維數(shù)組rowData中的數(shù)據(jù),其列名稱為columnNames。JTable(TableModeldm) 構(gòu)造JTable,使用dm作為數(shù)據(jù)模型、默認的列模型和默認的選擇模型對其進行初始化。JTable(TableModeldm,TableColumnModelcm) 建立一個JTable,設(shè)置數(shù)據(jù)模式與字段模式,并有默認的選擇模式。JTable(TableModeldm,TableColumnModelcm,ListSelectionModelsm) 建立一個JTable,設(shè)置數(shù)據(jù)模式、字段模式、與選擇模式。JTable(VectorrowData,VectorcolumnNames) 構(gòu)造JTable,用來顯示Vector(rowData)中的值,其列名稱為columnNames。JTable的常用的方法addColumn(TableColumnaColumn) 將aColumn追加到此JTable的列模型所保持的列數(shù)組的結(jié)尾。removeColumn(TableColumnaColumn) 從此JTable的列數(shù)組中移除aColumn。getColumnCount() 返回列模型中的列數(shù)。getGridColor() 返回用來繪制網(wǎng)格線的顏色。getSelectedColumnCount() 返回選定的列數(shù)。getSelectedColumns() 返回所有選定列的索引。paramString() 返回此表的字符串表示形式。selectAll() 選擇表中的所有行、列及單元格。setSelectionMode(intselectionMode) 設(shè)置表的選擇模式為:允許單個選擇、單個連續(xù)單元格選擇或多個連續(xù)選擇中的一種setRowHeight(introwHeight) 將所有單元格的高度設(shè)置為rowHeight(以像素為單位)、重新驗證并重新繪制JTable JTable類所包含的方法還有很多,出于篇幅限制在此就不一一介紹了JTable控件的創(chuàng)建創(chuàng)建JTable對象有很多的方法,正如JTable有多個構(gòu)造函數(shù)一樣,下面我們通過JTable(Object[][]rowData,Object[]columnNames)這個構(gòu)造函數(shù)來創(chuàng)建一個簡單的JTable對象。 參考代碼如下: Object[][]data= { {"笨笨",newInteger(66), newInteger(32),newInteger(98),newBoolean(false), newBoolean(false) }, {"三毛",newInteger(85), newInteger(69),newInteger(154),newBoolean(true), newBoolean(false) },};String[]column={"姓名","語文","數(shù)學","總分",及格","作弊"};JTabletable=newJTable(data,column);此JTable對象代表了一個顯示學生成績的表單,將其添加到JFrame中去會顯示如圖所示的效果:我們可以把JTable添加到JScrollPane控件中。參考代碼如下: JScrollPanescrollPane=newJScrollPane(table);

使用Swing來構(gòu)造一個表格其實很簡單的,只要你利用Vector或Array作為我們表格的數(shù)據(jù)輸入對象,將Vector或Array的內(nèi)容填入到JTable中,一個基本的表格就產(chǎn)生了。利用DefaultTableModel創(chuàng)建JTable下面我們用DefaultTableModel對象構(gòu)造一個默認的JTable對象: DefaultTableModeltableModel=newDefaultTableModel(); tableModel.setDataVector(data,column); JTabletable=newJTable(tableModel); JScrollPanepane=newJScrollPane(table);視圖與模型機制一個好的用戶界面(GUI)設(shè)計通??梢栽诂F(xiàn)實世界找到相應(yīng)的原形。例如,我們可以設(shè)計出一個外觀跟鍵盤按鍵類似的按鈕。從這個簡單的按鈕,我們就可以看出一個GUI設(shè)計的規(guī)則,它由兩個主要的部分構(gòu)成:一部分包含按鈕具有的動作特性,如執(zhí)行被按下操作;另外一部分包含按鈕的外形表現(xiàn),如這個按鈕的背景A還是B等??辞宄@兩點你就發(fā)現(xiàn)了一個很有趣的設(shè)計方法,這種方法鼓勵重用(reuse),而不是重新設(shè)計(redesign)。你會發(fā)現(xiàn)按鈕都有相同的機理,所以我們沒必要為每個按鈕都設(shè)計一份圖紙,這樣太浪費時間。如果把上述設(shè)計思想應(yīng)用到軟件開發(fā)領(lǐng)域,它的優(yōu)越性將更為明顯。這就是我們將要講到的MVC設(shè)計模式,所謂MVC是一個在軟件開發(fā)領(lǐng)域應(yīng)用非常廣泛的技術(shù)視圖與模型機制Model/View/Controller(MVC),MVC便是基于這種思想的一個實現(xiàn)。MVC模式視圖與模型機制(MVC)簡介MVC首先是一種設(shè)計模式,它把一個軟件分解為三個不同的部分:Model、View、Controller。

Model: 代表組件狀態(tài)和低級行為的部分,它管理著自身的狀態(tài)并且處理所有對狀態(tài)的操作,Model自己本身并不知道使用自己的View和Controller,系統(tǒng)維護著它和View之間的關(guān)系,當Model發(fā)生了變化時,系統(tǒng)會通知相應(yīng)的View,使其做出響應(yīng)。View: 代表了管理Model所含有的數(shù)據(jù)的一個視覺上的呈現(xiàn)。一個Model可以有多個View,但是Swing中卻很少有這樣的情況。Controller: 管理Model和用戶之間的交互。當Model的狀態(tài)發(fā)生了變化時,Controller會提供一些方法去響應(yīng)這些變化。 盡管MVC設(shè)計模式通常是用來設(shè)計整個用戶界面(GUI)的,但是很多設(shè)計者們卻獨具創(chuàng)新的運用這種設(shè)計模式設(shè)計出了Swing中的單個組件(Component),例如表格JTable、樹JTree、組合下拉列表框JComboBox等等。這些組件都有一個Model,一個View,一個Controller,而且,這些Model、View、Controller可以獨立的改變,當組件正在被使用的時候也是如此。這種特性使得開發(fā)GUI界面顯得非常靈活。體會視圖與模型機制(MVC)一個按鈕的Model所應(yīng)該具備的行為,由一個ButtonModel接口來定義。一個按鈕model實例封裝了其內(nèi)部的狀態(tài),并且定義了按鈕的行為。它的所有方法可以分為四類:

查詢內(nèi)部狀態(tài) 操作內(nèi)部狀態(tài) 添加和刪除事件監(jiān)聽器 發(fā)生事件 程序員通常并不會直接和Model以及View/Controller打交道,因為Model、View以及Controller通常隱藏于那些繼承了java.awt.Component類的組件中,這些組件就像膠水一樣把MVC三者合為一體。一個程序員可以很方便的使用Swing組件和AWT組件。小結(jié)JList控件JTree控件JTable控件動手實踐:通訊錄使用高級控件編程通訊錄程序目標使用JTable控件實現(xiàn)一個通訊錄程序,通訊錄通過按鈕事件來實現(xiàn)記錄的添加、刪除、修改和查找等操作。 程序運行過程如下: 1.程序啟動后,運行結(jié)果如圖所示:添加記錄點擊“增加”按鈕,會彈出提示輸入姓名的“輸入”對話框,如圖所示:輸入要添加的姓名,例如“李強”,點擊“確定”按鈕后,還會繼續(xù)彈出提示輸入其他信息的對話框,如性別、年齡、住址等,依次輸入完畢后JTable控件中會顯示出用戶輸入的記錄信息,如圖所示:刪除記錄選中要刪除的一行記錄,如選擇姓名為“馬華”的這條記錄,后點擊“刪除”按鈕,會發(fā)現(xiàn)馬華這條記錄從JTable中刪除了。刪除后的程序運行效果如圖所示:查找記錄以姓名為關(guān)鍵字來進行查找操作,點擊“查找”按鈕后,會彈出查找對話框,在對話框的文本框中輸入要查找的姓名;例如輸入要查詢的姓名為“李強”,點擊對話框的“確定”按鈕后,如果存在該記錄,則會彈出查找記錄的消息對話框,如圖所示:信息提示如果查找記錄不存在,則彈出不存在該用戶的消息對話框,例如我們查找姓名為“方芳”的記錄(姓名為“方芳”的記錄不存在),顯示效果如圖所示:(1)導入程序所需要的類

importjava.awt.*; importjava.awt.event.*; importjava.util.Vector; importjava.util.*; importjavax.swing.*; importjavax.swing.event.*; importjavax.swing.table.*; importjava.awt.event.ActionListener; importjava.util.EventListener; importjavax.swing.event.ListSelectionListener;(2)事件代碼(2)新建一個繼承JFrame的類并實現(xiàn)ActionListener和ListSelectionListener接口,設(shè)計程序的框架,參考代碼如下:

publicclassMessageListAppextendsJFrameimplementsActionListener,ListSelectionListener{ //定義程序要用到的全局對象

publicMessageListApp(){ super("通訊錄");

this.addItem();

this.pack();

this.show(); } publicvoidaddItem(){ //自定義一個添加組件的方法并初始化JTable數(shù)據(jù),注冊事件

} publicvoidvalueChanged(ListSelectionEvente){ //此處事件的方法中只需要獲得用戶選擇的行數(shù)目即可

this.selectRow=this.table.getSelectedRow(); } publicvoideditRow(int

addOrupdate){ //自定義一個方法用來編輯行的數(shù)據(jù),添加或者修改

} publicvoidselectData(){ //自定義的一個方法用來顯示查找的結(jié)果

} publicvoidactionPerformed(ActionEvente){ //處理按鈕的點擊事件

} publicstaticvoidmain(String

args[]){ newMessageListApp(); } }(3)界面主體設(shè)計(3)定義本通訊錄的全局對象;JTabletable;

DefaultTableModel

defaultModel;//用來構(gòu)造JTable

ListSelectionModel

selectionMode;//用來注冊事件的ListSelectionModel

JScrollPane

scrollPane; //存放JTable

JPanelpanel; //存放四個操作按鈕的面板

JButtonbutton; //用來進行操作的按鈕

int

selectRow=0;//保存選擇列的變量以對該列進行操作,默認是第一列 (4)添加組件的方法并初始化JTable數(shù)據(jù),注冊事件;

publicvoidaddItem(){ String[]name={"姓名","性別","年齡","住址","聯(lián)系方式"}; //初始數(shù)據(jù)

Stringdata[][]= { {"張三","男","30","北京",}, {"馬六","男","25","上海","156784593456"}, {"馬華","女","23","哈爾濱",}, {"Jone","男","24","青島",} };

defaultModel=newDefaultTableModel(data,name); table=newJTable(defaultModel);

table.setPreferredScrollableViewportSize(newDimension(400,80));

selectionMode=table.getSelectionModel();

selectionMode.addListSelectionListener(this);

scrollPane=newJScrollPane(table);panel=newJPanel();button=newJButton("增加");

panel.add(button);

button.addActionListener(this);button=newJButton("刪除");

panel.add(button);

button.addActionListener(this);button=newJButton("修改");

panel.add(button);button.addActionListener(this);button=newJButton("查找");

panel.add(button);

button.addActionListener(this);ContainercontentPane=this.getContentPane();

contentPane.add(scrollPane,BorderLayout.CENTER);

contentPane.add(panel,BorderLayout.SOUTH); }(5)行編輯(5)實現(xiàn)定義的editRow()方法用來對每行數(shù)據(jù)進行編輯,如添加、修改等;

publicvoideditRow(int

addOrupdate){ //如果是修改,則先刪除該記錄,之后再新添一條

if(addOrupdate>=0){

defaultModel.removeRow(addOrupdate); } Strings[]=newString[5]; s[0]=JOptionPane.showInputDialog(this,"請輸入姓名:"); s[1]=JOptionPane.showInputDialog(this,"請輸入性別

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論