?6-1?什么是組件?組件類與普通類有什么不同?
【答】組件是構(gòu)成圖形用戶界面的基本成分和核心元素;組件是具有以下特性的對(duì)象:運(yùn)行時(shí)可見,能擁有并管理其他組件,在窗口中可操縱,可獲得輸入焦點(diǎn)等。組件類Component是一個(gè)抽象類,是AWT組件類層次結(jié)構(gòu)的根類,它提供對(duì)組件操作的通用方法。
6-2?? 設(shè)計(jì)Windows應(yīng)用程序的圖形用戶界面需要哪些基本知識(shí)?
【答】需要掌握J(rèn)ava組件的使用方法,理解委托事件處理模型,掌握多種布局方式。
6-3 ?? 什么是容器組件?它有什么特點(diǎn)?Java提供了哪些容器組件?
【答】容器組件是一種能夠容納其他組件的特殊組件。特點(diǎn):能容納其他組件,并在其可視區(qū)域內(nèi)顯示這些組件。Java提供了窗口(window)和面板(panel)兩種容器。
6-4???? 窗口與對(duì)話框有什么不同?框架與面板有什么不同?
【答】對(duì)話框是窗口類的子類,對(duì)話框也是一種可移動(dòng)的窗口,不能作為應(yīng)用程序的主窗口,它依賴于一個(gè)框架窗口而存在,當(dāng)框架窗口關(guān)閉時(shí),對(duì)話框也關(guān)閉??蚣茴愂且环N帶標(biāo)題欄并且可以改變大小的窗口;它是窗口類的子類,所以它可以獨(dú)立存在,可被移動(dòng),可被最大化和最小化,有標(biāo)題欄、邊框、可添加菜單欄;而面板不能獨(dú)立存在,必須包含在另一個(gè)容器里,面板沒有標(biāo)題,沒有邊框,不可添加菜單欄。
6-5???? 什么是事件?什么是事件源?事件處理程序?qū)懺谀睦铮?/p>
【答】事件是指一個(gè)狀態(tài)的改變,或者一個(gè)活動(dòng)的發(fā)生。產(chǎn)生事件的組件稱為事件源。事件處理程序?qū)懺谑录O(jiān)聽器接口中聲明的方法中。如:?jiǎn)螕羰录氖录幚沓绦蛴葾ctionListener接口中的actionPerformed()方法實(shí)現(xiàn)。
6-6?? 如何理解Windows應(yīng)用程序的圖形用戶界面是事件驅(qū)動(dòng)的?
【答】一個(gè)組件的多個(gè)事件之間,多個(gè)組件的多個(gè)事件之間,其事件處理方法的執(zhí)行次序是有規(guī)律的:1.不同組件的事件或同一組件的不同事件具有約定的執(zhí)行次序。2.各組件的事件處理方法是否執(zhí)行以及執(zhí)行次序,取決于用戶操作。3.在一個(gè)事件處理方法中,程序按照語句的書寫次序順序執(zhí)行。
6-7? 說明Java的委托事件模型。
【答】事件源產(chǎn)生一個(gè)事件,并把這個(gè)事件發(fā)送到一個(gè)或多個(gè)監(jiān)聽程序,監(jiān)聽程序只是等待這個(gè)事件并處理它,然后返回。即程序把事件的處理“委托”給一段“代碼”。
6-8?? 設(shè)計(jì)圖形用戶界面的Java應(yīng)用程序,需要用到的組件分別在哪些包中?事件分別在哪些包中?
【答】 組件在java.awt包中,事件在java.awt.Event和javax.swing.Event包中。
6-9???? 按鈕組件能夠注冊(cè)哪些事件監(jiān)聽器?文本行組件能夠注冊(cè)哪些事件監(jiān)聽器?文本行和文本區(qū)組件能夠響應(yīng)的事件有什么不同?
【答】按鈕組件能夠注冊(cè)的事件監(jiān)聽器有ActionListener、ComponentListener、ItemListener等。文本行組件能夠注冊(cè)的事件監(jiān)聽器有ActionListener、ComponentListener、TextListener等。文本行是單行文本編輯框,用于編輯一行字符串,文本區(qū)是一個(gè)多行文本編輯框,它的基本操作與文本行類似,增加的是滾動(dòng)條的顯示和操作。
6-10? ? 是否可以對(duì)一個(gè)組件注冊(cè)多個(gè)事件監(jiān)聽器?
【答】可以。如果一個(gè)組件需要響應(yīng)多個(gè)事件,則可以注冊(cè)多個(gè)事件監(jiān)聽器。
6-11??? 一個(gè)事件監(jiān)聽器是否可以處理多個(gè)組件上產(chǎn)生的操作?
【答】一個(gè)事件監(jiān)聽器對(duì)應(yīng)一個(gè)事件處理方法,如果多個(gè)組件產(chǎn)生的操作相同,則可以注冊(cè)同一個(gè)事件監(jiān)聽器。
6-12??? 在事件處理方法中,怎樣區(qū)分不同的事件源組件?
【答】事件接口中的所有事件處理方法,都采用相應(yīng)的事件對(duì)象e作為參數(shù),
用e.getSource()方法可返回產(chǎn)生當(dāng)前事件對(duì)象的事件源組件。
6-13??? 窗口上有哪些事件?每種事件在什么時(shí)候被觸發(fā)?這些事件的觸發(fā)次序是怎樣的?
【答】窗口上的事件有:
windowOPend,windowActivated,windowDeactivated,windowIconified,windowDeiconified,windowClosing,windowClosed。每種事件的觸發(fā)分別在:打開窗口、激活窗口、窗口失去焦點(diǎn)、窗口最小化、窗口恢復(fù)、關(guān)閉窗口時(shí)、關(guān)閉窗口后。觸發(fā)次序與前述書寫順序相同。
6-14??? Java有幾種關(guān)閉窗口處理方式?分別是怎樣的?分別適用于哪些窗口組件?
【答】Java有2種關(guān)閉窗口處理方式。第一種是設(shè)置窗口關(guān)閉時(shí)隱藏方式的setDefaultCloseOperation()方法,第二種是寫窗口關(guān)閉事件處理程序即實(shí)現(xiàn)WindowListener接口中的windowClosing()方法。第一種適用于JFrame和JDialog等窗口組件,第二種適用于Frame和Dialog等窗口組件。
6-15??? Java的布局方式有什么特點(diǎn)?Java提供了哪些布局方式?
【答】特點(diǎn):Java采用布局管理器對(duì)圖形用戶界面中的組件進(jìn)行相對(duì)定位并自動(dòng)改變組件大小,合理分布組件格局。當(dāng)窗口大小改變時(shí),各組件自身的大小將隨之改變,而組件之間的相對(duì)位置不變,這樣組件一般不會(huì)被覆蓋。Java提供了FlowLayout、BorderLayout、GridLayout三種布局布局管理器類。
6-16 ?? 復(fù)選框和單選按鈕有什么不同?分別用于什么場(chǎng)合?在事件處理程序中,怎樣知道哪個(gè)復(fù)選框或單選按鈕是選中的?
【答】在同一組單選按鈕中,任何時(shí)候最多只能有一個(gè)被選擇,一旦選中一個(gè)單選按鈕,則前一個(gè)選中的單選按鈕會(huì)自動(dòng)變?yōu)槲催x中狀態(tài)。而復(fù)選框可多個(gè)同時(shí)被選中,且每個(gè)復(fù)選框選中與否的狀態(tài)改變,并不影響其他復(fù)選框的狀態(tài)。場(chǎng)合:?jiǎn)芜x按鈕用來顯示一組互斥的選擇,復(fù)選框用來顯示一組不互斥的選擇。在事件處理程序中,用注冊(cè)選擇事件監(jiān)聽器的方法來判斷復(fù)選框或單選按鈕是否被選中。
6-17??? 如果一個(gè)編輯框用于輸入數(shù)值,但程序運(yùn)行時(shí)卻輸入了非數(shù)字字符,問結(jié)果會(huì)怎樣?程序中有哪些辦法解決這個(gè)問題,怎樣解決?
【答】結(jié)果會(huì)因輸入錯(cuò)誤而突然停止運(yùn)行。程序中可以用try—catch捕獲、處理異常的方法來解決這個(gè)問題。當(dāng)遇到輸入錯(cuò)誤時(shí),Java將拋出異常,此時(shí)彈出一個(gè)提示信息對(duì)話框,提醒用戶輸入數(shù)據(jù)有錯(cuò)誤,請(qǐng)用戶重新輸入。
6-18??? 如何將JComboBox編輯框中新輸入的值,加入到下拉列表中去,并使新值與下拉列表中原有值不重復(fù)?
【答】通過添加單擊事件監(jiān)聽器將JcomboBox編輯框中新輸入的值加入到下拉列表中。通過if語句來確保新值與下拉列表中原有值不重復(fù)。
6-19 ?? 如何使菜單項(xiàng)顯現(xiàn)為分隔條狀態(tài)?如何使菜單項(xiàng)顯現(xiàn)單選狀態(tài)?
【答】實(shí)現(xiàn)JmenuItem()和addSeparator()方法使菜單項(xiàng)顯現(xiàn)為分離條狀態(tài)。實(shí)現(xiàn)JradioButtonMenuItem()方法使菜單項(xiàng)顯現(xiàn)單選狀態(tài)。
6-20??? 一個(gè)菜單中能否加入菜單項(xiàng)?能否加入另一個(gè)菜單?
【答】一個(gè)菜單中可以加入菜單項(xiàng),可以加入另一個(gè)菜單。
6.21 窗口菜單與快捷菜單有什么差別?
【答】窗口菜單是相對(duì)于窗口的,它出現(xiàn)在窗口的標(biāo)題欄下,總是與窗口同時(shí)出現(xiàn)。而快捷菜單則是相對(duì)于某個(gè)指定組建的,當(dāng)鼠標(biāo)指向某個(gè)組件并單擊右鍵時(shí),則會(huì)彈出快捷菜單,一般比較簡(jiǎn)單。
6.22 在文本區(qū)中,單擊右鍵時(shí)欲彈出一個(gè)菜單,該怎樣設(shè)計(jì)?
【答】可以在文本區(qū)添加一個(gè)快捷菜單(popMenu)。
6.23 如果窗口菜單中的某菜單項(xiàng)、快捷菜單中的某菜單項(xiàng)具有相同的菜單標(biāo)題并執(zhí)行相同的操作,應(yīng)該如何設(shè)計(jì)?
【答】 可以給它們都注冊(cè)單擊事件監(jiān)聽器,那么在事件處理方法actionPerformed()中以e.getActionCommand()方法獲得菜單項(xiàng)的標(biāo)題,由于標(biāo)題相同,可以執(zhí)行相同的操作。
6.24 如果希望在組件上繪圖,通常在哪些組件上繪圖?繪圖程序?qū)懺谀睦铮?/p>
【答】一般來講,可以在任何組件上繪圖,但由于很多組件上都有標(biāo)題之類的文字,所以通常在窗口或面板之類的容器上繪制圖形。此外,Java提供畫布(java.awt.Canvas)組件作為繪制圖形的區(qū)域。在Java.awt.Component類中聲明paint()和repaint()方法用于顯示和刷新圖形。當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)執(zhí)行該組件的paint()方法,繪制特定圖形。因此,如果想在組建上繪圖,則該類必須聲明為繼承某個(gè)組件類,讓偶將繪圖程序?qū)懺趐aint()方法體中就可以了。
6.25 根據(jù)以下極坐標(biāo)放出,畫出相應(yīng)曲線圖形。
1.星形線 代碼略 運(yùn)行結(jié)果如下
2.心形線
import java.awt.*;?
import java.awt.event.*;?
import javax.swing.*;?
public class HeartJFrame extends JFrame implements ComponentListener,ItemListener?
{?
private JComboBox combobox_color;?
public HeartJFrame()?
{?
super("心線");?
this.setSize(600,400);?
this.setDefaultCloseOperation(EXIT_ON_CLOSE);?
this.setLayout(new FlowLayout());?
Object data[] = {Color.red,Color.green,Color.CYAN,Color.blue};?
combobox_color = new JComboBox(data);?
combobox_color.addItemListener(this);?
this.add(combobox_color);?
this.addComponentListener(this);?
this.setVisible(true);?
}?
public void paint(Graphics g)?
{?
int x0,y0;?
x0=this.getWidth()/2;?
y0=this.getHeight()/2;?
g.setColor((Color)combobox_color.getSelectedItem());//設(shè)置線的顏色為組合框選中的顏色?
g.drawLine(x0, 0, x0, y0*2);?
g.drawLine(0, y0, x0*2, y0);?
int j=20;?
while(j <100)?
{?
for(int i=0;i <1023;i )?
{?
double angle=i*Math.PI/512;//?
double radius=j*(1-Math.cos(angle));//求出半徑;?
int x=(int)Math.round(radius*Math.cos(angle)*2);?
int y=(int)Math.round(radius*Math.sin(angle));?
g.fillOval(x0 x,y0 y,1,1);?
}?
j=j 10;?
} }?
public void itemStateChanged(ItemEvent e)?
{?
repaint();?
}?
public void componentResized(ComponentEvent e)?
{?
repaint();?
}?
public void componentHidden(ComponentEvent arg0) {?
// TODO Auto-generated method stub?
}?
public void componentMoved(ComponentEvent arg0) {?
// TODO Auto-generated method stub?
}?
public void componentShown(ComponentEvent arg0) {?
// TODO Auto-generated method stub?
}?
public static void main(String args[])?
{?
new HeartJFrame();?
}?
}
3.阿基米德螺線
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class HelixJFrame extends JFrame implements ComponentListener, ActionListener
{
??? private JRadioButton colors[];???????????????????? ?//表示顏色的單選按鈕數(shù)組
??? private HelixCanvas helix;
??? public HelixJFrame()
??? {
??????? super("阿基米德螺旋線");??????????????????? ??? //邊布局
??????? this.setSize(600,700);
??????? this.setDefaultCloseOperation(EXIT_ON_CLOSE);
??????? this.addComponentListener(this);?????????????? ?//注冊(cè)框架窗口的組件事件監(jiān)聽器
?
??????? JPanel jpanel = new JPanel();????????????????? ?//流布局,居中
??????? this.getContentPane().add(jpanel,"North");
??????? ButtonGroup buttongroup = new ButtonGroup();?? ?//按鈕組
??????? colors = new JRadioButton[3];
??????? colors[0] = new JRadioButton("red",true);??????? ?? //創(chuàng)建單選按鈕
??????? colors[0].setForeground(Color.red);
??????? buttongroup.add(colors[0]);?????????????????? ? //單選按鈕添加到按鈕組
??????? jpanel.add(colors[0]);???????????????????????? ?//單選按鈕添加到子面板
??????? colors[0].addActionListener(this);
?
??????? colors[1] = new JRadioButton("green");
??????? colors[1].setForeground(Color.green);
??????? buttongroup.add(colors[1]);
??????? jpanel.add(colors[1]);
??? ????colors[1].addActionListener(this);
?
??????? colors[2] = new JRadioButton("blue");
??????? colors[2].setForeground(Color.blue);
??????? buttongroup.add(colors[2]);
??????? jpanel.add(colors[2]);
??????? colors[2].addActionListener(this);
???????
????? ??helix = new HelixCanvas(Color.red);
??????? this.getContentPane().add(helix,"Center");
??????? this.setVisible(true);
??? }
??? public void actionPerformed(ActionEvent e)???????????? //選中單選按鈕時(shí)
??? {
??????? if (e.getSource() == colors[0])??????????????? ????//(colors[0].isSelected())
??????????? helix.setColor(Color.red);
??????? if (e.getSource() == colors[1])
??????????? helix.setColor(Color.green);
??????? if (e.getSource() == colors[2])
??????????? helix.setColor(Color.blue);
??????? helix.repaint(); ???????????????????????????????????//重畫
??? }
??? public void componentResized(ComponentEvent e)????????? //改變窗口大小時(shí)
??? {
??????? helix.repaint();??????????????????????????????????? //重畫
??? }
??? public void componentMoved(ComponentEvent e)??? {? }
??? public void componentHidden(ComponentEvent e)?? {? }
??? public void componentShown(ComponentEvent e)??? {? }
??? public static void main(String arg[])
??? {
??????? new HelixJFrame();
??? }
}
?
class HelixCanvas extends Canvas?????????????????????????? //畫布組件
{
??? private Color color;?????????????????????????????????? //顏色
??? public HelixCanvas(Color color)
??? {
??????? this.setColor(color);
??? }
??? public void setColor(Color color)
??? {
??????? this.color = color;
??? }
??? public void paint(Graphics g)????????????????????????? ?//在Canvas上作圖
??? {
??????? int x0,y0;????????????????????????????????????? ??? //原點(diǎn)坐標(biāo)
??????? x0 = this.getWidth() /2;?????????????????????????? ?//寬度
??????? y0 = this.getHeight()/2;
??????? g.setColor(color);??????????????????? ????????????? //設(shè)置畫線顏色
??????? g.drawLine(x0,0,x0,y0*2);
??????? g.drawLine(0,y0,x0*2,y0);
??????? int i,x,y;
??????? double pi=3.14,angle,r,a=0.5;
??????? while (a<10)?????????????????
??????? {
??????????? for (i=0;i<4000;i++)
??????????? {
????????????? ??angle = i*pi/512;
??????????????? r = a*angle;
??????????????? x =(int) Math.round(r*angle*Math.cos(angle));
??????????????? y =(int) Math.round(r*angle*Math.sin(angle));
??????????????? g.fillOval(x0+x,y0+y,1,1);???
?????????? }
?????????? a+=10;????? ?????????????????
??????? }
??? }
}
4.對(duì)數(shù)螺線
?
5.雙曲螺線
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
?
public class TestDui extends JFrame implements ComponentListener,ItemListener
{
private JComboBox combobox_color;
public TestDui ()
{
super("雙曲螺線");
this.setSize(600,400);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLayout(new FlowLayout());
Object data[] = {Color.red,Color.green,Color.CYAN,Color.blue};
combobox_color = new JComboBox(data);
combobox_color.addItemListener(this);
this.add(combobox_color);
this.addComponentListener(this);
this.setVisible(true);
}
public void paint(Graphics g)
{
int x0,y0;
x0=this.getWidth()/2;
y0=this.getHeight()/2;
g.setColor((Color)combobox_color.getSelectedItem());//設(shè)置線的顏色為組合框選中的顏色
g.drawLine(x0, 0, x0, y0*2);
g.drawLine(0, y0, x0*2, y0);
int j=20;
double a,b,c=300;
while(j <100)
{
?for(a=36000.0;a>0;a-=0.1)
? {
?? b=c/a;
? int? x=(int)(b*Math.cos(a)+300);
? int? y=(int)(b*Math.sin(a)+300);
?? g.drawLine(x0,y0,x,y);
? ?x0=x;y0=y;
? }
j=j+10;
} }
public void itemStateChanged(ItemEvent e)
{
repaint();
}
public void componentResized(ComponentEvent e)
{
repaint();
}
public void componentHidden(ComponentEvent arg0) {
// TODO Auto-generated method stub
}
public void componentMoved(ComponentEvent arg0) {
// TODO Auto-generated method stub
}
public void componentShown(ComponentEvent arg0) {
// TODO Auto-generated method stub
}
public static void main(String args[])
{
new TestDui();
}
}
?
6.伯努利雙紐線
7.三夜玫瑰線
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RoseJFrame_JColorChooser extends JFrame implements ComponentListener, ActionListener
{
??? private RoseCanvas rose;
??? private JButton button_color;
??? public RoseJFrame_JColorChooser()
??? {
??????? super("三葉玫瑰線");??????????????????????? ??? //邊布局
??????? this.setSize(600,400);
??????? this.setDefaultCloseOperation(EXIT_ON_CLOSE);
??????? this.addComponentListener(this);??????????????? ??? //注冊(cè)框架窗口的組件事件監(jiān)聽器
??????? JPanel jpanel = new JPanel();????????????????? ?//流布局,居中
??????? this.getContentPane().add(jpanel,"North");
??????? button_color = new JButton("選擇顏色");
??????? jpanel.add(button_color);
??????? button_color.addActionListener(this);
??????? rose = new RoseCanvas(Color.red);
??????? this.getContentPane().add(rose,"Center");
??????? this.setVisible(true);
??? }
??? public void actionPerformed(ActionEvent e)?????? //選中單選按鈕時(shí)
??? {
??????? if (e.getSource() == button_color)
??????? {
??????????? Color color = JColorChooser.showDialog(this,"選擇顏色",Color.blue);
??????????? rose.setColor(color);
??????????? rose.repaint();??????????????????????????????? ?//重畫
??????? }
??? }
??? public void componentResized(ComponentEvent e)????? //改變窗口大小時(shí)
??? {
??????? rose.repaint();???????????????? ??????????????????? //重畫
??? }
??? public void componentMoved(ComponentEvent e)??? {? }
??? public void componentHidden(ComponentEvent e)?? {? }
??? public void componentShown(ComponentEvent e)??? {? }
??? public static void main(String arg[])
??? {
????? ??new RoseJFrame_JColorChooser();
??? }
}
class RoseCanvas extends Canvas??????????????????????????? ?//畫布組件
{
??? private Color color;?????????????????????????????????? ?//顏色
???
??? public RoseCanvas(Color color)
??? {
??????? this.setColor(color);
??? }
??? public void setColor(Color color)
??? {
??????? this.color = color;
??? }
??? public void paint(Graphics g)????????????????????? //在Canvas上作圖
??? {
??????? int x0,y0;??????????????????????????????????????? ? //原點(diǎn)坐標(biāo)
??????? x0 = this.getWidth() /2;??? ??????????????????????? //寬度
??????? y0 = this.getHeight()/2;
??????? g.setColor(color);? ????????????????????????????//設(shè)置畫線顏色
??????? g.drawLine(x0,0,x0,y0*3);
??????? g.drawLine(0,y0,x0*2,y0);
??????? int j=40;
??????? while (j<200)
??????? {
???????? ???for (int i=0;i<1023;i++)
??????????? {
??????????????? double angle = i*Math.PI/512;
??????????????? double radius = j*Math.sin(2*angle);
??????????????? int x =(int) Math.round(radius * Math.cos(angle) );
??????????????? int y =(int) Math.round(radius * Math.sin(angle));
??????????????? g.fillOval(x0+x,y0+y,1,1);?? //畫直徑為1的圓就是一個(gè)點(diǎn)
??????????? }
??????????? j += 20;
??????? }
??? }
}
?
8.四葉玫瑰線 見課本。