国产最新a级毛片无码专区_综合亚洲欧美日韩久久精品_日本成年片在线观看66_一本到九九av电影_一级毛片免费网站播放_国内精品久久人无码大片_国产人成视频99在线观看_欧美不卡在线一本二本_国产亚洲电影av_可以免费看黄色软件

知ing

Java程序設(shè)計(jì)實(shí)用教程(第三版)

葉核亞 編 / 電子工業(yè)出版社

? ? ? 上傳

查看本書

第6章 圖形用戶界面


?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.四葉玫瑰線 見課本。


查看更多