一、實驗目的
?? 了解圖形用戶界面基本組件窗口、按鈕、文本框、選擇框、滾動條等的使用方法,了解如何使用布局管理器對組件進行管理,以及如何使用 Java 的事件處理機制。
二、實驗要求
??? 1. 掌握在 Applet 容器中添加組件的方法,掌握使用布局管理器對組件進行管理的方法。
??? 2. 理解 Java 的事件處理機制,掌握為不同組件編寫事件處理程序的方法。
??? 3. 掌握編寫獨立運行的窗口界面的方法。
??? 4. 了解 Java Swing 組件的使用方法。
??? 5. 了解對話框的使用方法。
三、實驗內容
(一)創建圖形用戶界面
圖形用戶界面(Graphic User Interface ,簡稱GUI)是為方便用戶使用設計的窗口界面,在圖
形用戶界面中用戶可以看到什么就操作什么,取代了在字符方式下知道是什么后才能操作什么的方式。組件(Component)是構成GUI 的基本要素,通過對不同事件的響應來完成和用戶的交互或組件之間的交互。組件一般作為一個對象放置在容器(Container)內,容器是能容納和排列組件的對象,如Applet、Panel(面板)、Frame(窗口)等。通過容器的add 方法把組件加入到容器中。
1.?在Applet 中添加標簽、按鈕并使用網格布局
¨?程序功能:在Applet 容器中添加組件標簽、按鈕,并使用網格布局管理器排列組件在容器中的位置。
¨?編寫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)); // 設置網格布局(3 行3 列共9 個網格)
l1=new Label("標簽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("標簽2"));
}
}
¨?編譯程序KY7_1.java。
¨?編寫顯示Applet 的頁面文件KY7_1.html
2.?在面板中添加組件
¨?程序功能:在Applet 中添加面板容器,并分別在Applet、面板容器中添加組件并使用不同的布局管理方式。
¨?編寫KY7_2.java 程序文件,源代碼如下。
import java.awt.*;
import java.awt.Color;
import java.applet.Applet;
public class KY6_2 extends Applet {
public void init() {
//設置最底層的 Applet 容器為順序布局
setFont(new Font("Arial",Font.PLAIN,20));
Label l=new Label("這是最底層的 Applet 容器中的標簽",Label.CENTER);
add(l);
Panel panel1=new Panel();
add( panel1);
panel1.setBackground(Color.blue);
panel1.setForeground(Color.red);
panel1.setLayout(new BorderLayout());//設置邊界布局
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 面板 中部添加的標簽"));
Panel panel2=new Panel();
add( panel2);
panel2.setLayout(new GridLayout(3,1)); //設置網格布局
Choice c=new Choice ();//創建下拉式列表
c.addItem("北京");
c.addItem("上海");
c.addItem("天津");
Label l1=new Label("這是在 Panel2 面板中的標簽");
Button b1=new Button("Panel2 中的按鈕");
panel2.setBackground(Color.green);
panel2.add(l1);
100
panel2.add(b1);
panel2.add(c);
}
}
¨?編譯程序KY7_2.java。
¨?編寫顯示Applet 的頁面文件KY7_2.html
(二)了解事件處理機制
在圖形用戶界面中,程序和用戶的交互是通過組件響應各種事件來實現的。例如,用戶單擊了一個按鈕,意味著發生了按鈕的單擊事件;選中下拉框中的一個選項,意味著發生了一個選項事件。在Java 中能產生事件的組件叫做事件源,如按鈕。如果希望對單擊按鈕事件進行處理,可給事件源(按鈕)注冊一個事件監聽器(如包含按鈕的容器),如同簽訂了一個委托合同,當事件源發生事件時,事件監聽器就代替事件源對發生的事件進行處理,這就是所謂的委托事件處理機制。
1.?單擊按鈕的事件處理程序
¨?程序功能:使用手工布局設置組件標簽、按鈕的位置,為按鈕編寫單擊事件處理方法。當用戶用鼠標單擊按鈕時,會聽到一聲響聲。
¨?編寫KY7_3.java 程序文件,源代碼如下。
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class KY6_3 extends Applet implements ActionListener { // 實現動作事件監聽
接口
public void init() {
setLayout(null);//關閉默認的順序管理布局
Label l=new Label("按一下按鈕可聽到響聲!", 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); // 注冊事件源的動作監聽者
}
public void actionPerformed(ActionEvent e) {//實現單擊事件接口的方法
Toolkit.getDefaultToolkit ().beep(); //單擊事件發生時作出的反應
}
}
¨?編譯程序KY7_2.java
¨?編寫顯示Applet 的頁面文件KY7_3.html
2.?選擇復選框和單選框按鈕的事件處理程序
¨?程序功能:在Applte 上創建復選框、單選框、文本區域、單行文本框等組件,并實現根據用戶輸入的10 進制數,選擇不同選項可轉換為2、8、16 進制數。
¨?編寫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);//創建文本區
String Item[]={"2 進制","8 進制","16 進制","10 進制"};
Checkbox cb[]=new Checkbox[5];
Checkbox radio[]=new Checkbox[5];
Label l=new Label("輸入10 進制數");
TextField TF=new TextField(6);//創建單行文本框
public void init() {
add(l);add(TF);
add(area);
add(new Label(" 請選擇進制:"));
for(int i=0; i<4; i++) {
cb[i]=new Checkbox(Item[i]);
add(cb[i]);
cb[i].addItemListener(this);
}
CheckboxGroup cbGroup=new CheckboxGroup();//創建單選框
add(new Label("請選擇進制:"));
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 進制")
area.append ("你選擇的是"+e.getItem ()+ Integer.toBinaryString(x)+"\n");
if (e.getItem ()=="8 進制")
area.append ("你選擇的是"+e.getItem ()+ Integer.toOctalString(x)+"\n");
if (e.getItem ()=="16 進制")
area.append ("你選擇的是"+e.getItem ()+Integer.toHexString(x)+"\n");
if (e.getItem ()=="10 進制")
area.append ("你選擇的是"+e.getItem ()+x+"\n");
}
}
¨?編譯程序KY7_4.java。
¨?編寫顯示Applet 的頁面文件KY7_4.html
(三)建立獨立運行的窗口界面并使用匿名類
最常使用的包含組件的容器是窗口,在Java 中窗口由Frame 類生成。
1.?創建一個窗口界面
¨?程序功能:創建一個具有關閉功能的空白窗口。
¨?編寫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("初始窗口");//創建窗口對象
f.setSize(350,200);//設置窗口大小
f.setVisible(true);//設置窗口是可視的
f.addWindowListener(new WindowAdapter() {//為窗口添加窗口事件適配器
public void windowClosing(WindowEvent e) {//關閉窗口事件的方法
System.exit(0);
}
};
}
}
¨?編譯并運行程序
2.?在窗口中添加組件
¨?程序功能:在窗口中添加組件。
¨?編寫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); //設置窗口大小
setLocation(200,200);//設置窗口顯示位置
setFont(new Font("Arial",Font.PLAIN,12)); //設置字體
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("用戶名"));
add(tf1); add(new Label("電話"));
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("用戶名:"+tf1.getText()+"\n");
if (e.getSource()==tf2)
Area.append("電 話:"+tf2.getText()+"\n");
if (e.getSource()==btn2) {
for (int i=0; i<100000000; i++);
dispose();//只關閉當前窗口,注銷該對象
}
}
}
¨?編譯并運行程序
3.?為窗口添加菜單
¨?程序功能:在窗口中添加菜單欄,在菜單欄添加菜單項,并添加下拉菜單和2 級菜單,通過選擇菜單項可以執行不同操作,如“打開”可打開KY6_6 類生成的窗口。
¨?編寫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(); // 以下生成菜單組件對象
Menu m1=new Menu("文件");
MenuItem open=new MenuItem("打開");
MenuItem close=new MenuItem("關閉");
MenuItem exit=new MenuItem("退出");
Menu m12=new Menu("編輯");
MenuItem copy=new MenuItem("復制");
MenuItem cut=new MenuItem("剪切");
MenuItem paste=new MenuItem("粘貼");
Menu m2=new Menu("幫助");
MenuItem content=new MenuItem("目錄");
MenuItem index=new MenuItem("索引");
MenuItem about=new MenuItem("關于");
KY7_7() {
super("添加菜單的窗口");
setSize(350,200);
add("South",p);
p.add(b);
b.addActionListener(this);
m1.add(open); // 將菜單項加入到菜單m1 中
m1.add(close);
m1.addSeparator(); //在菜單中添加分隔條
m1.add(exit);
open.addActionListener(this); //給菜單項open 注冊事件監聽器
exit.addActionListener(this);
mb.add(m1); // 將菜單m1 加入到菜單欄mb 中
m12.add(copy); m12.add(cut); m12.add(paste);
m1.add(m12);//將m12 作為2 級菜單添加到m1 菜單項中
m2.add(content); m2.add(index); m2.addSeparator(); m2.add(about);
mb.add(m2);
setMenuBar(mb); // 設置菜單欄為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()=="打開")
new KY7_6();
}
}
¨?編譯并運行程序
(四)使用 Swing 組件
在Java 中,能夠實現圖形用戶界面的類庫有兩個:java.awt 和javax.swing。前者稱為抽象窗口工具庫AWT(Abstract Windows Toolkit),后者是Java 基礎類庫JFC(Java Foundation Classes)
的一個組成部分,它提供了一套功能更強、數量更多、更美觀的圖形用戶界面組件。Swing 組件名稱和AWT 組件名稱基本相同,但以J 開頭,例如AWT 按鈕類的名稱是Button,在Swing 中的名稱則是JButton。
1.?在 JApplet 中添加 Swing 組件
¨?程序功能:在 JApplet 中添加 3 個帶有圖片的按鈕和一個帶有圖片的標簽。
¨?準備圖片文件:在當前目錄下建立一個 image 文件夾,存放 4 個圖片文件,例如
¨?PreviousArrow.gif。
¨?編寫 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("圖像標簽",
????????? 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("向上翻頁按鈕");
?????? button2.setToolTipText("跳轉按鈕");
?????? button3.setToolTipText("向下翻頁按鈕");
?????? pane.add("North",panel1);
?????? pane.add(panel2,BorderLayout.SOUTH);
?????? panel1.add(button1);
?????? panel1.add(button2);
?????? panel1.add(button3);
?????? panel2.add(label);
???? }
?? }
¨?編譯 KY7_8.java。
¨?編寫顯示 KY7_8.class 的頁面文件。
¨?使用 appletviewer 查看程序結果
2.?在JFrame 窗口中添加組件
¨?程序功能:創建JFrame 窗口,并在其中添加工具欄。
¨?準備圖片文件: 在當前目錄下建立一個image 文件夾, 存放3 個圖片文件, 例如
¨?PreviousArrow.gif。
¨?編寫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。
¨?運行KY7_9.class
(五)使用自定義對話框與內部類
對話框是GUI 中很常見的窗口對象,有著廣泛的應用。對話框和普通窗口最大的不同就是對話框是依附在某個窗口上,一旦它所依附的窗口關閉了,對話框也要隨著關閉。Java 提供了Dialog 類用于制作自定義對話框,當需要改變一些數據或需要一個提示窗口時可使用自定義對話框。
¨?程序功能:創建一個帶有文本區及“對話框”按鈕的父窗口,單擊“對話框”按鈕可打開一個自定義對話框,從中可以定義行和列的數值,關閉對話框其設置的設置會顯示在父窗口的文本區中。
¨?編寫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("文本區行數:"+row+" 列數:"+col, row, col);
JScrollPane scrollPane=new JScrollPane(ta);
Button exit=new Button("關閉");
Button dialog=new Button("對話框");
JPanel panel=new JPanel();
KY7_10() {
setContentPane(panel);
setTitle("帶有對話框的父窗口");
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("請輸入行數");
Label label2=new Label("請輸入列數");
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("自定義對話框");
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("文本區行數:"+row+" 列數:"+col);
show();
}
dispose();
}
}
}
¨?編譯并運行程序
評論
查看更多