一、實(shí)驗(yàn)?zāi)康?
?? 了解圖形用戶(hù)界面基本組件窗口、按鈕、文本框、選擇框、滾動(dòng)條等的使用方法,了解如何使用布局管理器對(duì)組件進(jìn)行管理,以及如何使用 Java 的事件處理機(jī)制。
二、實(shí)驗(yàn)要求
??? 1. 掌握在 Applet 容器中添加組件的方法,掌握使用布局管理器對(duì)組件進(jìn)行管理的方法。
??? 2. 理解 Java 的事件處理機(jī)制,掌握為不同組件編寫(xiě)事件處理程序的方法。
??? 3. 掌握編寫(xiě)?yīng)毩⑦\(yùn)行的窗口界面的方法。
??? 4. 了解 Java Swing 組件的使用方法。
??? 5. 了解對(duì)話(huà)框的使用方法。
三、實(shí)驗(yàn)內(nèi)容
(一)創(chuàng)建圖形用戶(hù)界面
圖形用戶(hù)界面(Graphic User Interface ,簡(jiǎn)稱(chēng)GUI)是為方便用戶(hù)使用設(shè)計(jì)的窗口界面,在圖
形用戶(hù)界面中用戶(hù)可以看到什么就操作什么,取代了在字符方式下知道是什么后才能操作什么的方式。組件(Component)是構(gòu)成GUI 的基本要素,通過(guò)對(duì)不同事件的響應(yīng)來(lái)完成和用戶(hù)的交互或組件之間的交互。組件一般作為一個(gè)對(duì)象放置在容器(Container)內(nèi),容器是能容納和排列組件的對(duì)象,如Applet、Panel(面板)、Frame(窗口)等。通過(guò)容器的add 方法把組件加入到容器中。
1.?在Applet 中添加標(biāo)簽、按鈕并使用網(wǎng)格布局
¨?程序功能:在Applet 容器中添加組件標(biāo)簽、按鈕,并使用網(wǎng)格布局管理器排列組件在容器中的位置。
¨?編寫(xiě)KY7_1.java 程序文件,源代碼如下。
import java.awt.*;
import java.applet.Applet;
public class KY6_1 extends Applet {
Label l1;
Button b1, b2, b3, b4, b5, b6;
public void init() {
setLayout(new GridLayout(3,3)); // 設(shè)置網(wǎng)格布局(3 行3 列共9 個(gè)網(wǎng)格)
l1=new Label("標(biāo)簽1");
b1 = new Button("按鈕1");
b2 = new Button("按鈕2");
b3 = new Button("按鈕3");
b4 = new Button("按鈕4");
add(l1);
add(b1);
add(b2);
add(b3);
add(new Label());
add(b4);
add(new Button("按鈕5"));
add( new Button("按鈕6"));
add(new Label("標(biāo)簽2"));
}
}
¨?編譯程序KY7_1.java。
¨?編寫(xiě)顯示Applet 的頁(yè)面文件KY7_1.html
2.?在面板中添加組件
¨?程序功能:在Applet 中添加面板容器,并分別在Applet、面板容器中添加組件并使用不同的布局管理方式。
¨?編寫(xiě)KY7_2.java 程序文件,源代碼如下。
import java.awt.*;
import java.awt.Color;
import java.applet.Applet;
public class KY6_2 extends Applet {
public void init() {
//設(shè)置最底層的 Applet 容器為順序布局
setFont(new Font("Arial",Font.PLAIN,20));
Label l=new Label("這是最底層的 Applet 容器中的標(biāo)簽",Label.CENTER);
add(l);
Panel panel1=new Panel();
add( panel1);
panel1.setBackground(Color.blue);
panel1.setForeground(Color.red);
panel1.setLayout(new BorderLayout());//設(shè)置邊界布局
panel1.add("North", new Button("北"));
panel1.add("South", new Button("南"));
panel1.add("East", new Button("東"));
panel1.add("West", new Button("西"));
panel1.add("Center", new Label("這是在 Panel1 面板 中部添加的標(biāo)簽"));
Panel panel2=new Panel();
add( panel2);
panel2.setLayout(new GridLayout(3,1)); //設(shè)置網(wǎng)格布局
Choice c=new Choice ();//創(chuàng)建下拉式列表
c.addItem("北京");
c.addItem("上海");
c.addItem("天津");
Label l1=new Label("這是在 Panel2 面板中的標(biāo)簽");
Button b1=new Button("Panel2 中的按鈕");
panel2.setBackground(Color.green);
panel2.add(l1);
100
panel2.add(b1);
panel2.add(c);
}
}
¨?編譯程序KY7_2.java。
¨?編寫(xiě)顯示Applet 的頁(yè)面文件KY7_2.html
(二)了解事件處理機(jī)制
在圖形用戶(hù)界面中,程序和用戶(hù)的交互是通過(guò)組件響應(yīng)各種事件來(lái)實(shí)現(xiàn)的。例如,用戶(hù)單擊了一個(gè)按鈕,意味著發(fā)生了按鈕的單擊事件;選中下拉框中的一個(gè)選項(xiàng),意味著發(fā)生了一個(gè)選項(xiàng)事件。在Java 中能產(chǎn)生事件的組件叫做事件源,如按鈕。如果希望對(duì)單擊按鈕事件進(jìn)行處理,可給事件源(按鈕)注冊(cè)一個(gè)事件監(jiān)聽(tīng)器(如包含按鈕的容器),如同簽訂了一個(gè)委托合同,當(dāng)事件源發(fā)生事件時(shí),事件監(jiān)聽(tīng)器就代替事件源對(duì)發(fā)生的事件進(jìn)行處理,這就是所謂的委托事件處理機(jī)制。
1.?單擊按鈕的事件處理程序
¨?程序功能:使用手工布局設(shè)置組件標(biāo)簽、按鈕的位置,為按鈕編寫(xiě)單擊事件處理方法。當(dāng)用戶(hù)用鼠標(biāo)單擊按鈕時(shí),會(huì)聽(tīng)到一聲響聲。
¨?編寫(xiě)KY7_3.java 程序文件,源代碼如下。
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class KY6_3 extends Applet implements ActionListener { // 實(shí)現(xiàn)動(dòng)作事件監(jiān)聽(tīng)
接口
public void init() {
setLayout(null);//關(guān)閉默認(rèn)的順序管理布局
Label l=new Label("按一下按鈕可聽(tīng)到響聲!", Label.CENTER);
add(l);
l.setBounds(40,10,150,30);
Button b=new Button("按鈕");
add(b);
b.setBounds(60,50,60,40);
b.addActionListener (this); // 注冊(cè)事件源的動(dòng)作監(jiān)聽(tīng)者
}
public void actionPerformed(ActionEvent e) {//實(shí)現(xiàn)單擊事件接口的方法
Toolkit.getDefaultToolkit ().beep(); //單擊事件發(fā)生時(shí)作出的反應(yīng)
}
}
¨?編譯程序KY7_2.java
¨?編寫(xiě)顯示Applet 的頁(yè)面文件KY7_3.html
2.?選擇復(fù)選框和單選框按鈕的事件處理程序
¨?程序功能:在Applte 上創(chuàng)建復(fù)選框、單選框、文本區(qū)域、單行文本框等組件,并實(shí)現(xiàn)根據(jù)用戶(hù)輸入的10 進(jìn)制數(shù),選擇不同選項(xiàng)可轉(zhuǎn)換為2、8、16 進(jìn)制數(shù)。
¨?編寫(xiě)KY7_4.java 程序文件,源代碼如下。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class KY6_4 extends Applet implements ItemListener {
TextArea area=new TextArea(6,30);//創(chuàng)建文本區(qū)
String Item[]={"2 進(jìn)制","8 進(jìn)制","16 進(jìn)制","10 進(jìn)制"};
Checkbox cb[]=new Checkbox[5];
Checkbox radio[]=new Checkbox[5];
Label l=new Label("輸入10 進(jìn)制數(shù)");
TextField TF=new TextField(6);//創(chuàng)建單行文本框
public void init() {
add(l);add(TF);
add(area);
add(new Label(" 請(qǐng)選擇進(jìn)制:"));
for(int i=0; i<4; i++) {
cb[i]=new Checkbox(Item[i]);
add(cb[i]);
cb[i].addItemListener(this);
}
CheckboxGroup cbGroup=new CheckboxGroup();//創(chuàng)建單選框
add(new Label("請(qǐng)選擇進(jìn)制:"));
for(int i=0; i<4; i++) {
radio[i]=new Checkbox(Item[i],cbGroup,false);
add(radio[i]);
radio[i].addItemListener(this);
}
}
public void itemStateChanged(ItemEvent e) {
int x=Integer.parseInt(TF.getText());
if (e.getItem ()=="2 進(jìn)制")
area.append ("你選擇的是"+e.getItem ()+ Integer.toBinaryString(x)+"\n");
if (e.getItem ()=="8 進(jìn)制")
area.append ("你選擇的是"+e.getItem ()+ Integer.toOctalString(x)+"\n");
if (e.getItem ()=="16 進(jìn)制")
area.append ("你選擇的是"+e.getItem ()+Integer.toHexString(x)+"\n");
if (e.getItem ()=="10 進(jìn)制")
area.append ("你選擇的是"+e.getItem ()+x+"\n");
}
}
¨?編譯程序KY7_4.java。
¨?編寫(xiě)顯示Applet 的頁(yè)面文件KY7_4.html
(三)建立獨(dú)立運(yùn)行的窗口界面并使用匿名類(lèi)
最常使用的包含組件的容器是窗口,在Java 中窗口由Frame 類(lèi)生成。
1.?創(chuàng)建一個(gè)窗口界面
¨?程序功能:創(chuàng)建一個(gè)具有關(guān)閉功能的空白窗口。
¨?編寫(xiě)KY7_5_W.java 程序文件,源代碼如下。
import java.awt.*;
import java.awt.event.*;
public class KY7_5_W {
public static void main(String[] args) {
new KY7_5_W();
}
KY7_5_W(){
Frame f=new Frame("初始窗口");//創(chuàng)建窗口對(duì)象
f.setSize(350,200);//設(shè)置窗口大小
f.setVisible(true);//設(shè)置窗口是可視的
f.addWindowListener(new WindowAdapter() {//為窗口添加窗口事件適配器
public void windowClosing(WindowEvent e) {//關(guān)閉窗口事件的方法
System.exit(0);
}
};
}
}
¨?編譯并運(yùn)行程序
2.?在窗口中添加組件
¨?程序功能:在窗口中添加組件。
¨?編寫(xiě)KY7_6.java 程序文件,源代碼如下。
import java.awt.*;
import java.awt.event.*;
public class KY7_6 extends Frame implements ActionListener {
Button btn1, btn2;
TextField f,tf1,tf2;
TextArea Area;
KY7_6() {
super("添加組件的窗口");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setSize(350,250); //設(shè)置窗口大小
setLocation(200,200);//設(shè)置窗口顯示位置
setFont(new Font("Arial",Font.PLAIN,12)); //設(shè)置字體
setLayout(new FlowLayout());
Area=new TextArea (6,40);
tf1=new TextField(10); tf2=new TextField(10);
btn1=new Button("顯示"); btn2=new Button("退出");
f=new TextField(20);
add(Area); add(new Label("用戶(hù)名"));
add(tf1); add(new Label("電話(huà)"));
add(tf2); add(f); add(btn1); add(btn2);
tf1.addActionListener(this); tf2.addActionListener(this);
btn1.addActionListener(this); btn2.addActionListener(this);
show();
}
public static void main(String args[]) {
new KY7_6();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==btn1)
f.setText("你按下了“" + e.getActionCommand() + "”按鈕");
if (e.getSource()==tf1)
Area.append("用戶(hù)名:"+tf1.getText()+"\n");
if (e.getSource()==tf2)
Area.append("電 話(huà):"+tf2.getText()+"\n");
if (e.getSource()==btn2) {
for (int i=0; i<100000000; i++);
dispose();//只關(guān)閉當(dāng)前窗口,注銷(xiāo)該對(duì)象
}
}
}
¨?編譯并運(yùn)行程序
3.?為窗口添加菜單
¨?程序功能:在窗口中添加菜單欄,在菜單欄添加菜單項(xiàng),并添加下拉菜單和2 級(jí)菜單,通過(guò)選擇菜單項(xiàng)可以執(zhí)行不同操作,如“打開(kāi)”可打開(kāi)KY6_6 類(lèi)生成的窗口。
¨?編寫(xiě)KY7_7.java 程序文件,源代碼如下。
import java.awt.*;
import java.awt.event.*;
public class KY7_7 extends Frame implements ActionListener {
Panel p=new Panel();
Button b=new Button("退出");
MenuBar mb=new MenuBar(); // 以下生成菜單組件對(duì)象
Menu m1=new Menu("文件");
MenuItem open=new MenuItem("打開(kāi)");
MenuItem close=new MenuItem("關(guān)閉");
MenuItem exit=new MenuItem("退出");
Menu m12=new Menu("編輯");
MenuItem copy=new MenuItem("復(fù)制");
MenuItem cut=new MenuItem("剪切");
MenuItem paste=new MenuItem("粘貼");
Menu m2=new Menu("幫助");
MenuItem content=new MenuItem("目錄");
MenuItem index=new MenuItem("索引");
MenuItem about=new MenuItem("關(guān)于");
KY7_7() {
super("添加菜單的窗口");
setSize(350,200);
add("South",p);
p.add(b);
b.addActionListener(this);
m1.add(open); // 將菜單項(xiàng)加入到菜單m1 中
m1.add(close);
m1.addSeparator(); //在菜單中添加分隔條
m1.add(exit);
open.addActionListener(this); //給菜單項(xiàng)open 注冊(cè)事件監(jiān)聽(tīng)器
exit.addActionListener(this);
mb.add(m1); // 將菜單m1 加入到菜單欄mb 中
m12.add(copy); m12.add(cut); m12.add(paste);
m1.add(m12);//將m12 作為2 級(jí)菜單添加到m1 菜單項(xiàng)中
m2.add(content); m2.add(index); m2.addSeparator(); m2.add(about);
mb.add(m2);
setMenuBar(mb); // 設(shè)置菜單欄為mb
show();// 顯示組件
}
public static void main(String args[]) {
new KY7_7();
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand()=="退出")
System.exit(0);
if (e.getActionCommand()=="打開(kāi)")
new KY7_6();
}
}
¨?編譯并運(yùn)行程序
(四)使用 Swing 組件
在Java 中,能夠?qū)崿F(xiàn)圖形用戶(hù)界面的類(lèi)庫(kù)有兩個(gè):java.awt 和javax.swing。前者稱(chēng)為抽象窗口工具庫(kù)AWT(Abstract Windows Toolkit),后者是Java 基礎(chǔ)類(lèi)庫(kù)JFC(Java Foundation Classes)
的一個(gè)組成部分,它提供了一套功能更強(qiáng)、數(shù)量更多、更美觀的圖形用戶(hù)界面組件。Swing 組件名稱(chēng)和AWT 組件名稱(chēng)基本相同,但以J 開(kāi)頭,例如AWT 按鈕類(lèi)的名稱(chēng)是Button,在Swing 中的名稱(chēng)則是JButton。
1.?在 JApplet 中添加 Swing 組件
¨?程序功能:在 JApplet 中添加 3 個(gè)帶有圖片的按鈕和一個(gè)帶有圖片的標(biāo)簽。
¨?準(zhǔn)備圖片文件:在當(dāng)前目錄下建立一個(gè) image 文件夾,存放 4 個(gè)圖片文件,例如
¨?PreviousArrow.gif。
¨?編寫(xiě) KY7_8.java 程序文件,源代碼如下。
??? import javax.swing.*;
??? import java.awt.*;
??? import java.awt.Color;
??? public class KY7_8 extends JApplet {
????? Container pane;
???? JPanel panel1,panel2;
???? JButton button1,button2,button3;
???? JLabel label;
??????? public void init() {
?????? pane=getContentPane();
?????? panel1=new JPanel(new FlowLayout());
?????? panel2=new JPanel(new FlowLayout());
?????? ImageIcon icon = new ImageIcon("image/PreviousArrow.gif"," ");
?????? button1=new JButton(icon);
?????? button2=new JButton(new ImageIcon("image/go.GIF"));
?????? button3=new JButton(new ImageIcon("image/NextArrow.gif"));
?????? label=new JLabel("圖像標(biāo)簽",
????????? new ImageIcon("image/Candl02.gif"),SwingConstants.CENTER);
?????? pane.setBackground(new Color(255,255,200));
?????? panel1.setBackground(new Color(255,255,104));
?????? panel2.setBackground(new Color(255,255,214));
?????? button1.setToolTipText("向上翻頁(yè)按鈕");
?????? button2.setToolTipText("跳轉(zhuǎn)按鈕");
?????? button3.setToolTipText("向下翻頁(yè)按鈕");
?????? pane.add("North",panel1);
?????? pane.add(panel2,BorderLayout.SOUTH);
?????? panel1.add(button1);
?????? panel1.add(button2);
?????? panel1.add(button3);
?????? panel2.add(label);
???? }
?? }
¨?編譯 KY7_8.java。
¨?編寫(xiě)顯示 KY7_8.class 的頁(yè)面文件。
¨?使用 appletviewer 查看程序結(jié)果
2.?在JFrame 窗口中添加組件
¨?程序功能:創(chuàng)建JFrame 窗口,并在其中添加工具欄。
¨?準(zhǔn)備圖片文件: 在當(dāng)前目錄下建立一個(gè)image 文件夾, 存放3 個(gè)圖片文件, 例如
¨?PreviousArrow.gif。
¨?編寫(xiě)KY7_9.java 程序文件,源代碼如下。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KY7_9 extends JFrame implements ActionListener {
JButton button1,button2,button3;
JToolBar toolBar;
JTextArea textArea;
JScrollPane scrollPane;
JPanel panel;
public static void main(String[] args) {
new KY7_9();
}
public KY7_9() {
super("帶有工具欄按鈕的窗口");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
button1=new JButton(new ImageIcon("image/PreviousArrow.gif"));
button2=new JButton(new ImageIcon("image/go.GIF"));
button3=new JButton(new ImageIcon("image/NextArrow.gif"));
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
toolBar=new JToolBar();
toolBar.add(button1);
toolBar.add(button2);
toolBar.add(button3);
textArea=new JTextArea(6,30);
scrollPane=new JScrollPane(textArea);
panel=new JPanel();
setContentPane(panel);
panel.setLayout(new BorderLayout());
panel.setPreferredSize(new Dimension(300,150));
panel.add(toolBar,BorderLayout.NORTH);
panel.add(scrollPane,BorderLayout.CENTER);
pack();
show();
}
public void actionPerformed(ActionEvent e) {
String s="";
if (e.getSource()==button1)
s="左按鈕被單擊\n";
else if (e.getSource()==button2)
s="中按鈕被單擊\n";
else if (e.getSource()==button3)
s="右按鈕被單擊\n";
textArea.append(s);
}
}
¨?編譯KY7_9.java。
¨?運(yùn)行KY7_9.class
(五)使用自定義對(duì)話(huà)框與內(nèi)部類(lèi)
對(duì)話(huà)框是GUI 中很常見(jiàn)的窗口對(duì)象,有著廣泛的應(yīng)用。對(duì)話(huà)框和普通窗口最大的不同就是對(duì)話(huà)框是依附在某個(gè)窗口上,一旦它所依附的窗口關(guān)閉了,對(duì)話(huà)框也要隨著關(guān)閉。Java 提供了Dialog 類(lèi)用于制作自定義對(duì)話(huà)框,當(dāng)需要改變一些數(shù)據(jù)或需要一個(gè)提示窗口時(shí)可使用自定義對(duì)話(huà)框。
¨?程序功能:創(chuàng)建一個(gè)帶有文本區(qū)及“對(duì)話(huà)框”按鈕的父窗口,單擊“對(duì)話(huà)框”按鈕可打開(kāi)一個(gè)自定義對(duì)話(huà)框,從中可以定義行和列的數(shù)值,關(guān)閉對(duì)話(huà)框其設(shè)置的設(shè)置會(huì)顯示在父窗口的文本區(qū)中。
¨?編寫(xiě)KY7_10.java 程序文件,源代碼如下。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KY6_10 extends JFrame implements ActionListener {
int row=10, col=40;
JPanel p1=new JPanel(), p2=new JPanel();
JTextArea ta=new JTextArea("文本區(qū)行數(shù):"+row+" 列數(shù):"+col, row, col);
JScrollPane scrollPane=new JScrollPane(ta);
Button exit=new Button("關(guān)閉");
Button dialog=new Button("對(duì)話(huà)框");
JPanel panel=new JPanel();
KY7_10() {
setContentPane(panel);
setTitle("帶有對(duì)話(huà)框的父窗口");
panel.setPreferredSize(new Dimension(500,200));
panel.setLayout(new BorderLayout());
panel.add("Center", p1); panel.add("South", p2);
p1.add(scrollPane);
p2.add(exit); p2.add(dialog);
exit.addActionListener(this);
dialog.addActionListener(this);
pack();
show();
//setVisible(true);
}
public static void main(String args[]) {
new KY7_10();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==exit)
System.exit(0);
else {
MyDialog dlg=new MyDialog(this, true);
dlg.show();
}
}
class MyDialog extends Dialog implements ActionListener {
Label label1=new Label("請(qǐng)輸入行數(shù)");
Label label2=new Label("請(qǐng)輸入列數(shù)");
TextField rows=new TextField(50);
TextField columns=new TextField(50);
Button OK=new Button("確定");
Button Cancel=new Button("取消");
MyDialog(KY7_10 parent, boolean modal) {
super(parent,modal);
setTitle("自定義對(duì)話(huà)框");
setSize(260,140);
setResizable(false);
setLayout(null);
add(label1);
add(label2);
label1.setBounds(50,30,65,20);
label2.setBounds(50,60,65,20);
add(rows);
add(columns);
rows.setText(Integer.toString(ta.getRows()));
columns.setText(Integer.toString(ta.getColumns()));
rows.setBounds(120,30,90,20);
columns.setBounds(120,60,90,20);
add(OK);
add(Cancel);
OK.setBounds(60,100,60,25);
Cancel.setBounds(140,100,60,25);
OK.addActionListener(this);
Cancel.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==OK) {
int row=Integer.parseInt(rows.getText());
int col=Integer.parseInt(columns.getText());
ta.setRows(row);
ta.setColumns(col);
ta.setText("文本區(qū)行數(shù):"+row+" 列數(shù):"+col);
show();
}
dispose();
}
}
}
¨?編譯并運(yùn)行程序
評(píng)論
查看更多