6-1 什么是组件?组件类与普通类有什么不同?
【答】组件是构成图形用户界面的基本成分和核心元素;组件是具有以下特性的对象:运行时可见,能拥有并管理其他组件,在窗口中可操纵,可获得输入焦点等。组件类Component是一个抽象类,是AWT组件类层次结构的根类,它提供对组件操作的通用方法。
6-2 设计Windows应用程序的图形用户界面需要哪些基本知识?
【答】需要掌握Java组件的使用方法,理解委托事件处理模型,掌握多种布局方式。
6-3 什么是容器组件?它有什么特点?Java提供了哪些容器组件?
【答】容器组件是一种能够容纳其他组件的特殊组件。特点:能容纳其他组件,并在其可视区域内显示这些组件。Java提供了窗口(window)和面板(panel)两种容器。
6-4 窗口与对话框有什么不同?框架与面板有什么不同?
【答】对话框是窗口类的子类,对话框也是一种可移动的窗口,不能作为应用程序的主窗口,它依赖于一个框架窗口而存在,当框架窗口关闭时,对话框也关闭。框架类是一种带标题栏并且可以改变大小的窗口;它是窗口类的子类,所以它可以独立存在,可被移动,可被最大化和最小化,有标题栏、边框、可添加菜单栏;而面板不能独立存在,必须包含在另一个容器里,面板没有标题,没有边框,不可添加菜单栏。
6-5 什么是事件?什么是事件源?事件处理程序写在哪里?
【答】事件是指一个状态的改变,或者一个活动的发生。产生事件的组件称为事件源。事件处理程序写在事件监听器接口中声明的方法中。如:单击事件的事件处理程序由ActionListener接口中的actionPerformed()方法实现。
6-6 如何理解Windows应用程序的图形用户界面是事件驱动的?
【答】一个组件的多个事件之间,多个组件的多个事件之间,其事件处理方法的执行次序是有规律的:1.不同组件的事件或同一组件的不同事件具有约定的执行次序。2.各组件的事件处理方法是否执行以及执行次序,取决于用户操作。3.在一个事件处理方法中,程序按照语句的书写次序顺序执行。
6-7 说明Java的委托事件模型。
【答】事件源产生一个事件,并把这个事件发送到一个或多个监听程序,监听程序只是等待这个事件并处理它,然后返回。即程序把事件的处理“委托”给一段“代码”。
6-8 设计图形用户界面的Java应用程序,需要用到的组件分别在哪些包中?事件分别在哪些包中?
【答】 组件在java.awt包中,事件在java.awt.Event和javax.swing.Event包中。
6-9 按钮组件能够注册哪些事件监听器?文本行组件能够注册哪些事件监听器?文本行和文本区组件能够响应的事件有什么不同?
【答】按钮组件能够注册的事件监听器有ActionListener、ComponentListener、ItemListener等。文本行组件能够注册的事件监听器有ActionListener、ComponentListener、TextListener等。文本行是单行文本编辑框,用于编辑一行字符串,文本区是一个多行文本编辑框,它的基本操作与文本行类似,增加的是滚动条的显示和操作。
6-10 是否可以对一个组件注册多个事件监听器?
【答】可以。如果一个组件需要响应多个事件,则可以注册多个事件监听器。
6-11 一个事件监听器是否可以处理多个组件上产生的操作?
【答】一个事件监听器对应一个事件处理方法,如果多个组件产生的操作相同,则可以注册同一个事件监听器。
6-12 在事件处理方法中,怎样区分不同的事件源组件?
【答】事件接口中的所有事件处理方法,都采用相应的事件对象e作为参数,
用e.getSource()方法可返回产生当前事件对象的事件源组件。
6-13 窗口上有哪些事件?每种事件在什么时候被触发?这些事件的触发次序是怎样的?
【答】窗口上的事件有:
windowOPend,windowActivated,windowDeactivated,windowIconified,windowDeiconified,windowClosing,windowClosed。每种事件的触发分别在:打开窗口、激活窗口、窗口失去焦点、窗口最小化、窗口恢复、关闭窗口时、关闭窗口后。触发次序与前述书写顺序相同。
6-14 Java有几种关闭窗口处理方式?分别是怎样的?分别适用于哪些窗口组件?
【答】Java有2种关闭窗口处理方式。第一种是设置窗口关闭时隐藏方式的setDefaultCloseOperation()方法,第二种是写窗口关闭事件处理程序即实现WindowListener接口中的windowClosing()方法。第一种适用于JFrame和JDialog等窗口组件,第二种适用于Frame和Dialog等窗口组件。
6-15 Java的布局方式有什么特点?Java提供了哪些布局方式?
【答】特点:Java采用布局管理器对图形用户界面中的组件进行相对定位并自动改变组件大小,合理分布组件格局。当窗口大小改变时,各组件自身的大小将随之改变,而组件之间的相对位置不变,这样组件一般不会被覆盖。Java提供了FlowLayout、BorderLayout、GridLayout三种布局布局管理器类。
6-16 复选框和单选按钮有什么不同?分别用于什么场合?在事件处理程序中,怎样知道哪个复选框或单选按钮是选中的?
【答】在同一组单选按钮中,任何时候最多只能有一个被选择,一旦选中一个单选按钮,则前一个选中的单选按钮会自动变为未选中状态。而复选框可多个同时被选中,且每个复选框选中与否的状态改变,并不影响其他复选框的状态。场合:单选按钮用来显示一组互斥的选择,复选框用来显示一组不互斥的选择。在事件处理程序中,用注册选择事件监听器的方法来判断复选框或单选按钮是否被选中。
6-17 如果一个编辑框用于输入数值,但程序运行时却输入了非数字字符,问结果会怎样?程序中有哪些办法解决这个问题,怎样解决?
【答】结果会因输入错误而突然停止运行。程序中可以用try—catch捕获、处理异常的方法来解决这个问题。当遇到输入错误时,Java将抛出异常,此时弹出一个提示信息对话框,提醒用户输入数据有错误,请用户重新输入。
6-18 如何将JComboBox编辑框中新输入的值,加入到下拉列表中去,并使新值与下拉列表中原有值不重复?
【答】通过添加单击事件监听器将JcomboBox编辑框中新输入的值加入到下拉列表中。通过if语句来确保新值与下拉列表中原有值不重复。
6-19 如何使菜单项显现为分隔条状态?如何使菜单项显现单选状态?
【答】实现JmenuItem()和addSeparator()方法使菜单项显现为分离条状态。实现JradioButtonMenuItem()方法使菜单项显现单选状态。
6-20 一个菜单中能否加入菜单项?能否加入另一个菜单?
【答】一个菜单中可以加入菜单项,可以加入另一个菜单。
6.21 窗口菜单与快捷菜单有什么差别?
【答】窗口菜单是相对于窗口的,它出现在窗口的标题栏下,总是与窗口同时出现。而快捷菜单则是相对于某个指定组建的,当鼠标指向某个组件并单击右键时,则会弹出快捷菜单,一般比较简单。
6.22 在文本区中,单击右键时欲弹出一个菜单,该怎样设计?
【答】可以在文本区添加一个快捷菜单(popMenu)。
6.23 如果窗口菜单中的某菜单项、快捷菜单中的某菜单项具有相同的菜单标题并执行相同的操作,应该如何设计?
【答】 可以给它们都注册单击事件监听器,那么在事件处理方法actionPerformed()中以e.getActionCommand()方法获得菜单项的标题,由于标题相同,可以执行相同的操作。
6.24 如果希望在组件上绘图,通常在哪些组件上绘图?绘图程序写在哪里?
【答】一般来讲,可以在任何组件上绘图,但由于很多组件上都有标题之类的文字,所以通常在窗口或面板之类的容器上绘制图形。此外,Java提供画布(java.awt.Canvas)组件作为绘制图形的区域。在Java.awt.Component类中声明paint()和repaint()方法用于显示和刷新图形。当创建一个对象时,系统会自动执行该组件的paint()方法,绘制特定图形。因此,如果想在组建上绘图,则该类必须声明为继承某个组件类,让偶将绘图程序写在paint()方法体中就可以了。
6.25 根据以下极坐标放出,画出相应曲线图形。
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[]; //表示颜色的单选按钮数组
private HelixCanvas helix;
public HelixJFrame()
{
super("阿基米德螺旋线"); //边布局
this.setSize(600,700);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.addComponentListener(this); //注册框架窗口的组件事件监听器
JPanel jpanel = new JPanel(); //流布局,居中
this.getContentPane().add(jpanel,"North");
ButtonGroup buttongroup = new ButtonGroup(); //按钮组
colors = new JRadioButton[3];
colors[0] = new JRadioButton("red",true); //创建单选按钮
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.对数螺线
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); //注册框架窗口的组件事件监听器
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.四叶玫瑰线 见课本。