201711671109《Java程序设计》第十周总结(第9、10章)

教材内容学习

 

9.1Java.Swing概述

awt包,为抽象窗口工具包,用于设计GUI的组件类。

swing包,同样用于设计GUI的组建类

容器类Container与组建类Component

swing包中的JComponent类是awt包中Contain类的一个直接子类,是awt中Component的间接子类

GUI编程经常提到的基本知识点:

(1)add()方法用于向容器添加组件

(2)remove去除容器中的组件

(3)validate方法保证组件正常显示.

 

9.2窗口

1、JFrame的常用方法

JFrame()创建无标题窗口

窗口可通过JFrame的方法设置窗口的标题,颜色,大小,位置等等

 

2、菜单条、菜单、菜单项

(1)菜单条-JMenubar

(2)菜单-JMenu

(3)菜单项-JMenuItem

 

9.3常用组件与布局

1、常用组件

JComponent类中的常用子类

(1)JTextField(文本框)

(2)JTextArea(文本区)

(3)JButton(按钮)

(4)JLabel(标签)

(5)JcheckBox(复选框)

(6)JradioButton(单选按钮框)

(7)JcomboBox(下拉列表)

(8)JPasswordField(密码框)

 

 

2、常用容器

中间容器须被添加到底层容器如JFrame才能发挥作用

JPanel面板 创建面板用于添加组件

JTabbedPane 选项卡窗格  选择不同组件

JScrollPane 滚动窗格 添加滚动条

JSolitPane 拆分窗格

JLayeredPane 分层窗格

 

3、常用布局

常用布局有FlowLayout(居中对齐)

BorderLayout(五个区域布局)

CardLayout(从上往下)

GridLayout(网格布局)

null(空布局)

BoxLayout(盒式容器)

 

9.4处理事件

1、事件处理模式

重要核心: 事件源(能够产生时间的对象)、监视器(相应的操作做出相应的处理)、事件接口(处理事件)

 

2、事件

①ActionEvent事件源 通过文本框、按钮、菜单项、密码框、单选框触发

②ItemEvent事件源 通过选择框、下拉列表触发

③DocumentEvent事件源  通过文本区的文档触发

④MouseEvent 通过鼠标接触组件触发

⑤焦点事件 组件触发焦点事件,从有无焦点之间转换

⑥键盘事件 通过键盘的按键触发组件事件

 

匿名类实例或窗口做监视器  可以直接处理对象

 

事件特点总结 ①授权模式 ②接口回调 ③方法绑定 ④保持松耦合

 

MVC结构 模型-视图-控制器

 

3、对话框

对话框 JDialog 以有无模式为区分

(1)消息对话框  showMessageDialog(Component parenComponen String message String title int messageType)

(2)输入对话框 有供用户输入文本的文本框和确认消息的按钮

(3)确认对话框 确认按钮

(4)颜色对话框 设置对话框和窗口的颜色

(5)自定义对话框 根据自己的需要定义 默认布局为BorderLayout

 

9.7树组件与表格组件

1、树组件

①DefaultMutableTreeNode结点 创建结点

②TreeSelectionEvent 监视器处理事件

 

2、表格组件

JTable() 创建默认的表格模型

JTable(int a,int b)创建a行,b列的表格模型

JTable(Object data【】,Object columnName【】)创建默认表格模型对象,并显示二维数组的值,列名由数组指定

 

9.8按钮绑定到键盘

重点在于为按钮的键盘操作制定监视器

①获取输入映射

②绑定按钮的键盘操作

③按钮的键盘操作制定监视器

 

代码编写

Example9_25.java

public class Example9_25{
   public static void main(String args[]) {
      new Hua_Rong_Road();
   }
}

 

Hua_Rong_Road.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Hua_Rong_Road extends JFrame implements MouseListener,KeyListener,ActionListener {
   Person person[]=new Person[10];
   JButton left,right,above,below;  
   JButton restart=new JButton("重新开始");
   public Hua_Rong_Road() {
      init();
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      setBounds(100,100,320,500);
      setVisible(true);
      validate();
   }
   public void init() {
      setLayout(null); 
      add(restart);
      restart.setBounds(100,320,120,35);
      restart.addActionListener(this);
      String name[]={"曹操","关羽","张","刘","周","黄","兵","兵","兵","兵"};
      for(int k=0;k<name.length;k++) {
         person[k]=new Person(k,name[k]);
         person[k].addMouseListener(this);
         person[k].addKeyListener(this);
         add(person[k]);
      }
      person[0].setBounds(104,54,100,100); 
      person[1].setBounds(104,154,100,50); 
      person[2].setBounds(54, 154,50,100); 
      person[3].setBounds(204,154,50,100); 
      person[4].setBounds(54, 54, 50,100); 
      person[5].setBounds(204, 54, 50,100);  
      person[6].setBounds(54,254,50,50);  
      person[7].setBounds(204,254,50,50); 
      person[8].setBounds(104,204,50,50); 
      person[9].setBounds(154,204,50,50); 
      person[9].requestFocus();
      left=new JButton();  
      right=new JButton();
      above=new JButton(); 
      below=new JButton();
      add(left); 
      add(right);
      add(above); 
      add(below);
      left.setBounds(49,49,5,260);
      right.setBounds(254,49,5,260);
      above.setBounds(49,49,210,5);
      below.setBounds(49,304,210,5);
      validate();
   } 
   public void keyTyped(KeyEvent e){}
   public void keyReleased(KeyEvent e){}
   public void keyPressed(KeyEvent e) {
     Person man=(Person)e.getSource();
     if(e.getKeyCode()==KeyEvent.VK_DOWN)
         go(man,below);
     if(e.getKeyCode()==KeyEvent.VK_UP)
         go(man,above);
     if(e.getKeyCode()==KeyEvent.VK_LEFT)
         go(man,left);
     if(e.getKeyCode()==KeyEvent.VK_RIGHT)
        go(man,right);
   }
   public void mousePressed(MouseEvent e) {
     Person man=(Person)e.getSource();
     int x=-1,y=-1;
     x=e.getX();
     y=e.getY();
     int w=man.getBounds().width;
     int h=man.getBounds().height;
     if(y>h/2)
        go(man,below); 
     if(y<h/2)
        go(man,above);
     if(x<w/2)
        go(man,left);
     if(x>w/2)
        go(man,right);
   }
   public void mouseReleased(MouseEvent e) {}
   public void mouseEntered(MouseEvent e)  {}
   public void mouseExited(MouseEvent e)   {}
   public void mouseClicked(MouseEvent e)  {}
   public void go(Person man,JButton direction) {
      boolean move=true;
      Rectangle manRect=man.getBounds();
      int x=man.getBounds().x;
      int y=man.getBounds().y;
      if(direction==below)
         y=y+50;
      else if(direction==above)
         y=y-50;
      else if(direction==left)
         x=x-50;
      else if(direction==right)
         x=x+50;
      manRect.setLocation(x,y);
      Rectangle directionRect=direction.getBounds();
      for(int k=0;k<10;k++) {
          Rectangle personRect=person[k].getBounds();
         if((manRect.intersects(personRect))&&(man.number!=k))
            move=false;
      }
      if(manRect.intersects(directionRect))
            move=false;
      if(move==true)
            man.setLocation(x,y);
  }
  public void actionPerformed(ActionEvent e) {
      dispose(); 
      new Hua_Rong_Road();
  }

 

Person.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Person extends JButton implements FocusListener { 
   int number;
   Color c=new Color(255,245,170);
   Font font=new Font("宋体",Font.BOLD,12);
   Person(int number,String s) {
       super(s);
       setBackground(c);
       setFont(font);
       this.number=number;
       c=getBackground();
       addFocusListener(this);
   }
   public void focusGained(FocusEvent e) {
      setBackground(Color.red);
   }
   public void focusLost(FocusEvent e) {
      setBackground(c);
   }
}

 

10章输入流、输出流 

输入流:从外部的存储媒介或程序读入数据,程序通过输入流读取源中的数据。

输出流:将处理的结果写入到永久的存储媒介中或传送给其他程序,程序通过输出流传向目的地。

java.io包提供大量的流类,所有输入流都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类,而所有的输出流都是抽象类OutputSteam(字节流)或抽象类Writer(字符输出流)的子类。

 

10.1File类

File类:用与获取文件信息 三个构造方法:1.File(String filename)2.File(String directoryPath,String filename)3.File(File dir,String filename),filename-文件名字,directoryPath-文件的路径,dir-目录

1、文件的属性

文件属性:获取文件信息的方法见P282

 

2、目录

(1)创建目录:public boolean mkdir(),成功返回true,否则false

(2)列出目录中的文件:

①public String[]list 用字符串形式返回目录下的所有文件;

 ②public File[]listFiles() 用File对象形式返回目录下的全部文件

若要返回指定类型 则要:

①public String[]list(FilenameFilter obj) 用字符串形式返回目录下的指定类型所有文件

②public File[]listFiles(FilenameFilter obj) 用File对象形式返回目录下的指定类型全部文件。

其中上述方法中FilenameFilter 为一个接口,在list方法执行时参数obj不断回调接口方法accpet(File dir,String name)dir是当前目录的dirFile,name是目录中的一个文件名,当返回true时候将名字为name的文件返回数组中。

(3)文件的创建与删除

当使用File类创建一个文件对象后,如File file=new File(“C:\\\”,"letter.txt")

若目录中没有对应的文件,则可以调用createNewFile()创建文件,可以delete()删除当前文件。

(4)运行可执行文件:

步骤:①使用java.lang包中的Runtime类,先声明对象 Runtime ec,然后使用该类的getRuntime()静态方法创建这个对象 ec=Runtime.getRuntime();,然后ec调用exec(String command)打开文件

 

10.2文件字节输入流

(1)使用输入流的四个步骤:

①设定输入流的源

②创建指向源的输入流

③输入流读取数据

④关闭输入流

(2)用FileInputStream(String name)/FileInputStream(File file)创建输入流

(3)使用输入流读取字节 三个方法 read() read(byte b[]),read(byte b[],int off,int len)

(3)关闭流 close()

 

10.3文件字节输出流

(1)四个步骤:

①设定输出流的源

②创建指向目的地的输出流

③输出流写入数据

④关闭输出流

(2)用FileOutputStream(String name)/FileOutputStream(File file)创建输入流

(3)使用输出流读取字节 三个方法 write() write(byte b[]),write(byte b[],int off,int len)

(4)关闭流 close()

 

10.4文件字符输入、输出流

因为字节流不能很好操作字符,则要用字符流。

FileInputStream、FileOutputStream分别对应FileReader和FileWriter

 

10.5缓冲流

BUfferedReader和BufferedWriter类创建的对象称为缓冲输入、输出流,增强文件的读写能力。

BufferedReader用readLine()读取文本行   BUfferedWriter用newLine()写入方法

以上两个方法称为上层流,指向的字符流是底层流,java采用缓存技术将上层流与底层流连接。

 

10.6随机流

P293常用方法

(1)用RandomAccessFile创建,不是InputStream和OutStream的子类。

构造方法 1.RandomAccessFile(String name,String mode),name确定文件名,mode确定访问权利

(2)RandomAccessFile(File file,String mode)参数是file对象,是源与目的地。

定为RandomAccessFile流的读写方法 seek(long a) ;getFilePointer()获取当前读写位置。

 

10.7数组流

1、字节输入流

字节数组输入流ByteArrayInputStream和输出流ByteArrayOutputStream分别使用字节数组作为流的源和目的地,构造方法:

ByteArrayInputStream(byte ()buf),ByteArrayInputStream(byte ()buf,int offset,int,length);

 

2、字符输入流

字符数组流CharArrayReader()和CharArrayWritter类

 

10.8数据流

数据流 DataInputStream和DataOutputSteam类创建的对象称为数据输入流与输出流

构造方法:DataInputStream(InputStream in)创建的数据输入流指向一个由参数in的底层输入流

DataOutputStream(OutputStream out)创建的数据输出流指向一个由参数out指定的底层输出流   其他方法见P298

 

10.9对象流

对象流 ObjectInputStream和ObjectOutputStream

分别使用writeobject(object ob)和readobject写入和读取对象

构造方法ObjectInputStream(InputStream in)ObjectOutputStream (OutputStream out)

 

10.10序列化与对象克隆

若一个类和两个对象如果有相同的引用,则有相同的实体与功能

 

10.11使用scanner解析文件

1、使用默认分隔标记解析文件:File file=new file(“hello,java”);  Scanner sc=new scanner(file)空格作为标记,用next()方法返回file的单词,若最后一个单词被返回,则放回ture

 

2、使用正则表达式解析文件:File file=new file(“hello,java”);  Scanner sc=new scanner(file);sc.useDelimiter(正则表达式)


 

教材学习中遇到的问题

 

学习进度条

 代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时 
第二周150/8001/1015/86

窗口的使用

输入流、输出流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值