?6-1?什么是組件?組件類與普通類有什么不同?
【答】組件是構成圖形用戶界面的基本成分和核心元素;組件是具有以下特性的對象:運行時可見,能擁有并管理其他組件,在窗口中可操縱,可獲得輸入焦點等。組件類Component是一個抽象類,是AWT組件類層次結構的根類,它提供對組件操作的通用方法。
6-2?? 設計Windows應用程序的圖形用戶界面需要哪些基本知識?
【答】需要掌握Java組件的使用方法,理解委托事件處理模型,掌握多種布局方式。
6-3 ?? 什么是容器組件?它有什么特點?Java提供了哪些容器組件?
【答】容器組件是一種能夠容納其他組件的特殊組件。特點:能容納其他組件,并在其可視區(qū)域內顯示這些組件。Java提供了窗口(window)和面板(panel)兩種容器。
6-4???? 窗口與對話框有什么不同?框架與面板有什么不同?
【答】對話框是窗口類的子類,對話框也是一種可移動的窗口,不能作為應用程序的主窗口,它依賴于一個框架窗口而存在,當框架窗口關閉時,對話框也關閉??蚣茴愂且环N帶標題欄并且可以改變大小的窗口;它是窗口類的子類,所以它可以獨立存在,可被移動,可被最大化和最小化,有標題欄、邊框、可添加菜單欄;而面板不能獨立存在,必須包含在另一個容器里,面板沒有標題,沒有邊框,不可添加菜單欄。
6-5???? 什么是事件?什么是事件源?事件處理程序寫在哪里?
【答】事件是指一個狀態(tài)的改變,或者一個活動的發(fā)生。產生事件的組件稱為事件源。事件處理程序寫在事件監(jiān)聽器接口中聲明的方法中。如:單擊事件的事件處理程序由ActionListener接口中的actionPerformed()方法實現(xiàn)。
6-6?? 如何理解Windows應用程序的圖形用戶界面是事件驅動的?
【答】一個組件的多個事件之間,多個組件的多個事件之間,其事件處理方法的執(zhí)行次序是有規(guī)律的:1.不同組件的事件或同一組件的不同事件具有約定的執(zhí)行次序。2.各組件的事件處理方法是否執(zhí)行以及執(zhí)行次序,取決于用戶操作。3.在一個事件處理方法中,程序按照語句的書寫次序順序執(zhí)行。
6-7? 說明Java的委托事件模型。
【答】事件源產生一個事件,并把這個事件發(fā)送到一個或多個監(jiān)聽程序,監(jiān)聽程序只是等待這個事件并處理它,然后返回。即程序把事件的處理“委托”給一段“代碼”。
6-8?? 設計圖形用戶界面的Java應用程序,需要用到的組件分別在哪些包中?事件分別在哪些包中?
【答】 組件在java.awt包中,事件在java.awt.Event和javax.swing.Event包中。
6-9???? 按鈕組件能夠注冊哪些事件監(jiān)聽器?文本行組件能夠注冊哪些事件監(jiān)聽器?文本行和文本區(qū)組件能夠響應的事件有什么不同?
【答】按鈕組件能夠注冊的事件監(jiān)聽器有ActionListener、ComponentListener、ItemListener等。文本行組件能夠注冊的事件監(jiān)聽器有ActionListener、ComponentListener、TextListener等。文本行是單行文本編輯框,用于編輯一行字符串,文本區(qū)是一個多行文本編輯框,它的基本操作與文本行類似,增加的是滾動條的顯示和操作。
6-10? ? 是否可以對一個組件注冊多個事件監(jiān)聽器?
【答】可以。如果一個組件需要響應多個事件,則可以注冊多個事件監(jiān)聽器。
6-11??? 一個事件監(jiān)聽器是否可以處理多個組件上產生的操作?
【答】一個事件監(jiān)聽器對應一個事件處理方法,如果多個組件產生的操作相同,則可以注冊同一個事件監(jiān)聽器。
6-12??? 在事件處理方法中,怎樣區(qū)分不同的事件源組件?
【答】事件接口中的所有事件處理方法,都采用相應的事件對象e作為參數(shù),
用e.getSource()方法可返回產生當前事件對象的事件源組件。
6-13??? 窗口上有哪些事件?每種事件在什么時候被觸發(fā)?這些事件的觸發(fā)次序是怎樣的?
【答】窗口上的事件有:
windowOPend,windowActivated,windowDeactivated,windowIconified,windowDeiconified,windowClosing,windowClosed。每種事件的觸發(fā)分別在:打開窗口、激活窗口、窗口失去焦點、窗口最小化、窗口恢復、關閉窗口時、關閉窗口后。觸發(fā)次序與前述書寫順序相同。
6-14??? Java有幾種關閉窗口處理方式?分別是怎樣的?分別適用于哪些窗口組件?
【答】Java有2種關閉窗口處理方式。第一種是設置窗口關閉時隱藏方式的setDefaultCloseOperation()方法,第二種是寫窗口關閉事件處理程序即實現(xiàn)WindowListener接口中的windowClosing()方法。第一種適用于JFrame和JDialog等窗口組件,第二種適用于Frame和Dialog等窗口組件。
6-15??? Java的布局方式有什么特點?Java提供了哪些布局方式?
【答】特點:Java采用布局管理器對圖形用戶界面中的組件進行相對定位并自動改變組件大小,合理分布組件格局。當窗口大小改變時,各組件自身的大小將隨之改變,而組件之間的相對位置不變,這樣組件一般不會被覆蓋。Java提供了FlowLayout、BorderLayout、GridLayout三種布局布局管理器類。
6-16 ?? 復選框和單選按鈕有什么不同?分別用于什么場合?在事件處理程序中,怎樣知道哪個復選框或單選按鈕是選中的?
【答】在同一組單選按鈕中,任何時候最多只能有一個被選擇,一旦選中一個單選按鈕,則前一個選中的單選按鈕會自動變?yōu)槲催x中狀態(tài)。而復選框可多個同時被選中,且每個復選框選中與否的狀態(tài)改變,并不影響其他復選框的狀態(tài)。場合:單選按鈕用來顯示一組互斥的選擇,復選框用來顯示一組不互斥的選擇。在事件處理程序中,用注冊選擇事件監(jiān)聽器的方法來判斷復選框或單選按鈕是否被選中。
6-17??? 如果一個編輯框用于輸入數(shù)值,但程序運行時卻輸入了非數(shù)字字符,問結果會怎樣?程序中有哪些辦法解決這個問題,怎樣解決?
【答】結果會因輸入錯誤而突然停止運行。程序中可以用try—catch捕獲、處理異常的方法來解決這個問題。當遇到輸入錯誤時,Java將拋出異常,此時彈出一個提示信息對話框,提醒用戶輸入數(shù)據(jù)有錯誤,請用戶重新輸入。
6-18??? 如何將JComboBox編輯框中新輸入的值,加入到下拉列表中去,并使新值與下拉列表中原有值不重復?
【答】通過添加單擊事件監(jiān)聽器將JcomboBox編輯框中新輸入的值加入到下拉列表中。通過if語句來確保新值與下拉列表中原有值不重復。
6-19 ?? 如何使菜單項顯現(xiàn)為分隔條狀態(tài)?如何使菜單項顯現(xiàn)單選狀態(tài)?
【答】實現(xiàn)JmenuItem()和addSeparator()方法使菜單項顯現(xiàn)為分離條狀態(tài)。實現(xiàn)JradioButtonMenuItem()方法使菜單項顯現(xiàn)單選狀態(tài)。
6-20??? 一個菜單中能否加入菜單項?能否加入另一個菜單?
【答】一個菜單中可以加入菜單項,可以加入另一個菜單。
6.21 窗口菜單與快捷菜單有什么差別?
【答】窗口菜單是相對于窗口的,它出現(xiàn)在窗口的標題欄下,總是與窗口同時出現(xiàn)。而快捷菜單則是相對于某個指定組建的,當鼠標指向某個組件并單擊右鍵時,則會彈出快捷菜單,一般比較簡單。
6.22 在文本區(qū)中,單擊右鍵時欲彈出一個菜單,該怎樣設計?
【答】可以在文本區(qū)添加一個快捷菜單(popMenu)。
6.23 如果窗口菜單中的某菜單項、快捷菜單中的某菜單項具有相同的菜單標題并執(zhí)行相同的操作,應該如何設計?
【答】 可以給它們都注冊單擊事件監(jiān)聽器,那么在事件處理方法actionPerformed()中以e.getActionCommand()方法獲得菜單項的標題,由于標題相同,可以執(zhí)行相同的操作。
6.24 如果希望在組件上繪圖,通常在哪些組件上繪圖?繪圖程序寫在哪里?
【答】一般來講,可以在任何組件上繪圖,但由于很多組件上都有標題之類的文字,所以通常在窗口或面板之類的容器上繪制圖形。此外,Java提供畫布(java.awt.Canvas)組件作為繪制圖形的區(qū)域。在Java.awt.Component類中聲明paint()和repaint()方法用于顯示和刷新圖形。當創(chuàng)建一個對象時,系統(tǒng)會自動執(zhí)行該組件的paint()方法,繪制特定圖形。因此,如果想在組建上繪圖,則該類必須聲明為繼承某個組件類,讓偶將繪圖程序寫在paint()方法體中就可以了。
6.25 根據(jù)以下極坐標放出,畫出相應曲線圖形。
1.星形線 代碼略 運行結果如下
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());//設置線的顏色為組合框選中的顏色?
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);?????????????? ?//注冊框架窗口的組件事件監(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)???????????? //選中單選按鈕時
??? {
??????? 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)????????? //改變窗口大小時
??? {
??????? 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;????????????????????????????????????? ??? //原點坐標
??????? x0 = this.getWidth() /2;?????????????????????????? ?//寬度
??????? y0 = this.getHeight()/2;
??????? g.setColor(color);??????????????????? ????????????? //設置畫線顏色
??????? 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.對數(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());//設置線的顏色為組合框選中的顏色
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);??????????????? ??? //注冊框架窗口的組件事件監(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)?????? //選中單選按鈕時
??? {
??????? if (e.getSource() == button_color)
??????? {
??????????? Color color = JColorChooser.showDialog(this,"選擇顏色",Color.blue);
??????????? rose.setColor(color);
??????????? rose.repaint();??????????????????????????????? ?//重畫
??????? }
??? }
??? public void componentResized(ComponentEvent e)????? //改變窗口大小時
??? {
??????? 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;??????????????????????????????????????? ? //原點坐標
??????? x0 = this.getWidth() /2;??? ??????????????????????? //寬度
??????? y0 = this.getHeight()/2;
??????? g.setColor(color);? ????????????????????????????//設置畫線顏色
??????? 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的圓就是一個點
??????????? }
??????????? j += 20;
??????? }
??? }
}
?
8.四葉玫瑰線 見課本。