一、實驗目的:
1. 瞭解Java圖像用戶界面的開發,掌握基本組件的使用。
2. 掌握編寫獨立運行的窗口界面的方法,瞭解菜單和對話框的使用方法。
3. 理解Java的事件處理機制,掌握爲不同組件編寫事件處理程序的方法。
二、實驗環境:
Eclipse
三、實驗內容:
(一)在面板中添加多個組件,並進行合理的佈局
¨ 程序功能:在一個框架(Frame)容器中添加一個面板(Panel)容器,並分別在框架和麪板容器中添加組件並使用不同的佈局管理方式。
¨ 請編寫KY7_1.java 程序文件,相關源代碼的提示如下。
import java.awt.*;
importjava.awt.Color;
public classKY7_1 {
public static void main(String args[]){
…… //創建一個框架f
…… //創建一個面板p
…… //把面板p添加到框架f中
…… //設置面板p的背景顏色爲藍色
p.setLayout(new FlowLayout()); //設置面板p的佈局爲流式佈局
…… //在面板p中添加一個標籤l
…… //在面板p中添加六個按鈕
Choice c=new Choice (); // 創建一個下拉列表c,
c.addItem("北京"); // 下拉列表c中有三個選項:北京、上海和天津
c.addItem("上海");
c.addItem("天津");
…… //把列表c添加到面板p中
…… //設置框架f的大小和可見性
}
}
¨ 將上面程序中的空缺部分添加進去,編譯並執行該程序。
¨ 將KY7_1.java的完整源程序寫在實驗報告中。
答:代碼如下:
import java.awt.*;
import java.awt.Color;
publicclass KY7_1 {
publicstaticvoid main(String args[]){
Frame f=new Frame();//創建一個框架f
Panel p=new Panel();//創建一個面板p
f.add(p);//把面板p添加到框架f中
p.setBackground(Color.blue);//設置面板p的背景顏色爲藍色
p.setLayout(new FlowLayout()); //設置面板p的佈局爲流式佈局
Label l=new Label();
p.add(l);//在面板p中添加一個標籤l
Button button1=new Button();
Button button2=new Button();
Button button3=new Button();
Button button4=new Button();
Button button5=new Button();
Button button6=new Button();
p.add(button1);
p.add(button2);
p.add(button3);
p.add(button4);
p.add(button5);
p.add(button6);//在面板p中添加六個按鈕
Choice c=new Choice (); // 創建一個下拉列表c,
c.addItem("北京"); // 下拉列表c中有三個選項:北京、上海和天津
c.addItem("上海");
c.addItem("天津");
p.add(c); //把列表c添加到面板p中
f.setBounds(400,400,400,400);
f.setVisible(true);
f.validate();//設置框架f的大小和可見性
}
}
結果如下:
(二)爲窗口添加菜單,並處理由菜單項所引發的事件
¨ 程序功能:在窗口中添加菜單條,在菜單條中添加菜單,並在菜單中添加菜單項和子菜單。通過選擇菜單項可以引發不同的事件,從而執行不同操作,例如點擊“打開”菜單項可以打開一個“打開文件對話框”。
¨ 編寫KY7_2.java 程序文件,源代碼如下。
import java.awt.*;
import java.awt.event.*;
public class KY7_2 extendsFrame implements ActionListener {
static Frame f; //聲明一個框架
static FileDialog fd1; //聲明一個文件對話框對象
staticFileDialog fd2;
public static void main(Stringargs[]) {
KY7_2 k = newKY7_2();
f= new Frame(); // 創建一個框架f
…… // 創建一個菜單條 mb
…… // 在菜單條mb中添加兩個菜單m1("文件")和m2("幫助")
…… /* "文件"菜單m1中有三個菜單項:m11("打開")、
m12("關閉")和m13("退出")*/
…… /* "幫助"菜單m2中有三個菜單項:m21("目錄")、
m22("索引")和m23("關於")*/
…… // "文件"菜單m1中還有一個子菜單m3("編輯")
…… /* "編輯"子菜單m3 中有三個菜單項:m31("複製")、
m32("剪切")和m33("粘貼")*/
m11.addactionlistner(k); /* 允許菜單項"打開"引發一個事件,該事件的處理者爲當前對象 k */
m13.addactionlistner(k); /* 允許菜單項"退出"引發一個事件,該事件的處理者爲當前對象 k */
f.setSize(350,200); // 設置框架f的大小
f.setMenuBar(mb); // 設置框架f的菜單條爲mb
f.setVisible(true);
}
public voidactionPerformed (ActionEvent e) { /* 處理由菜單項"打開"和"退出" 所引發的事件*/
if(e.getActionCommand() == "打開") { /* 若"打開"菜單項引發事件,則打開“打開文件對話框”*/
FileDialog fd = new FileDialog (f, "open", FileDialog.SAVE);
fd.setVisible (true);
}
if(e.getActionCommand() == "保存") /* 若"保存"菜單項引發事件,則打開“保存文件對話框”*/
…… //創建並打開一個“保存文件對話框”
}
}
¨ 將上面程序中的空缺部分添加進去,編譯並執行該程序。
¨ 將KY7_2.java的完整源程序寫在實驗報告中。
答:程序如下:
package ch1;
import java.awt.*;
importjava.awt.event.*;
publicclass KY7_2extends Frame implements ActionListener {
staticFrame f; //聲明一個框
staticFileDialog fd1; //聲明一個文件對話框對象
static FileDialog fd2;
publicstaticvoid main(String args[]) {
KY7_2 k = newKY7_2();
f = newFrame(); // 創建一個框架f
MenuBar mb=new MenuBar(); // 創建一個菜單條 mb
Menu m1=new Menu("文件");
Menu m2=new Menu("幫助"); // 在菜單條mb中添加兩個菜單m1("文件")和m2("幫助")
mb.add(m1);
mb.add(m2);
MenuItem m11=new MenuItem("打開"); /* "文件"菜單m1中有三個菜單項:m11("打開")、m12("關閉")和m13("退出")*/
MenuItem m12=new MenuItem("關閉");
MenuItem m13=new MenuItem("關於");
m1.add(m11);
m1.add(m12);
m1.add(m13);
MenuItem m21=new MenuItem("目錄");/* "幫助"菜單m2中有三個菜單項:m21("目錄")、m22("索引")和m23("關於")*/
MenuItem m22=new MenuItem("索引");
MenuItem m23=new MenuItem("關於");
m2.add(m21);
m2.add(m22);
m2.add(m23);
Menu m3=new Menu("編輯");// "文件"菜單m1中還有一個子菜單m3("編輯")
MenuItem m31=new MenuItem("複製"); /* "編輯"子菜單m3 中有三個菜單項:m31("複製")、m32("剪切")和m33("粘貼")*/
MenuItem m32=new MenuItem("剪切");
MenuItem m33=new MenuItem("粘貼");
m3.add(m31);
m3.add(m32);
m3.add(m33);
m1.add(m3);
m11.addActionListener(k); /* 允許菜單項"打開"引發一個事件,該事件的處理者爲當前對象 k */
m13.addActionListener(k); /* 允許菜單項"退出"引發一個事件,該事件的處理者爲當前對象 k */
f.setSize(350,200); // 設置框架f的大小
f.setMenuBar(mb); // 設置框架f的菜單條爲mb
f.setVisible(true);
}
publicvoidactionPerformed (ActionEvent e) { /* 處理由菜單項"打開"和"退出" 所引發的事件*/
if (e.getActionCommand()== "打開") { /* 若"打開"菜單項引發事件,則打開“打開文件對話框”*/
FileDialog fd = newFileDialog (f, "open", FileDialog.SAVE);
fd.setVisible(true);
}
if (e.getActionCommand()== "保存") /* 若"保存"菜單項引發事件,則打開“保存文件對話框”*/
{
FileDialog fd2=newFileDialog (f,"save",FileDialog.SAVE);//創建並打開一個“保存文件對話框”
fd2.setVisible(true);
}
}
}
結果如下:
(四)、思考題
1.構造函數和init()方法誰先被執行?
答:int()方法是Applet程序的入口,必須要有的。而構造方法是一個類的初始化方法,例如:People people=new People(“freestyleboy21”),就是把people這個對象初始化爲freestyleboy21。構造方法是容器實例化selevlet用的,init其實是構造方法調用的,即先構造方法,後int()方法,除非int()是靜態的,不需要構造函數作一些初始化。
2.編寫Applet,包含兩個按鈕,一個按鈕用於放大Applet上的一串字符串,一個按鈕用於縮小;連續點擊可不斷放大或縮小。
答:代碼如下:
import java.awt.*;
importjava.awt.event.*;
publicclass Applet extendsWindowAdapter implements ActionListener{
private Frame f;//設置一個框架f
private Panel p;//創建一個面板p
private Button b1,b2;//設置兩個按鈕b1,b1
private TextField t;//創建一個文本框
inti=100;
publicstaticvoid main(Stringargs[]){
Applet be=new Applet();
be.go();}
publicvoid go(){
f=new Frame();
p=new Panel();
t=new TextField("HelloWorld",10);
b1=new Button("放大");
b2=new Button("縮小");
p.add(b1);
p.add(b2);
f.add("Center",t);
f.add("South",p);
f.addWindowListener(this);
b1.addActionListener(this);
b2.addActionListener(this);
f.setSize(300,300);
f.setVisible(true);
}//實現放大縮小功能
publicvoidactionPerformed(ActionEvent e){
if(e.getSource()==b1){
i=i+4;
Font f1=new Font("CHINESE_GB2312",Font.PLAIN,i);//設置字體
t.setFont(f1);
t.setText("HelloWorld");
}
if(e.getSource()==b2){
i=i-4;
Font f1=new Font("CHINESE_GB2312",Font.PLAIN,i);
t.setFont(f1);
t.setText("HelloWorld");
}
}
publicvoidwindowClosing(WindowEvent e){
System.exit(0);
}
}
結果如下:
四、心得體會:
這一次實驗主要是關於窗口界面的設計,通過這一次實驗,對此也有了相應的瞭解,對此也能自己設計簡單的窗口,獲益匪淺。