Java學習筆記(8) -Java GUI設計與事件處理
第八章 Java GUI設計與事件處理
1、題目
1.1、 如何來製作圖形介面?它需要引入哪些包
建立視窗並在視窗中新增各種元件,指定元件的屬性和它們在視窗中的位置,從而構成圖形介面的外觀效果。定義圖形介面的事件和各種元件對不同事件的響應,從而實現圖形介面與使用者的互動。
簡而言之,製作圖形介面需要引入java中的開發包,然後利用其中封裝的函式與類,編寫自己的類繼承它們然後構造介面和介面中一系列的東西。
利用介面操作引入需要引入AWT包、Swing包等,根據需要選擇其中相應的內容。
1.2、 在java中,什麼是事件?簡述處理事件的機制。
事件是可以被控制元件識別的操作。與事件源繫結的事件物件對事件源設定監聽,一旦事件源有動作發生,即執行與其繫結的處理事件。
事件指一個描述事件源狀態改變的物件 。java語言對事件的處理採用的是授權事件模型。在這個模型下,每個元件都有相應的事件,如按鈕有單擊事件,文字域具有內容改變事件等。當某個事件被觸發後,元件就會將事件傳送給元件註冊的每一個事件監聽器,事件監聽器中定義了與不同事件相對應的事件的處理,此時事件監聽器會根據不同的事件資訊呼叫不同的事件處理者,完成對這次事件的處理,只有事件監聽器被觸發後才會收到事件資訊。
1.3、 什麼是佈局管理器,它有什麼作用?
佈局管理器是控制組件在容器中位置的類的例項。其作用是將控制元件依據程式設計人員的需要排列布局。
佈局管理器是一個實現Layout Manager介面的類的例項。佈局管理器的作用包括設定計算容器的最佳和最小尺寸以及將容器中的元件大小和位置作合適的安排。
1.4、 請編寫一個視窗來實現BorderLayout的佈局。
package xiti8; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.Panel; class borderLayoutFrame extends Frame{ borderLayoutFrame(){ super("BorderLayout佈局視窗測試"); Panel myPanel = new Panel(); myPanel.setLayout(new BorderLayout()); Button north = new Button("北面"); Button south = new Button("南面"); Button east = new Button("東面"); Button west = new Button("西面"); Button center = new Button("中央"); myPanel.add(north,BorderLayout.NORTH); myPanel.add(south,BorderLayout.SOUTH); myPanel.add(east,BorderLayout.EAST); myPanel.add(west,BorderLayout.WEST); myPanel.add(center,BorderLayout.CENTER); this.add(myPanel); this.setSize(320,240); this.setVisible(true); } } public class xiti8_4 { public static void main(String[] args) { // TODO Auto-generated method stub borderLayoutFrame borfrm = new borderLayoutFrame(); borfrm.show(); } }
1.5、 請說明FlowLayout佈局方式的特點?
FlowLayout佈局方式是JPanel的預設佈局,元件按照加入的先後順序從左至右排列,排滿後進入下一行,預設居中排列,元件之間的預設水平和垂直間隙是5個畫素,元件大小預設為最佳大小,即可以保證顯示其上面的文字。。
FlowLayout的佈局策略是將容器中的元件按照加入的先後順序從左向右排列。如果一行排滿轉下一行繼續,每行均採取居中排列。
1.6、GridLayout佈局的特點有哪些?
GridLayout佈局是將容器劃分為若干行乘若干列的網格區域,然後元件就位於這些劃分出來的小格子中,每個元件大小即格子大小,均一致。
1.7、 編寫“畫圓畫方”的程式
package xiti8;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class myhuatuFrame extends JFrame{
myhuatuFrame(String str){
super(str);
this.setVisible(true);
// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設定關閉視窗
this.setSize(400, 400);
myPanel myhuatuPanel = new myPanel();//建立面板
// myhuatuPanel.setBackground(Color.yellow);
this.add(myhuatuPanel,BorderLayout.CENTER);
myhuatuPanel.addMouseListener(myhuatuPanel);//新增滑鼠監視器
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
class myPanel extends JPanel implements MouseListener{
// static int X,Y;
int clickedNum = 0;
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
int X = e.getX();
int Y = e.getY();
clickedNum = e.getButton();//獲取滑鼠點選的次數
Graphics g = this.getGraphics();//重繪
if(clickedNum == 1) {//如果是點選左鍵
if(e.getClickCount() == 2) {//如果是雙擊左鍵
g.setColor(Color.white);
//g.drawOval(X, Y, 30, 30);
g.fillRect(0,0,1000,1000);
}
else if(e.getClickCount() == 1) {
g.setColor(Color.green);
//g.drawOval(X, Y, 30, 30);
g.fillOval(X,Y,10,10);
}
}
else if(clickedNum == 3) {//如果是點選右鍵
g.setColor(Color.red);
//g.drawRect(X,Y,30,30);
g.fillRect(X,Y,10,10);
}
}
//對mouse的各種事件的重寫,自動加上的,不然報錯,跟super一個道理???
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
//}
//public class xiti8_7_2 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
myhuatuFrame frm = new myhuatuFrame("畫圓畫方");
frm.show();
}
}
//}
對照閱讀:
《深入淺出MFC》,侯俊傑著,第九章。