教材学习内容总结
第九章
1.处理事件
1.1事件处理模式
事件源:能够产生事件的对象。
监视器:需要一个对象对事件源进行监视,以便对发生的事件做出处理。事件源通过调用相应的方法将某个对象注册为自己的监视器。
addActionListener(监视器);
处理事件的接口:为了让监视器这个对象能对事件源发生的事件进行处理,创建该监视器对象的类必须声明实现相应的接口,即必须在类体中重写接口中所有方法,那么当事件源发生事件时,监视器就自动调用被类重写的接口方法。
1.2ActionEvent事件
ActionEvent事件源
如果用户选择了某个单选按钮,就会触发ActionEvent事件。
注册监视器
ActionEvent事件的组件使用方法addActionListener(ActionListener listen)将实现ActionListener接口的类的实例注册为事件源的监视器。
ActionListener接口
该接口只有一个方法public void actionPerformed(ActionEvent e)。
ActionEvent类中的方法
Public Object getSource() 该方法是从Event继承的方法,ActionEvent事件对象调用该方法可以获取发生ActionEvent事件的事件源对象的引用。
Public String getActionCommand() ActionEvent对象调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个“命令”字符串,对于文本框,当发生ActionEvent事件时,默认的“命令”字符串是文本框中的文本。
1.4IteaEvent事件
ItemEvent事件源:选择框、下拉列表都可以。选择框提供两种状态,一种是选中,一种是未选中。
注册监视器:能触发ItemEvent事件的组件使用addItemListener(ItemListener listen)将实现ItemListener接口的类的实例注册为事件源的监听器。
ItemListener接口:只有一个方法public void itemStateChanged(ItemEvent e)。
ItemEvent事件对象出来可以使用getSource()方法返回发生ItemEvent事件的事件源外,也可以使用getItemSelectable()方法返回发生ItemEvent事件的事件源。
1.5DocumentEvent事件
DocumentEvent事件源:文本区含有一个实现DocumentE接口的实例,该实例被称作文本区所维护的文档,文本区调用getDocument()方法返回所维护的文档。
Document类在javax.swing.event包中。只要用户在文本区中进行文本编辑操作就会导致触发DocumentEvent事件。
注册监视器:事件源使用addDocumentListener(DocumentListener listen)将实现DocumentListener接口的类的实例注册为事件源的监视器。
DocumentListener接口
在javax.swing.event包中,接口中有3个方法:
public void changedUpdate(DocumentEvent e)
public void removeUpdate(DocumentEvent e)
public void insertUpdate(DocumentEvent e)
1.6MouseEvent事件
任何组件上都可以发生鼠标事件,导致MouseEvent类自动创建一个事件对象。事件源注册监视器的方法是addMouseListener(MouseListener listener)。
使用MouseListener接口处理鼠标事件
- 在事件源上按下鼠标;
- 在事件源上释放鼠标;
- 在事件源上单击鼠标;
- 鼠标进入事件源;
- 鼠标退出事件源。
MouseEvent类几个重要方法:
getX()获取鼠标指针在事件源坐标系中的x坐标。
getY()获取鼠标指针在事件源坐标系中的y坐标。
getModifiers()获取鼠标的左键(BUTON1_MASK)或右键(BUTTON3_MASK)。
getClickCount()获取鼠标被单击的次数。
getSource()获取发生鼠标事件的事件源。
MouseListener接口中方法:
mousePressed(MouseEvent)负责处理在组件上按下鼠标键触发的鼠标事件。
mouseReleased(MouseEvent)负责处理在组件上释放鼠标键触发的鼠标事件。
mouseEntered(MouseEvent)负责处理鼠标进入组件触发的鼠标事件。
mouseExited(MouseEvent)负责处理鼠标离开组件触发的鼠标事件。
mouseClicked(MouseEvent)负责处理在组件上单击鼠标键触发的鼠标事件。
使用MouseMotionListener接口处理鼠标事件:
处理已下两种操作:
在事件源上拖动鼠标;
在事件源上移动鼠标。
鼠标事件的类型是MouseEvent,即当发生鼠标事件时,MouseEvent类自动创建一个事件对象。
事件源注册监视器的方法是addMouseMotionListener(MouseMotionListener listener)。
mouseDragged(MouseEvent)负责处理拖动鼠标触发的鼠标事件。
mouseMoved(MouseEvent)负责处理移动鼠标触发的鼠标事件。
1.7焦点事件
组件可以触发焦点事件。可以使用addFocusListener(FocusListener listener)注册焦点事件监视器。当组件获得焦点监视器后,如果组件从无输入焦点变成有输入焦点或者从有输入焦点变成无输入焦点都会触发FocusEvent事件。
从无输入到有输入:public void focusGained(FocusEvent e)
从有输入到无输入:public void focusLost(FocusEvent e)
一个组件也可调用public Boolean requestFocusInWindow()方法会的输入焦点。
1.8键盘事件
当按下、释放或敲击键盘上一个键时就触发了键盘事件。当一个组件处于激活状态时,敲击键盘上一个键就会导致这个组件触发键盘事件。
KeyListener接口的三个方法:
public void KeyPressed(KeyEvent e)(用户按下某个键时)
public void KeyTyped(KeyEvent e)(是KeyPressed和KeyReleased的组合,当键被按下又释放时调用)
public void KeyReleased(KeyEvent e)(用户释放某个键时)
KeyEvent类的public int getKeyCode()方法,可以判断哪个键被按下、敲击或释放。public void getKeyChar()也可以判断。getKeyChar()方法返回键上的字符。
1.9窗口事件
JFrame及子类创建的窗口可以调用setDefaultCloseOperation(int operation)
方法设置窗口的关闭方式。
WindowListener接口:
当一个窗口被激活、撤销激、打开、关闭、图标化或撤销图标化时,就触发了窗口事件,即WindowEvent创建了一个窗口事件。
public void windowActivated(WindowEvent e)(当窗口从非激活状态到激活时)
public void windowDeactivated(WindowEvent e)(当窗口激活状态到非激活状态时)
public void windowClosing(WindowEvent e)(当窗口正在被关闭时)
public void windowClosed(WindowEvent e)(当窗口关闭后)
public void windowIconified(WindowEvent e)(当窗口图标化时)
public void windowDeiconified(WindowEvent e)(当窗口撤消图标化时)
public void windowOpened(WindowEvent e) (当窗口打开时)
WindowAdapter适配器:适配器可以代替接口来处理事件。
1.10匿名类实例或窗口做监视器
匿名类的实例做监视器:如果用内部类的实例做监视器,那么当发生事件时,监视器就比较容易操作事件源所在的外嵌类中的成员。
窗口做监视器:能触发事件的组件经常位于窗口中,如果让组件所在的窗口作为监视器,能让事件的处理比较方便。
2.使用MVC结构
模型-视图-控制器(Model-View-Controller),简称为MVC,其目的是以会话形式提供方便的GUI支持。
模型:用于存储数据的对象。
视图:为模型提供数据显示的对象。
控制器:处理用户的交互操作,对于用户的操作作出响应,让模型和视图进行必要的交互,即通过视图修改、获取模型中的数据;当模型中的数据变化时,让视图更新显示。
MVC结构可以使程序更具有对象化特性,也更容易维护。
2.对话框
2.1消息对话框
消息对话框是有模式对话框,进行一个重要的操作动作之前,最好能弹出一个消息对话框。
public static void showMessageDialog(
Component parentComponent,
String message,
String title,
int messageType)
参数parentComponent指定对话框可见时的位置,如果parentComponent为null,对话框会在屏幕正前面显示出来。message指定对话框上显示的消息,title指定对话框的标题,messageType取值是JOptionPane中的类常量。
2.2输入对话框
输入对话框含有供用户输入文本的文本框、一个确认和取消按钮,是有模式对话框。
public static
String showInputDialog(Component parentComponent,
Object message,
String title,
int messageType)
2.3确认对话框
确认对话框是有模式对话框。返回的具体值依赖于用户所单击的对话框上的按钮和对话框上的关闭图标。
public static int showConfirmDialog(Component parentComponent,
Object message,
String title,
int optionType)
2.4颜色对话框
public static Color showDialog(Component component,
String title,
Color initialColor)
initialColor指定颜色对话框返回的初始颜色。
2.6自定义对话框
创建对话框与创建窗口类似,通过建立JDialog的子类来建立一个对话框类,然后这个类的一个实例,即这个子类创建的一个对象,就是一个对话框。对话框是一个容器,它的默认布局是BorderLayout,对话框可以添加组件,实现与用户的交互操作。
两个常用构造方法:
JDialog() 构造一个无标题的初始不可见的对话框,对话框依赖一个默认的不可见的窗口。
JDialog(JFrame owner) 构造一个无标题的初始不可见的无模式的对话框,owner是对话框所依赖的窗口,如果owner取null,对话框依赖一个默认的不可见的窗口。
3.树组件与表格组件
3.1树组件
JTree类的对象称为组件,也是常用组件之一。
- DefaultMutableTreeNode结点
树组件由结点组成,要想构造一个树组件,必须实现为其创建节点对象。树种只有一个根结点。其他结点分为两类:一类是带子结点的分支结点,另一类是不带子结点的叶结点。
DefaultMutableTreeNode类的两个常用的构造方法是:
DefaultMutableTreeNode(Object userObject)
DefaultMutableTreeNode(Object userObject,boolean allowChildren)
(2)树上的TreeSelectionEvent事件
使用addTreeSelectionListener(TreeSelectionListener listener)
方法获得一个监视器。
创建监视器的类必须实现TreeSelectionListener接口,接口中的方法是public void valueChanged(TreeSelectionEvent e)。
树使用getLastSelectedPathComponent()方法获取选中的结点。
3.2表格组件
表格组件以行和列的形式显示数据,允许对表格中的数据进行编辑。
JTable常用的3个构造方法:
JTable() 创建默认的表格模型。
JTable(int a,int b) 创建a行,b列的默认模型表格
JTable (Object data[][],Object columnName[]) 创建默认表格模型对象,并且显示由data指定的二维数组的值,其列名由数组columnName指定。
在表格中输入或修改数据后,需按回车或用鼠标单击表格的单元格确定所输入或修改的结果。当表格需要刷新显示时,让表格调用repaint方法。
4.按钮绑定到键盘
指定监视器的步骤:
- 获取输入映射
按钮首先调用public final InputMap getInputMap(int condition) 方法返回一个InputMap对象.
- 绑定按钮的键盘操作
步骤(1)返回的输入映射首先调用方法public void put(KeyStroke keyStroke,Object actionMapKey),将敲击键盘上的某键指定为按钮的键盘操作.
- 为按钮的键盘操作指定监视器
按钮调用方法public final ActionMap getActionMap()返回一个ActionMap对象:ActionMap actionmap = button.getActionMap();然后,该对象actionmap调用方法: public void put(Object key,Action action) 为按钮的键盘操作指定监视器
5.打印组件
打印组件工作步骤如下:
(1)获取ToolKit对象
让组件调用getToolkit()方法返回系统提供的Toolkit对象。
(2)获得PrintJob对象
Toolkit对象调用getPrintJob()方法返回一个PrintJob对象。
(3)获取Graphics对象
PrintJob对象使用getGraphics()方法获得一个Graphics对象。
(4)打印组件
步骤3获取的Graphics对象是g,组件调用paintAll(g)将打印出该组件及其子组件。如果调用方法: pain(g)将打印出该组件本身,但不打印子组件。
6.发布GUI程序
6.1首先用文本编辑器编写一个清单文件
6.2生成JAR文件
第十章
1.File类
File对象主要用来获取文件本身的一些信息。
创建一个File对象的构造方法有3个:
File(String filename);(文件名字)
File(String directoryPath,String filename);(文件的路径)
File(File dir, String filename);(目录)
1.1文件的属性
File类的下列方法获取文件本身的一些信息。
public String getName() 获取文件的名字。
public boolean canRead() 判断文件是否是可读的。
public boolean canWrite() 判断文件是否可被写入。
public boolean exits() 判断文件是否存在。
public long length() 获取文件的长度(单位是字节)。
public String getAbsolutePath() 获取文件的绝对路径。
public String getParent() 获取文件的父目录。
public boolean isFile() 判断文件是否是一个普通文件,而不是目录。
public boolean isDirectroy() 判断文件是否是一个目录。
public boolean isHidden() 判断文件是否是隐藏文件。
public long lastModified() 获取文件最后修改的时间。
1.2目录
(1)创建目录
调用方法public boolean mkdir()
(2)列出目录中的文件
public String[] list() 用字符串形式返回目录下的全部文件。
public File [] listFiles() 用File对象形式返回目录下的全部文件。
public String[] list(FilenameFilter obj) 用字符串形式返回目录下的指定类型的所有文件。
public File [] listFiles(FilenameFilter obj) 用File对象形式返回目录下的指定类型所有文件。
参数FilenameFilter是一个接口,该接口有一个方法:public boolean accept(File dir,String name);
1.3文件的创建与删除
1.4运行可执行文件
2.文件字节输入流
使用输入流通常包括4个基本步骤:
(1)设定输入流的源
(2)创建指向源的输入流
(3)让输入流读取源中的数据
(4)关闭输入流。
2.1构造方法
使用FileInputStream类的下列构造方法创建指向文件的输入流。
FileInputStream(String name);(使用给定的文件名)
FileInputStream(File file); (使用File对象)
参数name和file指定的文件称为输入流的源。
字节输入流的read方法:
int read() 读取单个字节的数据,返回字节值(0~255整数),如果未读出字节就返回-1。
int read(byte b[]) 读取b.length个字节到字节数组b中,返回实际读取的字节数。如果到达文件的末尾,则返回-1。
int read(byte b[], int off, int len) 读取len个字节到字节数组b中,并返回实际读取的字节数目。如果到达文件的末尾,则返回-1,参数off指定从字节数组的某个位置开始存放读取的数据。
2.3关闭流
输入流都提供关闭方法close();
3.文件字节输出流
使用输出流通常包括4个基本步骤:
(1)给出输出流的目的地
(2)创建指向目的地的输出流
(3)让输出流把数据写入到目的地
(4)关闭输出流。
3.1构造方法
使用FileOutputStream类的下列具有刷新功能的构造方法创建指向文件的输出流。
FileOutputStream(String name);(使用给定文件名)
FileOutputStream(File file);(使用File对象)
参数name和file指定的文件称为输出流的目的地
3.2使用输出流写字节
输出流的wirie方法以字节单位向目的地写数据。
void write(int n) 向目的地写入单个字节。
void write(byte b[]) 向目的地写入一个字节数组。
void write(byte b[],int off,int len) 从字节数组中偏移量off处取len个字节写到目的地。
3.3关闭流
通过调用close()方法,可以保证操作系统把流缓冲区的内容写到它的目的地,即关闭输出流可以把该流所用的缓冲区的内容冲洗掉(通常冲洗到磁盘文件上)。
4.文件字符输入、输出流
5.缓冲流
BufferedReader和BufferedWriter类创建的对象称作缓冲输入、输出流。二者的源和目的地必须是字符输入流和字符输出流。
构造方法:
BufferedReader(Reader in);
BufferedWriter (Writer out);
BufferedReader和BufferedWriter类读写文件的方法:
readLine() 读取文本行
write(String s,int off,int len) 把字符串s写到文件中
newLine(); 向文件写入一个回行符
6.随机流
使用RandomAccessFile类来创建一个随机访问文件流。RandomAccessFile类创建的流的指向既可以作为源也可以作为目的地。
构造方法:
RandomAccessFile(String name,String mode) ;
RandomAccessFile(File file,String mode) ;
相关方法:
seek(long a) 定位RandomAccessFile流的读写位置
getFilePointer() 获取流的当前读写位置
7.数组流
7.1字节数组流
字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字节数组作为流的源和目标。
ByteArrayInputStream构造方法及常用方法
ByteArrayInputStream(byte[] buf);
ByteArrayInputStream(byte[] buf,int offset,int length);
public int read();顺序地从源中读出一个字节
public int read(byte[] b,int off,int len);顺序地从源中读出参数len指定的字节数
ByteArrayOutputStream流构造方法及常用方法
ByteArrayOutputStream();
ByteArrayOutputStream(int size);
public void write(int b); 顺序地向缓冲区写入一个字节
public void write(byte[] b,int off,int len); 将参数b中指定的len个字节顺序地写入缓冲区
public byte[] toByteArray(); 返回输出流写入到缓冲区的全部字节
7.2字符数组
CharArrayReader和CharArrayWriter类是字符数组流,使用字符数组作为流的源和目标。
8.数据流
DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流。
构造方法:
DataInputStream(InputStream in)创建的数据输入流指向一个由参数in指定的底层输入流
DataOutputStream(OutnputStream out)创建的数据输出流指向一个由参数out指定的底层输出流
9.对象流
ObjectInputStream和ObjectOutputStream类创建的对象称为对象输入流和对象输出流。writeObject(Object obj) 将一个对象obj写入到一个文件,readObject() 读取一个对象到程序中
构造方法:
ObjectInputStream(InputStream in)
ObjectOutputStream(OutputStream out)
一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。
10.序列化与对象克隆
如果一个“复制品”实体的变化不会引起原对象实体发生变化,反之亦然。这样的复制品称为原对象的一个克隆对象或简称克隆。
对象输入流通过对象的序列化信息来得到当前对象的一个克隆。
11.使用Scanner解析文件
11.1使用默认分隔标记解析文件
创建Scanner对象,并指向要解析的文件。
11.2使用正则表达式作为分隔标记解析文件:
创建Scanner对象,指向要解析的文件,并使用useDelimiter方法指定正则表达式作为分隔标记。
12.文件对话框
文件对话框是一个选择文件的界面。构造方法JFileChooser()创建初始不可见的有模式的文件对话框。然后文件对话框调用下述2个方法:
showSaveDialog(Component a);
showOpenDialog(Component a);
都可以使得对话框可见,只是呈现的外观有所不同,showSaveDialog方法提供保存文件的界面,showOpenDialog方法提供打开文件的界面。上述两个方法中的参数a指定对话框可见时的位置,当a是null时,文件对话框出现在屏幕的中央;如果组件a不空,文件对话框在组件a的正前面居中显示。
13.带进度条的输入流
如果读取文件时希望看见文件的读取进度可以使用javax.swing包提供的输入流类ProgressMonitorInputStream。
构造方法:
ProgressMonitorInputStream(Conmponent c,String s,InputStream);
14.文件锁
FileLock、FileChannel类处理Java提供的文件锁功能。它们分别在java.nio和java.nio.channels包中。输入、输出流读写文件时可以使用文件锁。
RondomAccessFile创建的流在读写文件时使用文件锁的步骤如下:
(1)先使用RondomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw。
(2)input流调用方法getChannel()获得一个连接到地层文件的FileChannel对象(信道)。
(3)信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称作对文件加锁。
教材学习中的问题和解决过程
看了几遍都看不懂,结合例子之后能懂个大概。
代码调试中的问题和解决过程
多看例子,能更好的深入理解方法的使用。
其他
还是要多敲代码才可以啊。
学习进度条
| 代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 |
目标 | 2000行 | 10篇 | 80小时 |
|
第一周 | 67/67 | 1/1 | 8/8 |
|
… | … | … | … |
|
第九周 | 300/2312 | 1/8 | 8/72 |
|
参考资料
《Java2实用教程(第5版)》