第七章:输入和输出流
第一节:数据流的基本概念
1. 在java中,把不同类型的输入、输出源抽象为流,其中输入或输出的数据成为数据流,用统一的接口表示。
2. 数据流是指一组有顺序的、有起点和终点的字节集合。程序从键盘接收数据或向文件中写数据,都可以使用数据流来完成。
3. 流分为输入数据流和输出数据流。输入数据流只能读不能写;而输出数据流只能写不能读。从数据流中读取数据是,必须有一个数据源与该数据流相连
(FileInputStream in = new FileInputStream(“javatest.txt”);)(实例化)
4. Java.io 包中提供了表示数据流的4个基本抽象类(不可以实例化),分别是InputStream、OutputStream、Reader和Writer。因此涉及数据流操作的程序中,几乎都要使用引入语句:import java.io.*
5. 为了使对象的状态能够方便地永久保存下来,java.io包中又提供了以字节流为基础的用于对象的永久化保存状态的机制,通过实现ObjectInput和Object Output接口来完成。
6. 输入数据流提供的主要操作方法有:(得到-1,标志数据流结束)
int read(): 从输入流读取一个字节的二进制数据
int read( byte [ ] b):将多个字节读到数组中,填满整个数组
int read( byte [ ] b ,int off , int len): 从输入流中读取长度为len的数据,从数组b 中下标为off的位置开始放置读入的数据,读毕返回读取的字节数。
7. void close(): 关闭数据流
int available(): 返回目前可以从数据流中读取的字节数
long skip(long l): 跳过数据流中指定数量的字节不读取,返回值表示实际跳过的字节数
8. 如需要反向读取数据流,则使用回推操作(Push Back)
Boolean markSupported(): 用于测试数据流是否支持回推操作
void mark(int): 用于标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小。
void reset(): 将输入流重新定位到对此流最后调用mark方法时的位置
9. 输出数据流提供的主要操作方法有:
void write(int i): 将字节i写入到数据流
void write( byte [ ] b): 将数组b[ ]中的全部b.length个字节写入数据流
void write( byte [ ] b ,int off , int len): 将数组b[ ]中从下标off开始的len个字节写入 数据流
void close(): 当结束对输出流的操作是应该将其关闭
void flush(): 刷新此输出流并强制写出所有缓冲的输出字节
第二节:基本字节数据流类
1. 文件数据流包括FileInputStream和FileOutputStream,这两个类用来进行文件的I/O处理,其数据源或数据终点都应当是文件;不支持方法mark()和reset()。
2. 缓冲区数据流有BufferInputStream和BufferOutputStream,它们实在数据流上增加了一个缓冲区,都属于过滤器数据流。
3. 读写数据时,数据以块(大小可设置)为单位先进入缓冲区,其后的读写操作作用于缓冲区;采用这个办法可以降低不同硬件设备之间速度的差异,提高I/O操作的效率。
4. 一般在关闭一个缓冲区输出流之前,应先使用flush()方法,强制输出剩余数据。
5. 数据数据流DataInputStream和DataOutputStream(Data可以是int long double Boolean string .........)
DataInputStream中包含方法:int readInt() ; Bollean readBoolean() .........
DataOutputStream中包含方法:void writeInt( int a) ; void
writeBoolean(boolean a) .........
6. java中对象读取功能通过java.io包中的ObjectInputStream和ObjectOutputStream类实现。
7. 读对象用方法readObject()把数据流以Object类型返回,返回内容应该在转换为正确的类型之后再执行该类的方法:
Data d = null;
ObjectInputStream s = new ObjectInputStream(data.txt);
d = (Data) s.readObject(d); //要转为正确的类型Data
8. 能够记录自己的状态一遍将来得到复原的能力,成为对象的持久性。
9. 把对象转换为字节序列的过程称为对象的序列化,把字节序列转化为对象称为反序列化。
10. 如果变量是另一个对象的引用,则引用的对象也要序列化。这个过程是递归的,保存的 结果可以看做是一个对象网。
11. Serializable 接口中没有定义任何方法,只是作为一个标记来指示实现该接口的类可以进行序列化,而没有实现该接口的类的对象不能长期保存其状态。
12. 只有实现Serializable 接口的类才能被序列化。
13. 要序列化一个对象,必须与特定的对象输入/输出流联系起来;该功能通过ObjectInputStream和ObjectOutputStream类实现。
14. 序列化只能保存对象的非静态成员变量,而不能保存任何成员方法和静态成员变量,并且保存的只是变量的值,对于变量的任何修饰符都不能保存,访问权限对于数据域的序列化没有影响。
15. Thread 对象或流对象,对于这样的成员变量,必须用transient关键字标明,否则编译器将报错,任何用transient关键字标明的成员变量都不会被保存。
16. 如果一个对象结构表中包含了一个对不可持久化对象的引用,而这个引用已用关键字transient加以标记,则这个对象仍可以被持久化
第三节:基本字符流
1. java.io 包中有专门用于字符流处理的抽象类——Reader和Writer,它们只提供了一系列用于字符流处理的接口;它们的方法和InputStream和OutputStream类类似。
2. InputStreamReader和OutputStreamWriter类是字节流和读者、写者的接口,用来在字节流和字符流之间作为中介,其构造方法如下:
InputStreamReader(InputStream in): 默认规范
InputStreamReader(InputStream in, String enc): 指定规范enc (如Unicode、8859_1)
OutputStreamWriter (OutputStream out): 默认规范
OutputStreamWriter (OutputStream out String enc):指定规范enc (如Unicode、8859_1)
3. 在进行java字符与其他平台转换时如果不进行特定声明,单纯构造一个读者或写者连接到一个数据流,则将字节码作为默认情况和Unicode进行转换。
4. java,io包中提供了缓冲流BufferReader和BufferWriter;其构造方法与BufferInputStream和BufferOutputStream类似;除了read()和write()方法外,还提供了整行字符处理方法:
public String readLine(): 从输入流中读取一行字符,行结束标志为‘\\n’、‘\\r’或两者一起
public void newline(): 向输出流中写入一个行结束标志
5. 把BufferReader或BufferWriter正确连接到InputStreamReader或OutputStreamWriter的末尾需要在BufferWriter中使用flush()方法,以强制清空缓冲区内容,防止遗漏。
第四节:文件处理
1. java.io包中提供了File类,用于处理与文件相关的操作;File对象可以用来生成与文件(及其所在的路径)或目录结构相关的对象
2. 创建新的File对象可以用的一下三种构造方法:
第一种方法: File myfile;
myfile = new File(“java.txt”); 适合应用程序只用到一个文件时
第二种方法: myfile = new File(“/”,“java.txt”); 适合应用程序只用到多个文件时
第一种方法: File mydir = new File(“/”);
myfile = new File(mydir , “java.txt”); 适合应用程序只用到多个文件时
3. 与文件名相关的方法:
String getName(): 获取文件名
String getPath(): 获取文件路径
String getAbsolutePath(): 获取文件绝对路径
String getParent(): 获取文件父目录名称
boolean renameTo(File newName): 更改文件名,成功返回true 否则返回false
4. 文件测定方法
boolean exists(): 文件对象是否存在
boolean canWriter(): 文件对象是否可写
boolean canReader(): 文件对象是否可读
boolean isFile(): 文件对象是否是文件
boolean isDiretory(): 文件对象是否是目录
boolean isAbsolute(): 文件对象是绝对路径
5. 常用文件信息和方法
long lastModified(): 获取文件最后修改时间
long length(): 获取文件长度
boolean delete(): 删除文件对象指向的文件,成功返回true,否则返回false
6. 目录工具
boolean mkdir(): 创建新目录
boolean mkdirs(): 创建新目录 (可以一次生成多个层次的子目录)
String[ ] list(): 列出符合模式的文件名
7. java提供了RandomAccessFile类来处理随机访问文件的输入/输出。
8. 创建一个随机访问文件的方法:mode是指(只读r或者读写rw)
使用文件名: myrafile = new RandomAccessFile(String name ,String mode);
使用文件对象: myrafile = new RandomAccessFile(File file ,String mode);
9. java语言提供了移动文件读写指针的几个方法
long getFilePointer(): 返回文件指针当前位置
void seek(long pos): 将文件指针置于指定的绝对位置,位置值以从文件开始处的字节偏移量pos来计算,pos为0代表文件的开始
long length(): 返回文件的长度 位置值为length() 代表文件的结尾
10. 如果文件的读写指针已经移至文件的末尾,若在这之后使用任何流的write()方法,那么所写入的信息都将添加到原文件之后
第八章:图形界面设计
第一节:AWT与Swing
1. 设计图形用户界面时一般有三个步骤,分别是选取组件、设计布局及响应事件。
2. Swing组件与AWT组件最大的不同是Swing组件在实现时不包含任何本地代码,因此Swing组件可以不受硬件平台的,而具有更多的功能。
3. 基于AWT的界面可能会因运行平台的不同略有差异,而基于Swing的界面在任何平台上显示效果都是一致的。
4. 不包含本地代码的Swing组件被称为“轻量级”组件,而包含本地代码的AWT组件被称为“重量级”组件。当“重量级”组件与“轻量级”组件一同使用时,如果组件区域有重叠,则“重量级”组件总是显示在上面。
5. Swing组件比AWT组件拥有更多的功能,在Java2平台上推荐使用Swing组件。
第二节:容器
1. 组件可以分为容器组件和非容器组件。
2. 容器组件是指可以包含其他组件的组件,又分为顶层容器和一般用途容器。而非容器组件必须包含在容器中。
3. 显示在屏幕上的所有组件都必须包含在某个容器中,有些容器可以嵌套,在这个嵌套的层次的最外层,必须是一个顶层容器。还有一些容器不能当做顶层容器的,例如,JPanel(面板)和JscrollPane(滚动面板)。
4. Java为所有容器类定义了父类Container,容器的共有操作都定义在Container类
中。
5. Swing中的4种顶层容器,分别是JFrame、JApplet、JDialog和JWindow
6. JFrame是一个带有标题行和控制按钮(最小化、恢复/最大化、关闭)的窗口,有时称为框架,创建应用程序时需要使用JFrame。创建小程序时使用JApplet,它被包含在浏览器窗口中。创建对话窗口时使用JDialog。JWindow是一个不带标题行和控制按钮的窗口,通常很少使用。
7. JFrame类常用的构造方法:
JFrame(): 构造一个初始时不可见、无标题的新框架窗体
JFrame(String 标题): 创建一个初始时不可见、具有指定标题的新框架窗体
8. JFrame定义和继承的方法:
void setVounds(int x, int y, int 宽, int 高): 移动并调整框架大小。左上角位置的横纵坐标分别由x和y指定,框架宽高分别由宽和高指定
void setSize(int 宽, int 高): 设置框架的大小
void setBackground( Color.red): 使用颜色red(可选)设置框架的背景色
void setVisible(Boolean true/false): 设置框架可见或不可见
void pack(): 调整框架的大小,以适合其子组件的首选大小和布局
void setTiele(String 标题): 设置框架的标题(String 类型)
void setLayout(LayoutManager manager): 设置布局管理器
Container getContainerPane(): 返回此框架窗体的内容窗格对象
9. 4个顶层容器中每一个都有一个内容窗格。除菜单之外,顶层容器中的组件都放在这个内容窗格中。
10. 有两种方法可以将组件放入内容窗格中:
第一种方法:通过顶层容器个getContentPane()方法获得其默认的内容窗格。getContentPane()方法的返回类型为java.awt.Container,它仍然是一个容器。然后将组件添加到内容窗格中。
Container contentPane = frame.getContentPane();
contentPane.add(button, BorderLayout.CENTER);
第二种方法:创建一个新的内容窗格,以取代顶层容器默认的内容窗格。通常的做法是创建一个Jpanel的实例,它是java.awt.Container的子类。然后将组件添加到Jpanel实例中,在通过顶层容器的setContentPane()方法将Jpanel实例设置为新的内容窗格。
JPanel contentPane = new JPanel(); //创建JPanel实例
contentPane.setLayout(new BorderLayout()); //创建布局管理器
contentPane.add(button, BorderLayout.CENTER); //添加组件
framer.setContentPane(contentPane); //添加内容窗格
11. 普通面板(Jpanel)和滚动面板(JScrollPane)都是用途广泛的容器。与顶层容器不同,面板不能存在,必须被添加到其他容器内部。面板可以嵌套。
12. 当组件过多而不能再显示区域内全部显示时,滚动面板可以让容器带滚动条,从而显示出全部的组件。
13. JPanel类常用的构造方法:
JPanel(): 创建具有FlowLayout布局的新面板
JPanel(LayoutManager manager): 创建具有指定布局管理器的新面板
使用public Component add(Component comp): 方法可以将指定组件追加到面板中
14. JScrollPane是带有滚动条的面板,它是Container类的子类。但只能添加一个组件。所以当有多个组件需要添加时,一般先将多个组件添加到JPanel中,然后再讲这个JPanel添加到JScrollPane中。
第三节:标签及按钮
1. 标签(JLable)对象是简单的的Swing组件,通常用于显示提示性的文本信息或图标,不可被编辑。
2. 标签(JLable)的构造方法的6种形式:
JLable(): 创建一个不显示文本信息和图标的空标签
JLable(Icon image): 创建一个显示图标的标签
JLable(String text): 创建一个显示文本信息的标签
JLable(Icon image, int horizontalAlignment): 创建一个显示图标的标签,水平对齐方式由int型参数horizontalAlignment指定
JLable(String text, int horizontalAlignment): 创建一个显示文本信息的标签,水平对齐方式由int型参数horizontalAlignment指定
JLable(String text , Icon image, int horizontalAlignment): 创建一个同时显示图标和文本信息的标签,水平对齐方式由int型参数horizontalAlignment指定
horizontalAlignment可选的参数是:JLable.LEFT(左对齐),JLable.RIGHT(右对齐)和JLable.CENTER(居中对齐)
3. 修改标签上的图标的方法:void setIcon(Icon icon)
修改标签上的文本信息的方法:void setText (String text)
4. 按钮(JButton)是Java图形用户界面的基本组件之一
5. 经常用到的4种形式:JButton(普通按钮)、JToggleButton(切换按钮)、JChekBox(复选按钮)和JRadioButton(单选按钮),它们均是AbstractButton的子类或间接子类。
6. 各种按钮都可以设置文本、设置图标、注册事件监听程序。
7. 在AbstractButton中定义了按钮所共有的一些方法,例如:addActionListener()、setEnabled()、setText()和setIcon()等
8. JButton最简单的按钮常用的构造方法:
JButton():创建一个没有文本信息和图标的按钮
JButton (Icon icon): 创建一个显示有图标但没有文本信息的按钮
JButton (String text): 创建一个显示文本信息但没有图标的按钮
JButton (String text, Icon image): 创建一个有显示图标和文本信息的按钮
9. JToggleButton具有两种状态的按钮,即选中状态和未选中状态,默认未选中状态。
10. JToggleButton切换按钮常用的构造方法:
JToggleButton ():创建一个没有文本信息和图标的切换按钮
JToggleButton (Icon image, boolean selected): 创建一个显示图标和指定初始状态但没有文本信息的切换按钮
JToggleButton (Icon icon): 创建一个显示有图标但没有文本信息的切换按钮
JToggleButton (String text): 创建一个显示文本信息但没有图标的切换按钮
JToggleButton (String text, Icon image): 创建一个有显示图标和文本信息的切换按钮
JToggleButton (String text, boolean selected): 创建一个显示文本信息和指定初始状态但没有图标的切换按钮
JToggleButton (String text, Icon image , boolean selected): 创建一个有显示图标和文本信息和指定初始状态的切换按钮
11. JCheckBox(复选按钮)和JRadioButton(单选按钮)都是JToggleButton(切换按钮)的子类,构造方法与JToggleButton相同,它们也具有选中和未选中状态,默认未选中状态。
12. 在JToggleButton类中定义了一个isSelected()方法,通过该方法可以获知按钮的当前状态;当返回值为true时表示选中状态,而返回值为false时表示未选中状态。
第四节:布局管理器
1. 容器中包含了组件。组件的的布局,包括各组件的位置和大小,通常由布局管理器
负责安排。
2. 每个容器,例如JPanel或者顶层容器的内容窗格,都有一个默认的布局管理器,可以通过容器的setLayout()方法改变容器的布局管理器。
3. FlowLayout定义在java.awt包中,这个布局管理器对容器中组件进行布局的方式是将组件逐个的放置在容器的一行上,一行放满后就另起一个新行。
4. FlowLayout布局管理器的三种构造方法:
FlowLayout(): 创建一个默认的FlowLayout布局管理器,居中对齐,默认的水平和垂直间距是5个像素
FlowLayout(int align): 创建一个默认的FlowLayout布局管理器,对齐方式是指定的,默认的水平和垂直间距是5个像素
FlowLayout(int align, int 水平间距, int 垂直间距): 创建一个默认的FlowLayout布局管理器,对齐方式是指定的以及指定水平和垂直间距
align的可取值有FlowLayout.LEFT、FlowLayout.RIGHT和FlowLayout.CENTER三种方式。
5. 与其他布局管理器不同的是,FlowLayout布局管理器并不强行设定组件的大小,而是允许组件拥有它们自己希望的尺寸。每一组件都有一个getPreferredSize()方法,容器的布局管理器会调用这一方法取得每一组件希望的大小。
6. BorderLayout是顶层容器中内容窗格的默认布局管理器,它提供了一种较为复杂的组件布局方案。每个由BorderLayout管理的容器被划分为5个区域,分别代表容器的上部(North)、下部(South)、左部(West)、右部(East)和中部(Center)分别使用常量BorderLayout.NORTH
、
BorderLayout.SOUTH
、
BorderLayout.WEST
、
BorderLayout.EAST和 BorderLayout.CENTER来表示。在容器的每个区域,可以加入一个组件。
7. BorderLayout定义在java.awt包中,其构造方法有两种:
BorderLayout(): 构造一个组件之间没有间距的新的BorderLayout布局管理器
BorderLayout(int 水平间距, int 垂直间距):用指定的组件之间的水平和垂直间距构造一个BorderLayout布局管理器
8. 在BorderLayout布局管理器下组件必须通过add()方法加入到容器的指定区域。
9. 如果在add()方法中没有指定将组件放到哪个区域,则默认地会被放置在Center区域
10. 在容器的每一个区域内,只能加入一个组件,如果试图向某个区域加入多个组件,那么只有最后一个是有效的。
11. GridLayout是一个网格式的布局管理器,它将容器空间划分成若干行乘若干行的网格,组件依次放入其中,每个组件占据一格。
12. GridLayout定义在java.awt包中,有3中构造方法:
GridLayout(): 创建一个只有一行的网格,网格的列数根据实际需要而定
GridLayout(int 行数, int 列数): 创建具有指定行数和列数的网格布局
GridLayout(int 行数, int 列数, int 水平间距, int 垂直间距): 创建具有指定行数和列数且具有水平间距和垂直间距的网格布局
构造方法中,行数和列数中的一个值可以为0,但是不能两个都是0,如果行数为0,那么行数会根据实际需要而定,反之亦然。
13. 网格每列的宽度都是相同的,网格每行的高度也是相同的。
14. 组件被放入容器的次序决定了它所占据的位置。每行网格从左至右依次填充,一行用完之后转入下一行。
15. BridLayout与BorderLayout布局管理器类似,当容器的大小改变时,GridLayout所管理的组件的相对位置不会发生变化,但组件的大小会随之改变。
16. CardLayout定义在java.awt包中的布局管理器,这是一种卡片式的布局管理器,它将容器中的组件处理为一系列卡片,每一时刻只显示出其中的一张,而容器充当卡片的容器。
17. 当容器第一次显示时,第一个添加到CardLayout对象的组件为可见组件。
18. 卡片的顺序由组件对象本身在容器内部的顺序决定的。
19. CardLayout的两种构构造方法:
CardLayout(): 创建一个默认的无间距的新的CardLayout布局管理器。
CardLayout(int 水平间距, int 垂直间距): 创建一个具有指定的水平和垂直间距的新的CardLayout布局管理器。
20. 除了可以使用add()方法将组件加入容器外,CardLayout还有以下一些常用方法:
public void first(Container parent): 翻到容器的第一张卡片
public void next(Container parent): 翻到指定容器的下一张卡片。如果当前的可见卡片是最后一张,则此方法翻转到布局的第一张卡片。
public void previous(Container parent): 翻到指定容器的前一张卡片。如果当前的可见卡片是第一张,则此方法翻转到布局的最后一张卡片。
public void last(Container parent): 翻到容器的最后一张卡片
public void show(Container parent, String name): 翻转到已添加到此布局的具有指定那么的卡片。如果不存在这样的卡片,则不发生任何操作。
21. BoxLayout是定义在javax.swing包中的另一种常用布局管理器,它将容器中的组件按水平方向排成一行或按垂直方向排成一列。当组件排成一行时,每个组件可以有不同的宽度,当组件排成一列时,每个组件可以有不同的高度。
第五节:事件处理
1. 在java程序运行时,用户在程序界面所进行的操作称为用户事件。对事件的响应称为事件处理。
2. java中,为了便于管理,系统将事件分类,称为事件类型。系统为每个事件类型提供一个侦听程序接口,它规定了接收并处理该类事件的方法的规范。
3. 为了接收处理某类用户事件,组件必须注册相应的事件处理程序,这种事件处理程序称为事件侦听程序(Listener,也称侦听器),它是实现了对应侦听程序接口的一个类。要作为侦听程序对象的类必须实现相应的接口,并实现接口中规定的响应事件的方法。
4. 事件被直接送往产生这个事件的组件,组件需要注册一个或多个侦听程序。侦听程序的类中包含了事件处理程序,用来接收和处理这个事件。这种处理事件的机制称为委托事件处理模型。
5. 事件处理的步骤如下:
第一:程序中引入java.awt.even包。
import java.awt.even;
第二:给所需的事件源对象注册事件侦听程序。
事件源对象.addXXXListener(XXXListener);
第三:实现相应的方法。若某个侦听程序接口包含多个方法,则需要实现所有方法。
6. 在适配器类中实现了相应接口中的全部方法,只是方法的内容为空。
第六节:绘图基础
1. 可以使用java.awt包中的Color类来定义和管理颜色。Color类的每个对象表示一种颜色。
2. 可以有两种方法生成颜色:
第一种:使用Java的Color类中预定义的颜色
第二种:通过红、绿、蓝三原色的值来组合
Color myColor = new Color(r, g, b); //r、g、b取值[0--255]
3. 可以使用下面两个定义在JComponent中的方法设置组件前景色和背景色:
public void setForeground(Color c): 设置前景色
public void setBackground(Color c): 设置背景色
4. 显示文字的方法主要有以下3种:
public void drawChars(char[ ] data, int offset, int length, int x, int y):使用此图形
上下文的当前字体和颜色显示字符数组data中从offset位置开始、最多length个字符。首字符的基线位于此图形上下文坐标系统的(x, y)处。
public void drawstring(String str, int x, int y):在指定位置显示字符串str
public void drawBytes(byte[ ] data, int offset, int length, int x, int y):使用此图形上下文的当前字体和颜色显示由指定的byte数组data中从offset位置开始、最多length个字符。首字符的基线位于此图形上下文坐标系统的(x, y)处。
5. 文字字形有字体、样式及字号3个要素
6. 创建Font的构造方法:
Font(String 字体名称, int 字体样式, int字号) //顺序不能变
7. Font类中常用的方法:
setFont(Font f): 对组件中文本字体进行设定,这个方法需要java.awt.Font类的一个实例做参数
String getName(): 返回Font的逻辑名称,即字体名称
int getSize(): 返回此Font的字号大小,舍入为整
int getStyle(): 返回此Font的样式
Boolean isBold():测试此Font对象的样式是否为BOLD
Boolean isItalic():测试此Font对象的样式是否为ITALIC
Boolean isPl1in():测试此Font对象的样式是否为PLAIN
8. Graphics类是所有图形上下文的抽象父类,允许应用程序在组件以及屏幕图像上进行绘制。
9. 绘图模式主要分为两种,分别是正常模式和异或模式。
10. Graphic2D拥有更强大的二维图形处理能力,提供对几何形状、坐标转换、颜色管理以及文字布局等更复杂的控制。
11. Graphic2D有以下一些属性:
stroke属性控制线的宽度
paint属性控制填充效果
transform属性控制图形平移、缩放和斜切等变换操作
12. 使用Graphic2D类的新方法画一个图形的步骤通常是:
第一:先在重画方法painComponent()或pain()中,把参数对象g强制转换为Graphic2D对象
第二:用上述图形类提供的静态方法Double()创建该图形的对象。
第三:以图形对象为参数调用Graphic2D对象的draw()方法绘制这个图形。
第九章:Swing组件
第一节:组合框与列表
1. 组合框(JComboBox)是一个下拉式菜单,它有两种形式:不可被编辑和可编辑的。
2. JComboBox常用的构造方法:
JComboBox(): 创建一个没有任何可选项的默认组合框
JComboBox(Object[ ] items): 根据Object数组创建组合框,Object数组的元素即为组合框中的可选项。
3. JComboBox类中定义的相关方法:
void addItem(Object anObject): 在末尾添加新的可选项
Object getItemAt(int index): 返回指定索引序号index处的可选项
int getItemCount(): 返回列表中的项数
void insertItemAt(Object anObject, int index): 在index指定的位置添加新的可选
项anObject
int getSelectedIndex(): 返回列表中与给定项匹配的第一个选项的索引序号
Object getSelectedItem(): 返回当前所选项
void removeAllItems(): 删除所有可选项
void removeItem(Object anObject): 删除由对象anObject指定的可选项
void removeItemAt( int anIndex): 删除由anIndex指定处的可选项
4. 在组合框对象创建之后,默认是不可编辑的,可以通过setEditable(true)方法将其设置为可编辑的。
5. 列表(JList)是可供用户进行选择的一系列可选项。
6. 列表(JList)常用的构造方法如下:
JList(): 构造一个空列表
JList(Object[ ] listData): 构造一个列表,列表的可选项由对象数组listData指定
JList(Vector >listData): 构造一个列表,使其显示指定Vector中的元素
7. 列表(JList)类中定义了相关的方法,常用的方法有:
public int getSelectedIndex():返回所选项第一次出现的所有;如果没有所选项则返回-1
public Object getSelectedValue(): 返回所选的第一个值,如果选择为空,则返回null
public void setVisibleRowCount(int visibleRowCount):设置不适用滚动条可以在列表中显示的首选行数
第二节:文本组件
1. 文本组件可用于显示信息和提供用户输入功能,在Swing中提供了文本域(JTextField)、口令输入域(JPasswordField)、文本区(JTextArea)等多个文本组件,这些文本组件都有一个共同的父类——JTextComponent
2. 在JTextComponent中定义了文本组件所共有的一些方法:
String getSelectedText(): 从文本组件中提取被选中的文本内容
String getText(int offs, int len): 从文本组件中提取范围的文本内容
void select(int start, int end): 在文本组件中选中指定的起始和结束位置之间的内容
void selectAll(): 在文本组件中选中所有文本内容
void serEditable(boolean b): 设置为可编辑或不可编辑状态
void setText(String t): 设置文本组件中的文本内容
void setDocument(Document doc): 设置文本组件的文档
void copy(): 复制选中的文本到剪贴板
void cut(): 剪切选中的文本到剪贴板
3. 文本域(JTextField)是一个单行的文本输入框,可用于输入少量文本
4. 文本域(JTextField)常用的构造方法如下:
JTextField(): 构造一个空文本域
JTextField(int columns): 构造一个具有指定列数的空文本域,int型参数columns指定文本域列数
JTextField(String text): 构造一个显示指定初始字符串的文本域,String型参数text指定要显示的初始字符串
JTextField(String text, int columns):构造一个具有指定列数并显示指定初始字符串的文本域,String型参数text指定要显示的初始字符串,int型参数columns指定文本域的列数
5. 文本域(JTextField)常用的方法:
void addActionListener(ActionListener l): 添加指定的操作侦听器,接收操作事件
void removeActionLisener(ActionListener l):移除指定的操作侦听器,不再接收操作事件
void setFont(Font f): 设置当前字体
void setHorizontalAlignment(int alignment): 设置文本的水平对齐方式。有效值包括JTextField.LEFT、JTextField.CENTER、JTextField.RIGHT、JTextField.LEADING和JTextField.TRAILING
int getColumns(): 返回文本域的列数
6. 可以用setEditable(boolean)方法将文本域设定为可编辑或不可编辑状态
7. 文本区(JTextArea)是一个多行多列的文本输入框。
8. 文本区(JTextArea)常用的构造方法如下:
JTextArea(): 构造一个空文本区
JTextArea(String text): 构造一个显示指定初始字符串的文本区,String型参数text指定要显示的初始字符串
JTextArea(int rows, int columns): 构造一个具有指定行数和列数的空文本区,int型参数rows和columns分别指定文本区的行数和列数
JTextArea(String text, int rows, int columns): 构造一个而具有指定行数和列数并显示指定初始字符串的文本区,String型参数text指定要显示的初始字符串,int型参数rows和columns指定文本区的行数和列数
9. 文本区(JTextArea)常用的方法:
void append(String str):将指定的文本str追加到文本区
void insert(String str, int pos):将指定文本str插入到文本区的特定位置pos处
void replaceRange(String str, int start, int end):用指定文本str替换文本区中从起始位置start到结尾位置end的内容
第三节:菜单组件
1. 菜单也是最常用的GUI组件之一,Swing包中提供了多种菜单组件,包括菜单栏(JMenuBar)、菜单项(JMenuItem)、JMenu、复选菜单项(JCheckBoxMenuItem)、单选菜单项(JRadioButtonMenuItem)和弹出菜单(JPopupMenu)等。
2. 菜单有下拉式菜单和弹出式菜单两种。
3. 菜单栏(JMenuBar)是窗口中的主菜单,用来包容一组菜单。
4. 菜单栏(JMenuBar)只有一种构造方法,即JMenuBar()
5. 如果将整个菜单系统看做是一棵树,那么菜单项(JMenuItem)就是这棵树的叶子,
是菜单系统的最下面。
6. 菜单项(JMenuItem)常用的构造方法如下:
JMenuItem(): 创建不带有设置文本或图标的菜单项
JMenuItem(Icon icon): 创建一个只显示图标的菜单项,图标由Icon型参数icon指定
JMenuItem(String text): 创建一个只显示文本的菜单项,文本由String型参数text指定
JMenuItem(String text, Icon icon): 创建一个同时显示文本和图标的菜单项,文本由String型参数text指定,图标由Icon型参数icon指定。
JMenuItem(String text, int mnemonic): 创建一个显示文本并且有快捷键的菜单项,文本由String型参数text指定,快捷键由int型参数mnemonic指定
7. 复选菜单项(JCheckBoxMenuItem)和单选菜单项(JRadioButtonMenuItem)是两种特殊的菜单项。
8. 复选菜单项(JCheckBoxMenuItem)前面有一个小方框。
9. 单选菜单项(JRadioButtonMenuItem)前面有一个小圆圈。
10. 复选菜单项(JCheckBoxMenuItem)和单选菜单项(JRadioButtonMenuItem)
都有选中或不选中的操作,因此在构造方法中可以用boolean型参数指定菜单项的初始状态。
第四节:对话框
1. 对话框(JDialog)是一个临时的可移动的窗口,且要依赖于其他窗口,当它所依赖的窗口消失或最小化是,对话框也将消失。当窗口还原时,对话框会自动恢复。
2. 一般要先创建一个窗口类,在创建一个对话框类,且让对话框依附于窗口。
3. 对话框(JDialog)分为强制型和非强制型两种。强制型对话框被关闭之前,其他窗口无法接收任何形式的输入,也就是该对话框过程不能中断,这样的窗口也称为模式窗口;非强制型对话框可以中断对话过程,区响应对话框之外的事件。
4. 对话框(JDialog)的构造方法如下:
JDialog(Dialog owner): 创建一个没有标题但将指定的对话框作为其所有者的无模式对话框
JDialog(Dialog owner, Boolean modal): 创建一个没有标题但有指定所有者的对话框,boolean型参数modal指定对话框是有模式或无模式。
JDialog(Dialog owner String title): 创建一个有标题和指定所有者的无模式对话框
JDialog(Dialog owner String title, Boolean modal): 创建一个有标题和指定所有者的对话框,boolean型参数modal指定对话框是有模式或无模式。
JDialog(Frame owner): 创建一个没有标题但有指定的框架作为其所有者的对话框,
JDialog(Frame owner), Boolean modal): 创建一个没有标题但有指定的框架作为其所有者的对话框,boolean型参数modal指定对话框是有模式或无模式。
JDialog(Frame owner String title): 创建一个有标题和指定所有者框架的无模式对话框
JDialog(Frame owner String title, Boolean modal): 创建一个有标题和指定框架所有者的对话框,boolean型参数modal指定对话框是有模式或无模式。
5. 刚刚创建的对话框(JDialog)是不可见的,需要调用setVisible(true)方法才能将其显示出来;当对话框不需要显示时,调用setVisible(false)方法可以隐藏对话框。
6. 对话框可对各种窗口事件进行侦听,例如激活窗口和关闭窗口等。与框架类似,对话框也是顶层容器,可以向对话框的内容窗格添加各种组件。
7. JDialog类通常用于创建自定义的对话框,除此之外,在Swing中还提供了显示标准对话框的JOptionPane类。
8. 在JOptionPane类中定义了多个showXxxDialog形式的静态方法,可以分为4种:
showConfirmDialog:确认对话框,显示问题,要求用户进行确认(yes/no/cancel)
showInputDialog:输入对话框,提示用户进行输入
showMessageDialog:信息对话框,显示信息,告知用户发生了什么情况
showOptionDialog:选项对话框,显示选项,要求用户进行选择
9. 文件对话框(JFileChooser)是专门用于对文件(或目录)进行浏览和选择的对话框。
10. 文件对话框(JFileChooser)常用的构造方法有如下3种:
JFileChooser(): 构造一个指向用户默认目录的文件对话框
JFileChooser(File currentDirectory): 使用给定的File作为路径来构造一个文件对话框
JFileChooser(String currentDirectoryPath): 构造一个给定路径的文件对话框
第十章:多线程
第一节:线程和多线程
1. 系统要投入运行时,系统从程序入口开始按语句的顺序完成相应指令直至结尾,再从出口退出,整个程序结束,这样的语句进程,它是程序的依次动态执行,对应了从代码加载、执行至执行完毕的一个完整过程;或者说进程就是程序在处理机中的一次运行。在这样一个结构中不仅包括了程序代码,同时也包括了系统资源的概念。
2. 一个进程既包括其所要执行的指令,又包括执行指令所需的任何系统资源,如,CPU、内存空间、I/O端口等,不同进程所占用的系统资源相对。
3. 线程是进程执行过程中产生的多条执行线索,是比进程更小的执行单位,形式上同进程非常相似。不同的是,它没有入口,也没有出口,因此其自身不能自动运行,而必须栖身于某一进程之中,由进程触发执行。
4. 在系统资源的使用上,属于同一进程的所有线程共享该进程的系统资源,但是线程之间切换速度比进程切换要快得多。
5. 为了达到多线程的效果,Java语言把线程环境当作一个封装对象,包含CPU及自己的程序代码和数据,由虚拟机提供控制;Java类库中的类java.lang.Thread允许创建这样的线程,并可控制所创建的线程。
6. 在Java中,线程有以下3部分组成:
一:虚拟CPU,封装在java.lang.Thread类中,它控制着整个线程的运行
二:执行的代码,传递给Thread类,由Thread类控制按序执行
三:处理的数据,传递给Thread类,代码执行过程中所要处理的数据
7. 线程所要完成的功能,是通过方法run()来完成的,run()称为线程体,包含在一个特定的对象中。
8. 线程一共4种状态,分别是新建(New)、可运行状态(Runnable)、死亡(Dead)及阻塞(Blocked)。
9. 中断线程:在程序中常常调用interrupt()来终止线程;interrupt()不仅可以中断在
运行的线程,而且也能中断处于阻塞(Blocked)状态的线程。
第二节:创建线程
1. 创建线程有两种方法,一种是定义一个继承Thread类的子类,一种是实现Runnable接口。
2. 用Thread类的子类创建线程的过程包括以下3步:
一:从Thread类派生一个子类,在类中一定要实现run()
二:然后用该类创建一个对象
三:用start()方法启动线程
3. Runnable创建线程的步骤: //Runnable只有一个run()方法,所有要创建Thread对象
public class Demo implements Runnable{ //创建Demo类实现Runnable接口
public void run(){} //重写Run()方法
Demo demo = new Demo(); //创建真实角色,demo类
Thread test = new Thread(demo,“线程”); //创建代理角色+真实角色的引用
“线程”代表线程的名字,可写可不写
test.start(); //启动线程
}
4. 创建线程两种方法的适用条件:
一:实现Runnable接口方法的情况:因为Java只允许单重继承,如果一个类已经继承了Thread类就不能继承其他类,在一些情况下,这就被迫采用实现Runnable的方法。
二:继承Thread方法的情况:当一个run()方法置于Thread类的子类中时,this实际上是引用控制当前运行系统的Thread实例。
第三节:线程的基本控制
1. 虽然一个线程已经被创建,但它实际上并没有立刻运行。要使线正地在Java环境中运行,必须通过方法start()来启动,start()方法也在Thread类中。
2. API中提供了一下有关线程的操作方法:
start(): 启动线程对象,让线程从新建状态转为就绪状态
run(): 用来定义线程对象被调度之后所执行的操作,用户必须重写run()方法
yield(): 强制终止线程执行
isAlive(): 测试当前线程是否在活动
sleep(int XX): 是线程休眠一段时间,时间长度XX毫秒
void wait(): 使线程处于等待状态
3. 在Java中,线程调度通常是抢占式,而不是时间片式。
4. 抢占式调度是指可能多个线程准备运行,但只有一个在真正运行;一个线程获得执行权,这个线程将持续运行下去,直到它运行结束或因为某种原因而阻塞,或者有另一个高优先级线程就绪,最后一种情况称为低优先级被高优先级线程所抢占。
5. 每个线程都有一个优先级,java的线程调度采用如下的优先级策略:
一:优先级高的先执行,优先级低的后执行
二:每个线程创建时都会被自动分配一个优先级,默认时,继承其父类的优先级
三:任务紧急的线程,其优先级较高
四:同优先级的线程按“先进先出”的调度原则
6. Thread类有3个与线程优先级有关的静态量,分别如下:
MAX_PRIORITY: 最高优先级,值为10
MIN_PRIORITY: 最低优先级,值为1
NORM_PRIORITY: 默认优先级,值为5
7. java.lang.Thread类中有关优先级的几个常用的方法如下:
void setPriority(int newPriority): 重置优先级为newPriority
int getPriority(): 获得当前线程优先级
static void yield(): 暂停当前正在执行的线程,即让当前线程放弃执行权
8. sleep()调用允许低优先级进程运行,而yield()方法只给同优先级进程以运行机会。
9. 在程序代码中,可以利用Thread类中的静态方法currentThread()来引用正在运行的线程。
10. 有几种方法可以用来暂停一个线程的运行,暂停一个线程也称为挂起。在挂起之后,必须重新唤醒线程进入运行状态。
一:sleep()方法用于暂时停止一个线程的执行。通常线程不是休眠期满后就立刻被唤醒,因为此时其他线程可能正在执行,而重新调度会发生的情况是:被唤醒的线程具有更高的优先级;正在执行的线程因为其他原因被阻塞;程序处于支持时间片的系统中。
二:wait()方法导致当前的线程等待,知道其他线程调用此对象的notify()方法或notifyAll()方法,才能唤醒线程。
三:join()方法将引起现线程等待,直至jion()方法所调用的线程结束。
第四节:线程的互斥
1. 在Java语言中,引入了“对象互斥锁”的概念,也称为监视器,使用它来实现不同线程对共享数据操作的同步;“对象互斥锁”阻止多个线程同时访问同一个条件变量;Java可以为每一个对象的实例配有一个“对象互斥锁”。
2. 在Java语言中,有两种方法可以实现“对象互斥锁”:
一:用关键字volatile来声明一个共享数据(变量)
二:用关键字synchronized来声明操作共享数据的一个方法或一段代码
第五节:线程的同步
1. 为了解决线程运行速度的问题,Java提供了一种建立在对象实例之上的交互方法。Java中的每个对象实例都有两个线程队列和它相连:第一个用来排列等待锁定标志的线程;第二个则用来实现wait()和notify()的交互机制。
2. 类java.lang.Object中定义了3个方法,即wait()、notify()和notifyAll()。wait()方法导致当前的线程等待,它的作用就是让当前线程释放其所持有的“对象互斥锁”,进入wait队列(等待队列);而notify()/notifyAll()方法的作用是唤醒一个或所有正在等待队列中等待的线程,并将它(们)移入等待同一个“对象互斥锁”的队列
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baoquwan.com 版权所有 湘ICP备2024080961号-7
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务