第6章习题解答
1.简述Java中设计图形用户界面程序的主要步骤。
对于设计图形用户界面程序而言,一般分为两个步骤:第一步,设计相应的用户界面,并根据需要对相关的组件进行布局;第二步,添加相关的事件处理,如鼠标、菜单、按钮和键盘等事件。
2.试说明容器与组件之间的关系。
组件(component)是图形用户界面中的各种部件(如标签、按钮、文本框等等),所有的组件类都继承自JComponent类。容器(container)是用来放置其他组件的一种特殊部件,在java中容器用Container类描述。
3.阅读下面程序,说明其运行结果和功能。
//filename:MyFrame.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyFrame
{
public static void main(String agrs[]){
JFrame f=new JFrame("简单窗体示例");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel l=new JLabel("习题1");
f.getContentPane().add(l,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
}
程序的运行结果如下:
4.阅读下面程序,说明其运行结果和功能。
//filename:TestButton.java
import java.awt.*;
import javax.swing.*;
public class TestButton extends JFrame
{
JButton b1,b2;
TestButton(String s)
{
super(s);
b1=new JButton("按钮1");
b2=new JButton("按钮2");
setLayout(new FlowLayout());
add(b1);
add(b2);
setSize(300,100);
setVisible(true);
}
public static void main(String args[]){ TestButton test;
test=new TestButton("测试按钮"); }
}
程序的运行结果如下:
5.阅读下面程序,说明其运行结果和功能。
//filename:TestCheck.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestCheck extends JFrame
{
JLabel l1,l2,l3;
TextField name;
CheckboxGroup g;
Checkbox c1,c2,c3,c4,c5;
TestCheck(){}
void go()
{
setTitle("测试选择按钮");
l1=new JLabel("姓名:");
l2=new JLabel("性别:");
l3=new JLabel("爱好:");
name=new TextField(20);
g=new CheckboxGroup();
c1=new Checkbox("男",true,g);
c2=new Checkbox("女",false,g);
c3=new Checkbox("唱歌");
c4=new Checkbox("跳舞");
c5=new Checkbox("上网");
setLayout(new FlowLayout());
add(l1);add(name);
add(l2);add(c1);add(c2);
add(l3);
add(c3);add(c4);add(c5);
pack();
show();
}
public static void main(String[] args){
TestCheck test=new TestCheck();
test.go();
test.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);
}
});
}
}
6.试设计一个计算器程序的界面。
//计算器Count.java
import java.awt.*;
import java.awt.event.*;
class MainPanel extends Panel //Screen Panle class
{
TextField scn=new TextField(""); //TextField screen
String
str[]={"7","8","9","*","4","5","6","-","1","2","3","+","0",".","/","="}; Button btn[]=new Button[str.length];
Button clear=new Button("清除");
String temp,op,tempInKey,keyDown; //??
char opChar; //?
public float num1,num2;
boolean flag;
MainPanel()
{
Panel ScreenPanel = new Panel(); //Screen Panel
ScreenPanel.setLayout(new BorderLayout());//Screen in the north ScreenPanel.add(scn,BorderLayout.CENTER);
scn.disable(); //can not receive event
Panel ButtonPanel = new Panel(); //Button Panel
ButtonPanel.setLayout(new GridLayout(4,4));
for (int i=0;i<16;i++)
{
btn[i]=new Button(str[i]); //new Button
ButtonPanel.add(btn[i]); //add to panel
}
Panel ButtonPane2 = new Panel(); //Button Panel
ButtonPane2.add(clear);
setLayout(new BorderLayout()); //Main panel
add(ScreenPanel,BorderLayout.NORTH);
add(ButtonPanel,BorderLayout.CENTER);
add(ButtonPane2,BorderLayout.SOUTH);
}
}
class CountFrame extends Frame //construct a frame
{
public CountFrame(String title)
{
super(title);
MainPanel t=new MainPanel(); //Main Panel
add(t); //add MainFrame
addWindowListener(new end()); //add listener
}
class end extends WindowAdapter //close the window,inner class {
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
}
class Count //main()
{
public static void main(String args[])
{
CountFrame frm=new CountFrame("JAVA计算器"); frm.setSize(220,180); //new frame,go above
frm.show();
}
}
程序的运行结果为:
7.试设计一个电话簿程序的界面。
//PhoneBook.java
import javax.swing.*;
import java.awt.*;
public class PhoneBook extends JFrame
{
void go()
{
this.setTitle("电话簿程序");
this.setSize(400,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = this.getContentPane();
String[] data = {"张三", "李四", "赵二", "王五"}; JList dataList = new JList(data);
dataList.setSelectedIndex(1); // select "two"
dataList.getSelectedValue(); // returns "two"
JPanel p1=new JPanel();
JPanel p2=new JPanel();
JPanel p3=new JPanel();
p1.setSize(200,400);
contentPane.add(p1,BorderLayout.WEST);
contentPane.add(p2,BorderLayout.CENTER);
contentPane.add(p3,BorderLayout.SOUTH);
p1.add(dataList);
p2.setLayout(new GridLayout(6,1));
JLabel l1=new JLabel("姓名:");
JTextField t1=new JTextField("李四");
JLabel l2=new JLabel("联系电话:");
JTextField t2=new JTextField("023-********"); p2.add(l1);
p2.add(t1);
p2.add(l2);
p2.add(t2);
p3.add(new JButton("添加"));
p3.add(new JButton("删除"));
p3.add(new JButton("修改"));
this.show();
}
public static void main(String[] g)
{
PhoneBook h=new PhoneBook();
h.go();
}
}
8.为6和7题的添加事件处理功能。
第6题加事件处理:
//Count.java
import java.awt.*;
import java.awt.event.*;
class MainPanel extends Panel //Screen Panle class
{
TextField scn=new TextField(""); //TextField screen
String
str[]={"7","8","9","*","4","5","6","-","1","2","3","+","0",".","/","="}; Button btn[]=new Button[str.length];
Button clear=new Button("清除");
String temp,op,tempInKey,keyDown; //??
char opChar; //?
public float num1,num2;
boolean flag;
MainPanel()
{
Panel ScreenPanel = new Panel(); //Screen Panel
ScreenPanel.setLayout(new BorderLayout());//Screen in the north ScreenPanel.add(scn,BorderLayout.CENTER);
scn.disable(); //can not receive event
keyInput kPut=new keyInput(); //keyAction
scn.addKeyListener(kPut);
Panel ButtonPanel = new Panel(); //Button Panel
ButtonPanel.setLayout(new GridLayout(4,4));
for (int i=0;i<16;i++)
{
btn[i]=new Button(str[i]); //new Button
ButtonPanel.add(btn[i]); //add to panel
btn[i].addActionListener(new lsn());
btn[i].addKeyListener(kPut); //buttons be listened }
Panel ButtonPane2 = new Panel(); //Button Panel
ButtonPane2.add(clear);
clear.addActionListener(new lsn());
clear.addKeyListener(kPut);
setLayout(new BorderLayout()); //Main panel
add(ScreenPanel,BorderLayout.NORTH);
add(ButtonPanel,BorderLayout.CENTER);
add(ButtonPane2,BorderLayout.SOUTH);
}
class lsn implements ActionListener //listener
{
public void actionPerformed(ActionEvent e)
{
temp=scn.getText(); //save the numbers on screen first
if (flag)
{
temp= ""; //clear the numbers on the screen
flag=false;
}
if (e.getActionCommand()=="+" |e.getActionCommand()=="-"
|e.getActionCommand()=="*" |e.getActionCommand()=="/")
{ //if operation clicked
if (scn.getText().equals("") ) //等于时没有内容的处理 return;
num1=Float.parseFloat(scn.getText());
op=e.getActionCommand(); //operation type
scn.setText("");
}
else if (e.getActionCommand()=="=") //calculate
{
try{
if (scn.getText().equals("") ) //等于时没有内容的处理 return;
num2=Float.parseFloat(scn.getText());
if (op=="+")
num2=num1+num2;
else if (op=="-")
num2=num1-num2;
else if (op=="*")
num2=num1*num2;
else if (op=="/")
{
if(num2 < 0.0000001 & num2>0.00000001)
{
scn.setText("0不能做除数");
flag=true;
return;
}
num2=num1/num2;
}
scn.setText(String.valueOf(num2));
flag=true;
}
catch(ArithmeticException ex)
{
System.out.println(ex.toString());
}
}
else if (e.getActionCommand()=="清除") //clear
scn.setText("");
else //add to screen
scn.setText(temp+e.getActionCommand()); //setText
}
}
class keyInput extends KeyAdapter
{
public void keyPressed (KeyEvent k)
{
if ((k.getKeyCode()>47 & k.getKeyCode()<58) | (k.getKeyCode()>96 & k.getKeyCode()<112)
|k.getKeyCode()==10)
{
tempInKey=scn.getText(); //num1
keyDown=String.valueOf(k.getKeyChar()); //char to String
System.out.print(k.getKeyChar());
if (flag)
{
tempInKey= ""; //clear the numbers on the screen
flag=false;
}
if (k.getKeyChar()=='+'|k.getKeyChar()=='-'|k.getKeyChar()=='*'| k.getKeyChar()=='/')
{
if (scn.getText().equals("") ) //等于时没有内容的处理
return;
num1=Float.parseFloat(scn.getText());
opChar=k.getKeyChar();
scn.setText("");
}
else if (k.getKeyChar()=='='|k.getKeyCode()==10) //calculate
{
try{
System.out.println(opChar);
if (scn.getText().equals("") ) //等于时没有内容的处理 return;
num2=Float.parseFloat(scn.getText());
if (opChar=='+')
num2=num1+num2;
else if (opChar=='-')
num2=num1-num2;
else if (opChar=='*')
num2=num1*num2;
else if (opChar=='/')
{
if(num2 < 0.0000001 & num2>0.00000001)
{
scn.setText("0不能做除数");
flag=true;
return;
}
num2=num1/num2;
}
scn.setText(String.valueOf(num2));
flag=true;
}
catch(ArithmeticException ex)
{
System.out.println(ex.toString()); }
}
else
scn.setText(tempInKey+keyDown); //set }
else
return;
}
}
}
class CountFrame extends Frame //construct a frame
{
public CountFrame(String title)
{
super(title);
MainPanel t=new MainPanel(); //Main Panel
add(t); //add MainFrame
addWindowListener(new end()); //add listener
}
class end extends WindowAdapter //close the window,inner class {
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
}
class Count //main()
{
public static void main(String args[])
{
CountFrame frm=new CountFrame("JAVA计算器");
frm.setSize(220,180); //new frame,go above
frm.show();
}
}
第7题加事件处理:
//PhoneBook.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PhoneBook extends MouseAdapter implements ActionListener {
JFrame mainFrm;
JTextField t1;
JTextField t2;
JList dataList;
String[] data;
String[] phone;
int now=-1;
void go()
{
mainFrm=new JFrame();
mainFrm.setTitle("电话簿程序");
mainFrm.setSize(400,200);
mainFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);