




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
11.1圖形用戶界面核心概念11.2容器與布局管理11.3常用GUI標準組件11.4鼠標和鍵盤事件第11章
圖形用戶界面編程根底11.1圖形用戶界面核心概念容器---可以容納GUI部件〔按某種布局〕----窗體、面板部件---部署在容器中,實現(xiàn)某種交互。----文本框、按紐、標簽等GUI部件
?第1步創(chuàng)立窗體方法1:
Framef=newFrame("標題"〕方法2:classMyFrameextendsFrame….Framef=newMyFrame("標題"〕讓窗體可見f.setSize(200,300);f.setVisible(true);?第2步創(chuàng)立GUI部件創(chuàng)立按鈕、標簽Buttonb=newButton(“計數(shù)”);Labeldis=newLabel(“…0…”);…0…布局設(shè)置
setLayout(newFlowLayout())參加部件add(b〕;add(dis〕;?第3步將部件參加窗體容器…0…?
第4步
處理事件事件處理
------委托事件處理模型----委托給事件監(jiān)聽者事件監(jiān)聽者---處理事件----符合相應(yīng)接口要求事件源----發(fā)生事件單擊事件委托處理—圖button.addActionListener(ActionListenera);
12單擊3〔1〕事件源對象的容器類作為監(jiān)聽者addActionListener(this);〔2〕用內(nèi)嵌類實現(xiàn)addActionListener(newProcess());?誰作為監(jiān)聽者適宜?---要其actionPerformed中方便訪問事件處理相關(guān)對象〔3〕用匿名內(nèi)嵌類實現(xiàn)addActionListener(newActionListener(){…..});表11-1AWT事件接口及處理方法描述信息接口名稱方法(事件)點擊按鈕、點擊菜單項、文本框按回車等動作ActionListeneractionPerformed(ActionEvent)選擇了可選項的項目ItemListeneritemStateChanged(ItemEvent)文本部件內(nèi)容改變TextListenertextValueChanged(TextEvent)移動了滾動條等部件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠標移動MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠標點擊等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)鍵盤輸入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)部件收到或失去焦點FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)部件移動、縮放、顯示/隱藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)窗口事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)容器增加/刪除部件ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)?
區(qū)分事件源
編寫一個窗體應(yīng)用程序,在窗體中安排兩個文本框,一個標簽,兩個標記為“+”和“*”的按鈕,從兩個文本框輸入兩個數(shù),點擊“+”按鈕將文本框中兩個數(shù)進行加法運算,結(jié)果顯示在標簽中;點擊“*”按鈕將文本框中兩個數(shù)進行減法運算,結(jié)果顯示在標簽中。?
在動作事件處理代碼中區(qū)分事件源
getSource()
用來獲取事件源對象。
getActionCommand()結(jié)果為字符串,用來獲取按鈕事件對象的命令名
---ActionEvent對象提供方法?
關(guān)鍵代碼publicvoidactionPerformed(ActionEvente){intx1=Integer.parseInt(f1.getText());intx2=Integer.parseInt(f2.getText());if(e.getActionCommand().equals(“+”))
res.setText(""+(x1+x2));elseres.setText(""+(x1*x2));}?
或者publicvoidactionPerformed(ActionEvente){intx1=Integer.parseInt(f1.getText());intx2=Integer.parseInt(f2.getText());if(e.getSource()==b1)
res.setText(""+(x1+x2));elseres.setText(""+(x1*x2));}假設(shè),將b1定為實例變量b1=newButton(“+”);?關(guān)于事件適配器類
Java中為那些具有多個方法的監(jiān)聽者接口提供了事件適配器類,這個類通常命名為XxxAdapter,在該類中以空方法體實現(xiàn)了相應(yīng)接口的所有方法程序員設(shè)計可通過繼承適配器類來編寫監(jiān)聽者類,在類中只需給出關(guān)心的方法。
例11-2處理窗體的關(guān)閉classMyFrameextendsFrameimplementsActionListener{
public
MyFrame(){
super(“測試窗體關(guān)閉");
Buttonbtn=newButton("關(guān)閉");
setLayout(newFlowLayout());
add(btn);
btn.addActionListener(this);
addWindowListener(newcloseWin());
setSize(300,200);
setVisible(true);}
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("關(guān)閉")){
dispose();
}
}
}classcloseWinextendsWindowAdapter{
publicvoidwindowClosing(WindowEvente){
Windoww=e.getWindow();
w.dispose();
}
}只要寫自己關(guān)心的方法?工程
1.編寫一個窗體應(yīng)用,窗體中安排1個按鈕,點擊按鈕讓按鈕的背景顏色隨機變化。2.設(shè)有一批英文單詞存放在一個數(shù)組中,編制一個圖形界面程序瀏覽單詞。在界面中安排一個標簽顯示單詞,另有“上一個”、“下一個”兩個按鈕實現(xiàn)單詞的前后翻動。FlowLayout(流式布局)
BorderLayout(邊緣或方位布局)
GridLayout(網(wǎng)格布局)
CardLayout(卡片式布局)
GridBagLayout(網(wǎng)格塊布局)
11.2容器與布局管理11.2.1FlowLayout(流式布局)
---是Panel的默認布局
從上到下、左到右排放,放不下再換至下一行
-----不會改變控件的大小。
按照參數(shù)要求安排部件間的縱橫間隔和對齊方式
publicFlowLayout()居中對齊方式,組件縱橫間隔5個像素。publicFlowLayout(intalign,inthgap,intvgap)3個參數(shù)分別指定對齊方式、縱、橫間距publicFlowLayout(intalign)
參數(shù)規(guī)定對齊方式,組件縱橫間距默認5個像素。【例11-3】大小不斷遞增的9個按鈕放入窗體中
publicFlowLayoutExample(){ setLayout(newFlowLayout(FlowLayout.LEFT,10,10)); Stringspaces=“”;//用來使按鈕的大小變化 for(inti=1;i<=9;i++){ add(newButton(“B#”+i+spaces)); spaces+=“”; } }放大窗體后11.2.2BorderLayout(邊緣或方位布局)
---是Frame的默認布局將容器內(nèi)部空間分為東〔East〕、南〔South〕、西〔West〕、北〔North〕、中〔Center〕五個區(qū)域控件的大小隨容器大小改變。
按照參數(shù)要求安排部件間的縱橫間隔和對齊方式
publicBorderLayout〔〕各組件之間的縱橫間距為0publicBorderLayout(inthgap,intvgap)2個參數(shù)分別指定縱、橫間距參加組件add(方位名字符串,組件)
String[]borders={"North","East","South","West","Center"};
setLayout(newBorderLayout(10,10));
for(inti=0;i<5;i++){
add(borders[i],newButton(borders[i]));
}
【例
11-4】實現(xiàn)一個簡單的圖像瀏覽器,部署“上一張”、“下一張”兩個按鈕,單擊按鈕可前后翻閱圖片。importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassShowAnimatorextendsAppletimplementsActionListener{Image[]m_Images; //保存圖片序列的Image數(shù)組inttotalImages=18;//圖片序列中的圖片總數(shù)為18intpos=0;//當(dāng)前顯示圖片的序號Buttonb1,b2;publicvoidinit(){m_Images=newImage[totalImages];for(inti=0;i<totalImages;i++)m_Images[i]=getImage(getDocumentBase(),"images\\img00"+(i+1)+".gif");Buttonb1=newButton("上一張");Buttonb2=newButton("下一張");setLayout(newBorderLayout());Paneloperate=newPanel();operate.setLayout(newFlowLayout(FlowLayout.CENTER));operate.add(b1);operate.add(b2);add("South",operate); //操作控制面板安排在底部b1.addActionListener(this);b2.addActionListener(this);}publicvoidpaint(Graphicsg){g.drawImage(m_Images[pos],10,10,this);//顯示當(dāng)前圖片}publicvoidactionPerformed(ActionEvente){if(e.getSource()==b1) //區(qū)分事件源{if(pos>0)pos=--pos; //上一張}else
pos=++pos%totalImages; //下一張repaint();}}11.2.3GridLayout布局
把容器的空間分為假設(shè)干行乘假設(shè)干列的網(wǎng)格區(qū)域組件按從左向右,從上到下的次序被加到各單元格中組件的大小將調(diào)整為與單元格大小相同。?
GridLayout構(gòu)造方法publicGridLayout()
所有組件在一行中。
publicGridLayout(introws,intcols)通過參數(shù)指定布局的行和列數(shù)。
publicGridLayout(introws,intcols,inthgaps,intvgaps)指定劃分的行列數(shù)以及組件間的水平和垂直間距。add(組件名)
?GridLayout布局—參加組件
setLayout(newGridLayout(3,3,10,10));
for(inti=1;i<=9;i++)
add(newButton("Button#"+i));【例11-3】布局修改
思考:如何布局?11.2.4CardLayout布局
參加的部件疊成卡片的形式組件參加add(字符串,組件名)其中,字符串用來標識卡片名稱。構(gòu)造方法publicCardLayout()
顯示組件將占滿整個容器,不留邊界。
publicCardLayout(inthgap,intvgap)容器邊界分別留出水平和垂直間隔,組件占中央。?
CardLayout布局---卡片翻動show(容器,字符串):顯示指定名稱的卡片
first(容器)
:顯示第一塊卡片
last(容器)
:顯示最后一塊卡片next(容器)
:顯示下一塊卡片11.3常用GUI部件?Component類(抽象類〕ColorgetBackground():
獲取部件的背景色FontgetFont():
獲取部件的顯示字體GraphicsgetGraphics():獲取部件的Graphics屬性對象voidrepaint(intx,inty,intwidth,intheight):對部件的特定區(qū)域進行重新繪圖voidsetBackground(Colorc):設(shè)置部件的背景voidsetEnabled(booleanb):
是否讓部件功能有效voidsetFont(Fontf):
設(shè)置部件的顯示字體voidsetSize(intwidth,intheight):
設(shè)置部件大小voidsetVisible(booleanb):
設(shè)置部件是否可見voidsetForeground(Colorc):
設(shè)置部件的前景色voidrequestFocus():讓部件得到焦點voidadd(PopupMenupopup):給部件參加彈出菜單1.文本框只能編輯一行數(shù)據(jù)構(gòu)造方法有四種:
TextField():構(gòu)造一個單行文本輸入框。
TextField(int):指定長度的單行文本輸入框。TextField(String):指定初始內(nèi)容的單行文本輸入框。
TextField(String,int):指定長度、指定初始內(nèi)容。
tf1=newTextField();
tf2=newTextField("",20);
tf3=newTextField("Hello!");
tf4=newTextField("Hello",30);
11.3.2文本框與文本域2.文本域(TextArea)特點1:可以編輯多行文字
構(gòu)造方法有四種:
TextArea():構(gòu)造一個文本域。
TextArea(int,int):構(gòu)造一個指定長度和寬度的文本域。TextArea(String):構(gòu)造一個顯示指定文字的文本域。TextArea(String,int,int):按指定長度、寬度和默認值構(gòu)造文本域。常用方法:setEchoChar(‘*’)
設(shè)置回顯字符
getText()
:獲取輸入框中的數(shù)據(jù)
setText()
:往輸入框?qū)懭霐?shù)據(jù)isEditable():判斷輸入框是否可編輯。
voidselect(intstart,intend):選定由開始和結(jié)束位置指定的文本。voidselectAll():選定所有文本。3.文本部件的常用方法以下方法只限于文本域append(Strings):將字符串添加到文本域的末尾insert(Strings,intindex):將字符串插入到文本域的指定位置4.文本框(TextField)---事件
ActionEvent事件----在文本框按回車鍵時引發(fā)注冊:addActionListener();接口:ActionListener
方法:publicvoidactionPerformed(ActionEvente)
TextEvent事件---對文本輸入部件數(shù)據(jù)更改操作
〔添加、修改、刪除〕注冊:addTextListener()接口:TextListener方法:publicvoidtextValueChanged(TextEvente)?
練習(xí):驗證密碼域只能輸入數(shù)字字符
publicvoidtextValueChanged(TextEvente){
Strings=pass.getText();
charlast=s.charAt(s.length()-1);
if(!Character.isDigit(last)){
hint.setText("只能是數(shù)字,重輸:");
pass.setText("");
}
}
【例11-7】在圖形界面中,安排一個文本框和文本域。將文本框鍵入的字符同時顯示在文本域中,也既同步顯示。
importjava.applet.*;importjava.awt.*;importjava.awt.event.*;publicclassTextInextendsFrameimplementsTextListener,ActionListener{TextFieldtf;TextAreata;Stringpre=""; //記錄文本域的先前內(nèi)容publicvoidTextIn(){tf=newTextField(20);ta=newTextArea(8,20);add(tf);add(ta);
tf.addTextListener(this); tf.addActionListener(this);}publicvoidtextValueChanged(TextEvente){Strings=tf.getText();ta.setText(pre+s);//更新文本域內(nèi)容}publicvoidactionPerformed(ActionEvente){tf.setText(""); //清空文本框ta.append("\n"); //添加一個換行符pre=ta.getText();}publicstaticvoidmain(Stringa[]){...//創(chuàng)立窗體并可見}}11.4.1鼠標事件
共有7種情形,用MouseEvent類的同名靜態(tài)整型常量標志,分別是:MOUSE_DRAGGEDMOUSE_ENTEREDMOUSE_EXITEDMOUSE_MOVEDMOUSE_PRESSEDMOUSE_RELEASEDMOUSE_CLICKED?鼠標事件的處理接口MouseListener
負責(zé)接收和處理鼠標的press(按下)、release〔釋放〕、click〔點擊〕、enter〔移入〕和exit〔移出〕動作觸發(fā)的事件;MouseMotionListener
負責(zé)接收和處理鼠標的move(移動)和drag(拖動)動作觸發(fā)的事件。
?
MouseEvent類
publicintgetX():返回發(fā)生鼠標事件的X坐標。
publicintgetY():返回發(fā)生鼠標事件的Y坐標。
publicPointgetPoint():返回Point對象,也即鼠標事件發(fā)生的坐標點。
publicintgetClickCount():返回鼠標點擊事件的連擊次數(shù)。例11-8圍棋對弈界面設(shè)計#01importjava.awt.*;#02importjava.awt.event.*;#03publicclasschessGameextendsFrame{#04 chessBoardb=newchessBoard();#05
#06 publicchessGame(){#07 setBackground(Color.lightGray);#08 setLayout(newBorderLayout());#09 add(“Center”,b);//棋盤#10 Panelp=newPanel();#11 Buttonpass=newButton("放棄一手");#12 Buttoncolor=newButton("變棋盤背景");#13 Buttonfail=newButton("認輸");#14 Buttonback=newButton("悔棋");#15 p.setLayout(newGridLayout(8,1,10,10));部署界面 p.add(newLabel());//為界面美觀插入一個空標簽 p.add(pass); p.add(color); p.add(fail); p.add(back); add(“East”,p); setSize(500,450); setVisible(true); } publicstaticvoidmain(String[]args){ newchessGame(); }}部署界面classchessBoardextendsCanvas{ intchess[][]=newint[19][19];//存放棋盤子的狀態(tài) intsx=20,sy=20;//棋盤左上角位置 intw=20;//棋盤每個格子寬度 intcx=50;//下棋位置游標的初值,對應(yīng)鼠標移動位置 intcy=50; intplayer=1;//1表示輪黑下子,0表示輪白下子 publicchessBoard(){ this.addMouseMotionListener(newMouseMotionAdapter(){鼠標移動那么紅色小方框跟隨 publicvoidmouseMoved(MouseEvente){ Graphicsg=getGraphics(); g.setXORMode(chessBoard.this.getBackground()); g.setColor(Color.red);
g.fillRect(cx-w/4,cy-w/4,w/2,w/2); cx=sx+(int)(e.getX()/w)*w; cy=sy+(int)(e.getY()/w)*w;
g.fillRect(cx-w/4,cy-w/4,w/2,w/2); } }); this.addMouseListener(newMouseAdapter(){ publicvoidmouseClicked(MouseEvente){//鼠標點擊表示下子 Graphicsg=getGraphics();鼠標移動那么紅色小方框標記跟隨
if(chess[(cx-sx)/w][(cy-sy)/w]==0){//是否已有棋子 if(player==1){ g.setColor(Color.black);//黑棋 chess[(cx-sx)/w][(cy-sy)/w]=1; }else{ g.setColor(Color.white);//白棋 chess[(cx-sx)/w][(cy-sy)/w]=2; } g.fillOval(cx-w/2+1,cy-w/2+1,w-2,w-2); player=(player+1)%2;//黑白方輪流下子 g.setXORMode(chessBoard.this.getBackground()); g.setColor(Color.red);//用異或方式繪制小游標 g.fillRect(cx-w/4,cy-w/4,w/2,w/2); }} });}繪制剛下的棋子 publicvoidpaint(Graphicsg){ for(intk=0;k<19;k++)//繪制棋盤 g.drawLine(sx,sy+k*w,sx+w*18,sy+k*w); for(intk=0;k<19;k++) g.drawLine(sx+k*w,sy,sx+k*w,sy+w*18);
for(inti=0;i<chess.length;i++)
for(intj=0;j<chess[0].length;j++){ if(chess[i][j]==1){ g.setColor(Color.black); g.fillOval(sx+i*w-w/2+1,sx+j*w-w/2+1,w-2,w-2);二重循環(huán)控制繪制所有棋子 }elseif(chess[i][j]==2){ g.setColor(Color.white); g.fillOval(sx+i*w-w/2+1,sx+j*w-w/2+1, w-2,w-2); } }
g.setXORMode(this.getBackground());//用異或方式繪制小游標 g.setColor(Color.red); g.fillRect(cx-w/4,cy-w/4,w/2,w/2); }}11.4.2鍵盤事件
包含3個,分別對應(yīng)KeyEvent類的幾個同名的靜態(tài)整型常量KEY_PRESSED、KEY_RELEASED、KEY_TYPED。監(jiān)聽者接口是KeyListenerpublicvoidkeyPressed(KeyEvente)
某個鍵按下時執(zhí)行。publicvoidkeyReleased(KeyEvente)
某鍵被釋放時執(zhí)行。
publicvoidkeyTyped(KeyEvente)
按鍵被敲擊。
KeyTyped包含keyPressed和KeyRelased兩個動作
?如何獲取擊鍵值getKeyChar()---獲取輸入字符〔對字符鍵〕getKeyCode()---獲取鍵的編碼〔對控制鍵〕鍵編碼常量KeyEvent.VK_LEFT)----按鍵為左箭頭KeyEvent.VK_RIGHT)---右箭頭KeyEvent.VK_UP)-----向上箭頭KeyEvent.VK_DOWN)---向下箭頭
例11-9小方框變色和移動importjava.awt.*;importjava.awt.event.*;publicclassKeyboardDemoextendsFrameimplementsKeyListener{staticfinalintSQUARE_SIZE=20; //小方框的邊長ColorsquareColor; //小方框的顏色intsquareTop,squareLeft; //小方框的左上角坐標publicKeyboardDemo(){squareTop=100; //初始小方框位置squareLeft=100;squareColor=Color.red; //初始顏色設(shè)置為紅色addKeyListener(this); //注冊鍵盤事件監(jiān)聽repaint();}publicvoidpaint(Graphicsg){g.setColor(squareColor);g.fillRect(squareLeft,squareTop,SQUARE_SIZE,SQUARE_SIZE);}
/*用鍵盤控制小方塊顏色的改變*/publicvoidkeyTyped(KeyEventevt){charch=evt.getKeyChar(); //獲取輸入字符if(ch=='B'||ch=='b'){squareColor=Color.blue;
repaint();
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電梯底坑施工方案
- 西坪外墻施工方案
- 宜城水下封堵施工方案
- 人工拆除煙囪施工方案
- 思辯技能測試題及答案
- 2025年護理三級產(chǎn)科試題及答案
- 5言自編現(xiàn)代詩5句
- 低溫電磁閥設(shè)計
- 5個環(huán)境描寫的開頭
- c++中環(huán)形緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)的設(shè)計
- 簡愛人物形象分析
- 云南省地圖含市縣地圖矢量分層地圖行政區(qū)劃市縣概況ppt模板
- 光伏發(fā)電工程達標投產(chǎn)創(chuàng)優(yōu)工程檢查記錄
- 領(lǐng)導(dǎo)干部要樹立正確的價值觀、權(quán)力觀、事業(yè)觀課件
- 體育社會學(xué)(第一章)盧元鎮(zhèn)第四版課件
- 數(shù)電課件康華光電子技術(shù)基礎(chǔ)-數(shù)字部分第五版完全
- DB21-T 2041-2022寒區(qū)溫拌瀝青路面工程技術(shù)規(guī)程
- 語文主題學(xué)習(xí)整本書閱讀指導(dǎo)課件
- 職業(yè)教育課堂教學(xué)設(shè)計(全)課件
- 工程項目造價控制措施
- 心電監(jiān)護操作評分標準
評論
0/150
提交評論