第八章
【练习8.1】
1.A
2.A
3.B
4. 组件是GUI程序的基本组成元素,任何一个GUI就是由若干组件对象构成的。Swing是在AWT基础之上构建的一套新的Java图形界面库,其不再依赖操作系统的本地代码而是自己负责绘制组件的外观,因此也被称为轻量级(Light-weight)组件,这是它与AWT组件的最大区别。Swing中几乎所有的类都直接或间接继承自AWT中的类,另一方面,Swing的事件模型也是完全基于AWT的,因此,AWT和Swing并非两套彼此独立的Java图形库。
5. 容器组件指那些能够“容纳”组件的特殊组件,如窗口、面板、对话框等。容器可以嵌套,即容器中又包含容器。Swing提供的常用容器组件有窗口、面板、可滚动面板、分割面板、分页面板等。
6.①顶层容器:指GUI程序中位于“最上层”的容器,其不能被包含到别的容器中,如窗口、对话框等。
②非顶层容器:位于顶层容器之下的容器,如面板、内部窗口等。
7. JLabel(标签)用于显示文字或图片,不能接受用户的输入。JTextField (文本框) 可以接受用户输入或编辑单行文本。JTextArea(文本区) 接受用户输入或编辑多行文本。JPasswordField(密码输入框) 是JTextField 的子类,两者的主要区别是JPasswordField 不会显示出用户输入的内容,而只会显示出程序指定的一个固定字符,比如'*'。
8. 将多个单选按钮加入到同一个ButtonGroup组对象中构成一组,保证该组按钮任一时刻只能有一个单选按钮被选中。
【练习8.2】
1.C
2.D
3.D
4.D
5.
//BasicSwingComponent.java
1  import java.awt.FlowLayout;
2  import java.awt.event.ItemEvent;
3  import java.awt.event.ItemListener;
4
5  import javax.swing.JButton;
6  import javax.swing.JCheckBox;
7  import javax.swing.JComboBox;
8  import javax.swing.JFrame;
9  import javax.swing.JLabel;
10  import javax.swing.JList;
11  import javax.swing.JPanel;
12  import javax.swing.JPasswordField;
13  import javax.swing.JRadioButton;
14  import javax.swing.JScrollPane;
15  import javax.swing.JTextArea;
16  import javax.swing.JTextField;
17
18  public class BasicSwingComponent {
19
20  public static void main(String[] args) {
21  JFrame win = new JFrame("JFrame");
22  win.setSize(300, 300);
java程序设计教程 机械工业出版社 崔淼 电子书23  win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
24  win.setLayout(new FlowLayout());
25
26  JPanel jp1 = new JPanel();
27  JPanel jp4 = new JPanel();
28  JLabel label1 = new JLabel("用户名:");
29  jp1.add(label1);
30  JTextField textField = new JTextField(10);
31  jp1.add(textField);
32  jp4.add(new JLabel("口令:"));
33  JPasswordField pfd = new JPasswordField(10);
34  pfd.setEchoChar('*');
35  jp4.add(pfd);
36
37  JPanel panel2 = new JPanel();
38  JLabel label12 = new JLabel("性别:");
39  panel2.add(label12);
40  JRadioButton radio = new JRadioButton("男");
41  radio.setSelected(true);
42  panel2.add(radio);
43  JRadioButton radio2 = new JRadioButton("女");
44  panel2.add(radio2);
45
46  JPanel panel3 = new JPanel();
47  JLabel label3 = new JLabel("爱好:");
48  panel3.add(label3);
49  JCheckBox check = new JCheckBox("运行");
50  panel3.add(check);
51  JCheckBox check2 = new JCheckBox("音乐");
52  check2.setSelected(true);
53  panel3.add(check2);
54  JCheckBox check3 = new JCheckBox("网络");
55  panel3.add(check3);
56
57  JPanel panel4 = new JPanel();
58  JLabel label4 = new JLabel("JComboBox:");
59  panel4.add(label4);
60  String[] majors = { "软件工程", "计算机", "物联网", "大数据" };
61  JComboBox cbxMajor = new JComboBox(majors);
62  cbxMajor.addItemListener(new ItemListener() {
63
64  @Override
65  public void itemStateChanged(ItemEvent e) {
66  String selection=(Item();//获取选择项
67  StateChange()==ItemEvent.SELECTED )
68  System.out.println(selection);
69
70  }});
71  panel4.add(cbxMajor);
72
73  JPanel panel5 = new JPanel();
74  panel5.add(new JLabel("JList:"));
75  JList lst = new JList(majors);
76  panel5.add(lst);
77
78  JTextArea ta = new JTextArea();
79  ta.setText("此处为简介    \n第二行\n第三行\n第四行");
80  ta.setRows(3);
81  ta.setColumns(10);
82  JScrollPane scp = new JScrollPane(ta);
83
84  JPanel panel6 = new JPanel();
85  JButton button = new JButton("提交");
86  panel6.add(button);
87
88  win.add(jp1);
89  win.add(jp4);
90  win.add(panel2);
91  win.add(panel3);
92  win.add(scp);
93  win.add(panel6);
94
95  win.setVisible(true);
96  }
97  }
【练习8.3】
1. D
2. A
3.
①事件源(Event Source):事件的产生者或来源。例如,单击了登录按钮,则登录按钮为事件源。事件源通常是程序界面中某个可交互的组件。
①事件对象(Event Object):事件源产生的事件通常由用户的操作触发,每个事件均被Java运行时环境封装为事件对象。事件对象包含了与该事件相关的必要信息,如鼠标按下事件产生时鼠标指针所处的坐标等。
①事件(Event Listener):用以接收和处理事件的对象。那些用以处理事件的代码所在的类的对象就是事件。
Java运行时环境处理了所有与事件相关的底层逻辑,编程者只需关注以下几个步骤:
①谁负责处理事件——哪个类的对象作为事件。作为的对象所属的类应实现相应的接口(可以有多个,即监听多种事件)。
①监听谁产生的事件——为那些需要被监听的组件添加对象。此步骤一般通过调用组件对象形如addXxxxxListener的方法并传入相应的对象完成。
①如何处理事件——编写事件处理的代码。此步骤通过重写事件接口所定义的一个或多个抽象方法来指定事件处理的细节。
需要注意,编程者重写的事件接口所定义的方法从来不需要编写代码显式调用,当事件产生时,Java运行时环境会自动回调这些方法并传入相应的事件对象。
4.通过“事件对象.getSource()”得到事件源,并与多个组件进行比较。
5. 让实现WindowListener接口,并重写接口的windowClosing方法。
习题8
1、填空
(1)setLocation、setBounds
(2)FlowLayout
(3)BorderLayout
(4)ActionListener
(5)ItemListener
(6)ButtonGroup
(7)事件
2、编程题
(1)
//Crud.java
1  public class Crud extends JFrame implements ActionListener {
2      // 定义组件
3      JPanel jp1, jp2;
4      JButton jbNew, jbDelete, jbSearch, jbSave,jbLast,jbNext;
5      JTextArea ta;
6
7  private JTextField tfSearch;
8
9      public static void main(String[] args) {
10          Crud demo = new Crud();
11          demo.setTitle("备忘录");
12      }
13
14      // 构造函数
15      public Crud() {
16          // 创建组件
17          jp1 = new JPanel();
18          jp2 = new JPanel();
19
20          jbNew = new JButton("新建");
21          jbDelete = new JButton("删除");
22          jbSearch = new JButton("查询");
23          jbSave = new JButton("保存");
24          jbLast = new JButton("上一条");
25          jbNext = new JButton("下一条");
26
27          jbNew.addActionListener(this);
28          jbDelete.addActionListener(this);
29          jbSearch.addActionListener(this);
30          jbSave.addActionListener(this);
31          jbLast.addActionListener(this);
32          jbNext.addActionListener(this);
33
34          ta = new JTextArea("此处为文本区");
35
36          // 设置布局管理器,
37          //JPanel布局默认是BorderLoyout// 添加JPanel
38          //JPanel属于容器类组件,可以加入别的组件
39          jp1.add(new JLabel("关键字"));
40          tfSearch=new JTextField(8);
41          jp1.add(tfSearch);
42          jp1.add(jbSearch);
43          jp1.add(jbNew);
44          jp1.add(jbDelete);
45
46          jp2.add(jbLast);
47          jp2.add(jbNext);
48          jp2.add(jbSave);
49
50          // 把jpanel 加入JFrame
51          this.add(jp1, BorderLayout.NORTH);
52          this.add(ta, BorderLayout.CENTER);
53          this.add(jp2, BorderLayout.SOUTH);
54
55          this.setSize(400, 200);
56          this.setLocation(200, 200);
57          this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
58          this.setVisible(true);
59      }
60
61  @Override
62  public void actionPerformed(ActionEvent e) {
63  Source()==jbSearch) {
64  ta.setText("查询");
65  }else Source()==jbNew) {
66  ta.setText("新建");
67  }else Source()==jbDelete) {
68  ta.setText("删除");
69  }else Source()==jbSave) {
70  ta.setText("保存");
71  }else Source()==jbLast) {
72  ta.setText("上一条");
73  }else Source()==jbNext) {
74  ta.setText("下一条");
75  }
76  }
77  }
(2)
//CalTest.java
1  import java.awt.BorderLayout;
2  import java.awt.FlowLayout;
3  import java.awt.event.ActionEvent;
4  import java.awt.event.ActionListener;
5
6  import javax.swing.JButton;
7  import javax.swing.JComboBox;
8  import javax.swing.JFrame;
9  import javax.swing.JLabel;
10  import javax.swing.JPanel;
11  import javax.swing.JTextField;
12
13  public class CalTest extends JFrame{
14
15      private JTextField firText,secText,reText;
16      private JLabel eqLabel;
17      private JComboBox jbox;
18      private String[] str;
19      private JButton calb,clearb,exitb;
20      private JPanel p,p2;
21
22      public static void main(String[] args) {
23          new CalTest("计算器");
24      }
25
26      public CalTest(){}
27      public CalTest(String title){
28          setTitle(title);
29          setLocation(500, 200);
30          setDefaultCloseOperation(3);
31          setResizable(false);
32          setLayout(new FlowLayout());
33          init();
34          pack();
35          setVisible(true);
36      }
37
38      public void init(){
39
40          p = new JPanel();
41          p.setSize(300, 300);
42          firText = new JTextField(5);
43          secText = new JTextField(5);
44          reText = new JTextField(5);
45          reText.setEditable(false);
46          eqLabel = new JLabel("=");
47
48          str = new String[]{"+","-","*","/"};
49          jbox = new JComboBox(str);
50
51          p.add(firText);
52          p.add(jbox);
53          p.add(secText);
54          p.add(eqLabel);
55          p.add(reText);
56          add(p);
57
58          p2 = new JPanel();
59          calb = new JButton("计算");
60
61          calb.addActionListener(new ActionListener() {
62              public void actionPerformed(ActionEvent arg0) {
63          //getSelectedItem()返回JComboBox所选项,返回Objection类型
64                  String sign = (String) SelectedItem();
65
66                  if(sign.equals("+")){
67                      int num = Integer.Text());
68                      int num2 = Integer.Text());
69                      int add = num+num2;