Java语言程序设计 备考整理 因教材过于陈旧建议仅作复习使用
Java语言程序设计
考试用书: 《Java语言程序设计》(第三版)
出版社:清华大学出版社
作者:邵丽萍、绍光亚、张后扬
出版时间:2008
第8章 图形用户界面
Swing类的层次结构
容器
可以添加其它组件的组件被称为容器。
窗口容器
JFram是一个用来创建窗口的类,它是一个顶级容器框架,在其中可以添加各种组件。
使用方式:
import javax.swing.*;
public class JF0 extends JFrame {
public JF0 (String s){
super(s); //调用父类构造方法
setBounds(200,200,500,400); //设置大小
setVisible(true); //设置是否显示
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // 显示窗口外观
}catch (Exception e){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //处理如果外观显示未成功 则关闭窗口对象
}
}
}
对话框容器
对话框(Dialog类)是GUI中常见的窗口对象。对话框和普通窗口最大的区别是对话框是依附在某个窗口上的,一旦它所依附的窗口关闭了,对话框也要随着关闭。在对话框窗口中也可以添加其它组件,所以它也是一个容器。
import javax.swing.*;
public class JD extends JDialog {
public JD (JFrame f, String s){
super(f,s); //调用父类构造方法
setBounds(300,300,200,200); //设置大小
setVisible(true); //设置是否显示
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); //设置默认关闭方法
}
}
面板容器
面板(JPanel)类是一个无边框的容器,可以包含其它面板或组件,使用面板的目的是为了区分层次,分区域管理各种组件。面板与顶级容器不同,它是一个中间容器,它即是容器又是组件。一个窗口中可以添加多个面板对象。
import javax.swing.*;
import java.awt.*;
public class JP1 extends JFrame {
public JP1(JFrame f, int x, int y, int w, int h){
Container c = getContentPane(); //通过JFrame 自带的方法创建面板
c.setLayout(null);
c.setBackground(Color.ORANGE);
f.add(c); //添加面板到 f
JPanel p = new JPanel(); //通过new的方式创建面板
p.setBounds(x,y,w,h);
p.setBackground(Color.blue);
c.add(p);//添加面板到面板c
}
}
JP1 jp1 = new JP1(new JF0("添加面板的窗口"),100,50,200,200);
组件
组件(JComponent)是构成GUI的基本要素,通过对不同事件的响应来完成和用户的交互或组件之间的交互。组件一般作为一个对象放置在容器内。通过容器的add方法可以吧组件加入到容器中。
这部分主要是实践会考,还是多练习熟悉方法和结构。
JLabel //标签组件
JButton //按钮组件
TextField //文本框组件
JTextArea //文本区组件,多行文本
JRadioButton //单选按钮组件
JCheckBox //复选框组件
JComBoBox //下拉列表组件
组件布局管理
组件布局管理器管理各个组件的位置,在容器中使用setLayout方法可以调用不同的布局管理器。
顺序布局管理器
顺序布局(FlowLayout) 是最基本的布局管理器。把组件一个一个从左到右排列,一行排满之后转到下一行继续排列。它会根据容器大小随时调整容器中的组件大小。
边界布局管理器
边界布局(BorderLayout)管理器把容器分为5个区:北区、南区、东区、西区和中区。
边界布局只能容纳5个组件即东、南、西、北、中。(可以嵌套组件,但是嵌套的一层只能有5个组件)
卡片布局管理器
卡片布局(CardLayout)管理器可以管理多个组件,它将组件像卡片一样叠放起来,每次只显示一个。
网格布局管理器
网格布局(GridLayout)管理器把容器区域分成若干个网格,每个网格可以放一个组件。
创建网格布局管理器时可以给出网格的行数和列数。
组件的精确定位方式
容器中存放组件也可以不用布局管理器。
//第一步
setLayout(null); //先通过设置布局管理器为null
//第二步
setBounds(int x, int y, int w, int h); //xy是组件左上角的坐标点,wh是组件的大小。
事件处理机制
Jav的事件处理机制
- 事件:程序和用户的交互是通过事件实现的。实现发生后会交给事件处理的方法进行处理,如果没有编写处理方法,程序就不能和用户交互,事件将被忽略。
- 事件处理方法:当发生事件时做出的反应,通过监听器对象可以对事件源对象进行监听,当监听到事件时,就可以调用事件处理方法处理事件问题。
- 事件处理模型:事件源对象、事件监听器对象、事件对象。
(1)能产生事件的组件叫做事件源,如按钮。
(2)事件监听器注册在事件源对象(按钮或包含按钮的容器上),用来监听事件是否发生,当事件发生时将调用事件处理方法解决问题。
(3)事件对象用来封装已发生的事件信息,在事件发生后,将信息传递给事件处理方法进行处理。
通过自定义内部类创建监听器对象
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JB1 extends JFrame {
public JB1(JFrame f, JPanel p){
f.add(p);
p.add(new Label("按一下可以听到响声", Label.CENTER));
Button b = new Button("按钮");
p.add(b);
BHandler h = new BHandler();
b.addActionListener(h);
}
public static void main(String args[]){
JB1 jb1 = new JB1(new JF0("单击按钮事件"), new JPanel());
}
private class BHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Toolkit.getDefaultToolkit().beep();
}
}
}
在注册时通过匿名类直接创建监听器对象
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JB2 extends JFrame {
public JB2(JFrame f, JPanel p){
f.add(p);
p.add(new Label("按一下可以听到响声", Label.CENTER));
Button b = new Button("按钮");
p.add(b);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Toolkit.getDefaultToolkit().beep();
}
});
}
public static void main(String args[]){
JB1 jb1 = new JB1(new JF0("单击按钮事件"), new JPanel());
}
}
通过主类创建监听对象
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JB3 extends JFrame implements ActionListener {
public JB3(JFrame f, JPanel p){
f.add(p);
p.add(new Label("按一下可以听到响声", Label.CENTER));
Button b = new Button("按钮");
p.add(b);
b.addActionListener(this);
}
public static void main(String args[]){
JB1 jb1 = new JB1(new JF0("单击按钮事件"), new JPanel());
}
@Override
public void actionPerformed(ActionEvent e) {
Toolkit.getDefaultToolkit().beep();
}
}
实现多个事件接口的方式
一般是在主类实现多个接口,然后注册这些接口的实现。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class DrawLine extends Applet implements MouseListener, MouseMotionListener {
int x1, y1, x2 , y2;
public void init(){
addMouseListener(this);
addMouseMotionListener(this);
}
public void pain(Graphics g){
g.drawLine(x1, y1, x2 , y2);
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
事件适配器类与内部类
java.awt.event 包中还声明了一组带Adapter标记的类,称为适配器类。它们是一些抽象类,其中声明方法与接口方法相同。使用Adapter 可以不用实现全部的方法,实现精简代码的目的。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class DrawLine extends Applet implements MouseListener, MouseMotionListener {
int x1, y1, x2 , y2;
public void init(){
addMouseListener(new M1());
addMouseMotionListener(new M2());
}
public void pain(Graphics g){
g.drawLine(x1, y1, x2 , y2);
}
private M1 extends MouseAdpter {
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
}
}
private M2 extends MouseMotionAdpter {
public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
repaint();
}
}
}
内部类
Java中可以把一个类声明为另一个类的成员。这样的类被称为内部类。
内部类可以无条件的使用主类的所有成员,包括私有成员。内部类的作用域仅限于包容它的主类。
内部类可以被声明为static、最终类、抽象类。
创建容器与组件的基本步骤小结
(1)创建顶级容器(通常为窗体对象)。
(2)创建内容面板,设置背景颜色,设置布局管理器。
(3)创建普通面板,设置背景颜色,设置位置、大小,设置布局管理器。
(4)创建组件,设置背景颜色,设置其位置、大小、字体等。
(5)将面板添加到窗口,将组件添加到指定面板。
(6)创建事件监听器,实现事件接口方法。
(7)给事件源注册监听器。
第9章 高级组件
菜单栏
菜单栏是图形用户界面的重要组成部分,主要由菜单棒(MenuBar)、菜单(Menu)、菜单项(MenuItem)和复选菜单项(CheckBoxMenuItem)等对象组成。