第十六章 JAVA图形用户界面编程
- JAVA提供的两套用于支持编写图形用户界面的组件是:
AWT和Swing;涉及容器,组件时用Swing;涉及颜色和字体时用AWT; - Swing的组件是轻量组件,由纯JAVA代码编写;Swing的容器为重量级容器包括JFrame、JDialog、JWindow和JApplet等。
- 设计界面的基本步骤:
- 设置窗口尺寸;
- 构造方法中使用Toolkit设置窗口位置,this.背景色,关窗模式等;
- 新建方法获取内容面板;
- 设置内容面板背景色,布局管理器等;
- 设置具体的标签JLabel,按钮JButton,文本框JTextField,密码框,文本域等;
- 在构造方法里调用内容面板设置方法,并设置窗口可见。
- 布局管理器有:边界布局、流布局、网格布局、绝对布局以及卡片布局,设置布局时括号里填NULL为绝对布局,不设置默认为边界布局。
- 事件驱动编程
事件驱动编程指的是对象之间进行通信的设计模式。
事件处理中GUI有三个对象:事件源对象、监听器对象和触发对象。 - 特点:1. 绑定事件源与监听器;2. 监听器有职责范围;3. 一个源对象可以有多个监听器; 4. 一个监听器可以绑定多个事件源。
- 三中实现方法:1. 单独写监听类,好处:代码独立,各个类任务清晰;使用灵活。2. 在容器中写监听方法,好处:操作本容器或组件不需要传参;缺点:类的任务不明确,无法为不同的事件源书写各自的监听方法。3. 使用匿名内部类,在绑定的时候同时实现接口重写(最常用),好处:访问本容器的子容器或组件传参;可以为每个事件源书写各自的监听器;类的功能各自独立。
第十七章 JAVA的I/O系统
- 流的概念:流是JAVA语言I/O的基础,是一个最基本的抽象。当程序需要写出或者写入数据的的时候就会开启一个桐乡数据源设备的流。
- 分类:按方向分为:输入流和输出流;按处理数据的最小单位分:字节流和字符流;按照功能分:节点流和处理流;
- 处理对象的输入输出使用对象处理流,对象写出到文件叫序列化,文件写入计算机转化为对象叫反序列化;对象处理流也是字节处理流的一种。
代码示例:
字符流:
public static void main(String[] args) {
TODO Auto-generated method stubFileReader fr = null; FileWriter fw = null; try { fr = new FileReader("E:/guessNumber.txt"); fw = new FileWriter("D:/newguess.txt"); char[] buffer = new char[1024]; int length = 0; while((length = fr.read(buffer)) != -1){ fw.write(buffer, 0, length); fw.flush(); } } catch (FileNotFoundException e) { TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } finally{ if(fr != null){ try { fr.close(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } } if(fw != null){ try { fw.close(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } } }
}
字节流:
public static void main(String[] args) {
TODO Auto-generated method stub选择流分类 FileInputStream fin = null; FileOutputStream fout = null; try { 创建流对象 fin = new FileInputStream("E:/lileihanmeimei.mp3"); fout = new FileOutputStream("D:/new.mp3"); 操作流 int b = 0;每次读取1个字节 while((b = fin.read()) != -1){ fout.write(b); } byte[] buffer = new byte[1024]; int length = 0; while((length = fin.read(buffer)) != -1){ fout.write(buffer, 0, length); fout.flush(); } } catch (FileNotFoundException e) { TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } finally { 关闭流 if (fin != null) { try { fin.close(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } } if (fout != null) { try { fout.close(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } } }
}
对象流:
public static void main(String[] args) {
TODO Auto-generated method stub对象序列化 被序列化的类,必须实现Serializable这个接口 User user = new User("张三",18,false); Address address = new Address("成都","红瓦寺", 17); user.setMyAddress(address); ObjectOutputStream oos = null; try { ObjectOutputStream在设计时就是用来被对接的 oos = new ObjectOutputStream(new FileOutputStream("user.data")); oos.writeObject(user); } catch (FileNotFoundException e) { TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } finally{ if(oos != null){ try { oos.close(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } } } 反序列化 User user = null; ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream("user.data")); user = (User)ois.readObject(); } catch (FileNotFoundException e) { TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { TODO Auto-generated catch block e.printStackTrace(); } finally{ if(ois != null){ try { ois.close(); } catch (IOException e) { TODO Auto-generated catch block e.printStackTrace(); } } } System.out.println(user.getName() + " " + user.getMyAddress().getCity());
}
注意:所有流操作最后finally中必须关闭流- 文件类
通过新建文件对象对指定文件或文件夹进行属性查看和操作。 示例:public static void main(String[] args) {
// TODO Auto-generated method stub
// File file = new File(“E:/test”);
// File[] subFiles = file.listFiles();//得到目录中所有的子文件对象(包括子文件夹)
// for(File subFile : subFiles){
// System.out.println(subFile.getPath());//得到文件的全路径名
// System.out.println(subFile.getParent());//得到文件的路径
// System.out.println(subFile.getName());//得到文件的文件名
// System.out.println(subFile.isDirectory());//得到File对象是否是目录
// System.out.println(subFile.length());//得到文件的大小
// System.out.println(new Date(subFile.lastModified()));
// System.out.println(subFile.getName() + “\t\t” + subFile.length() +
// “\t\t” + new Date(subFile.lastModified()));
// }showSubFileName(new File("E:\\"));
}
public static void showSubFileName(File file) {
File[] subFiles = file.listFiles();
for (File subFile : subFiles) {
if (!subFile.isHidden()) {
if (subFile.isDirectory()) {
showSubFileName(subFile);
} else {
System.out.println(subFile.getPath());
}
}
}
}
未完待续