黑马程序员_Java基础GUI

GUI:Graphical User Interface(图形用户接口)

很实用的两个包:

java.Awt:(Abstract Window ToolKit抽象窗口工具包)需要调用本地系统方法实现功能.属重量级控件,跨平台性不是很好.
javax.Swing: 在AWT的基础上,建立的一套图形化几面系统.其中提供了更多的组件,而且完全有Java实现,增强了可一致性,属轻量级控件
顺便说一下,eclipse的界面用的包是java.xawt

简单说一下体系
Component(构件,组件)
 |--Container(容器,特殊的子类)这个组件作为一个组件,里面可以继续添加组件
  |--Window(窗口)
   |--Frame(框架,窗体)
   |--Dialog(对话框)
    |--FileDialog(文件对话框)
  |--Panel(面板)
 //下面与Container同级,但是不能添加组件
 |--Button(按钮)
 |--Label(标签,作用在于封装文字)
 |--Checkbox(复选框)
 |--TextComponent(文本组件)
  |--TextArea(文本框)
  |--TextFileld(文本域)
GUI-布局管理器
容器中的组件的排放方式,就是布局
常见的布局管理器:
FlowLayout(流式布局管理器)
 总左到右的顺序排列;
 Panel默认的布局管理器
BorderLayout(边界布局管理器)
 东南西北中
 Frame默认的布局管理器
GridLayout(网格布局管理器)
 规则的矩阵
GardLayout(卡片布局管理器)
 选项卡
GridBagLayout(网格布局管理器)
 非规则的矩阵
GUI-Frame

//创建图形化界面:
1,创建frame窗体;
2,对窗体进行基本设置,
 比如:大小,位置,布局;
3,定义组件;
4,将组件通过窗体的add方法添加到窗体中.
5,让窗体显示,通过setVisible(true)

//创建图形化界面
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;

class AwtDemo {
 public static void main(String[] args)
 {
  Frame f = new Frame("my awt");
  
  //设置窗体大小
  f.setSize(500,400);
  
  //设备位置位置,距左面300,上面200xp
  f.setLocation(300,20);
  
  //设置布局管理(流式布局管理)
  f.setLayout(new FlowLayout());
  
  //按钮
  Button b = new Button("我是一个按钮");
  
  //将按钮添加到窗体当中
  f.add(b);
  
  //显示窗体
  f.setVisible(true);
  
  
 }
}

GUI-事件监听机制

事件监听机制的特点:
1,事件源
2,事件
3,监听器
4,事件处理方式

事件源:就是awt包或者swing包中的那些图形界面组件

事件:每一个事件源都有自己特有的对应事件和共性事件.

监听器:可以出发某一个事件的动作(不止一个动作)都已经封装到了监听器中

以上三者在java中都已经定义好了,直接获取其对象来用就可以了.
我们需要做的事情是:就是对产生的动作进行处理.
GUI-窗体事件

package demo;
//创建图形化界面
import java.awt.*;
import java.awt.event.*;

class AwtDemo {
 public static void main(String[] args)
 {

  Frame f = new Frame("my awt");
  
  //设置窗体大小
  f.setSize(500,400);
  
  //设备位置位置,距左面300,上面200xp
  f.setLocation(300,20);
  
  //设置布局管理(流式布局管理)
  f.setLayout(new FlowLayout());
  
  //按钮
  Button b = new Button("我是一个按钮");
  
  //将按钮添加到窗体当中
  f.add(b);
  
  //f.addWindowListener(new MyWin());
  //可以写个匿名内部类
  f.addWindowListener(new WindowAdapter()
    {
     //关闭窗口
     public void windowClosing(WindowEvent e)
     {
      System.out.println("我关");
      System.exit(0);
     }
     //窗体前置
     public void windowActivated(WindowEvent e)
     {
      System.out.println("我活了..");
     }
     //窗体打开
     public void windowOpened(WindowEvent e)
     {
      System.out.println("我被打开了");
     }
    });
  
  
  //显示窗体
  f.setVisible(true);

 }
}
//应为WindowListener的子类windowASdapter已经实现了WindowListener接口.
//并覆盖了其中的所有方法.那么我只需要继承自WindowAdapter覆盖我需要的方法即可
class MyWin extends WindowAdapter
{
 public void windowClosing(WindowEvent e)
 {
  System.out.println("window closing");
  System.exit(0);
 }
}

/*
class MyWin implements WindowListener
{
 //覆盖了7个方法,可是我只用到了关闭的动作.
 //其它的动作都没有用到,可是必须复写
}
*/
GUI-Action事件

//按钮中添加事件
import java.awt.*;
import java.awt.event.*;

class FrameDemo {
 //定义该图形中所需的组件的引用.
 private Frame f;
 private Button but;
 FrameDemo()
 {
  init();
 }
 
 //对图形界面初始化
 public void init()
 {
  f = new Frame("my frame");
  //对frame进行基本设置
  //setBounds(int x,int y,int width,int height)
  f.setBounds(300,100,500,400);
  f.setLayout(new FlowLayout());
  
  but = new Button("my button");
  
  //将组件添加到窗体中
  f.add(but);
  
  //加载一下窗体上的事件
  myEvent();
  //显示窗体
  f.setVisible(true);
 }
 //将事件添加到这里
 public void myEvent()
 {
  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
  //让按钮具备退出程序的功能
  /*
   * 按钮就是事件源
   * 那么选择哪一个监听器呢?
   * 通过关闭窗体示例了解到想要知道哪个组件具备什么样的特有监听器.
   * 需要查看该组件对象的功能
   * 通过查询Button的描述,发现按钮支持一个特有监听addActionListener,活动监听
   */
  but.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    System.out.println("按钮干的");
    System.exit(0);
   }
  });
 }
 
 
 
 public static void main(String[] args)
 {
  new FrameDemo();
 }
}

GUI-鼠标事件
//鼠标事件
import java.awt.*;
import java.awt.event.*;

class MouseEventDemo {
 private Frame f;
 private Button but;
 MouseEventDemo()
 {
  init();
 }
 
 //对图形界面初始化
 public void init()
 {
  f = new Frame("my frame");
  
  f.setBounds(300,100,500,400);
  f.setLayout(new FlowLayout());
  
  but = new Button("my button");
  
  f.add(but);
  
  myEvent();
  f.setVisible(true);
 }
 
 public void myEvent()
 {
  //窗口关闭
  f.addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
  //按钮的活动事件,如果想要这个按钮键盘鼠标都能操作,建议用活动事件
  but.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    System.out.println("活动事件");
   }
  });
  //鼠标事件
  but.addMouseListener(new MouseAdapter()
  {
   int count = 1;
   int clickcount = 1;
   //鼠标进入事件
   public void mouseEntered(MouseEvent e)
   {
    System.out.println("鼠标进入该按钮"+count++);
   }
   public void mouseClicked(MouseEvent e)
   {
    //getClickCount()获取鼠标连击次数
    if(e.getClickCount()==2)
    System.out.println("鼠标双击事件"+clickcount++);
   }
  });
   
 }

 public static void main(String[] args)
 {
  new MouseEventDemo();
 }
}


GUI-键盘事件
package demo8;
//键盘事件
import java.awt.*;
import java.awt.event.*;

class KeyDemo{
 private Frame f;
 private Button but;
 private TextField tf;
 KeyDemo()
 {
  init();
 }
 public void init()
 {
  f = new Frame("my frame");
  but = new Button("my button");
  
  tf = new TextField(20);//创建文本框
  
  f.setBounds(300,100,300,500);
  f.setLayout(new FlowLayout());
  f.add(tf);
  f.add(but);
  
  myEvent();
  f.setVisible(true);
 }
 public void myEvent()
 {
  //窗口活动事件
  f.addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
  
  tf.addKeyListener(new KeyAdapter()
  {
   public void keyPressed(KeyEvent e)
   {
    int code = e.getKeyCode();
    if(!(code>=KeyEvent.VK_0 && code<= KeyEvent.VK_9))
    { 
     e.consume();//不会按照原事件执行
     System.out.println(code+"您输入的是非法的");
     
    }
   }
  });
  
  //给but添加一个监听
  but.addKeyListener(new KeyAdapter()
  {
   public void keyPressed(KeyEvent e)
   {
    //组合按键,ctrl+enter
    if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
     System.exit(0);

    //如果按键是esc就退出
    //if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
    // System.exit(0);
    
    
    //KeyEvent.getKeyText(e.getKeyCode())打印输入内容
    //System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode());
   }
  });
  
  
  
 }
}

class KeyEventDemo {
 public static void main(String[] args)
 {
  new KeyDemo();
 }
}

GUI-对话框Dialog

package demo10;
//GUI-练习, 列出指定目录内容
import java.awt.*;
import java.awt.event.*;
import java.io.File;
class MyWindow
{
 private Frame f;
 private Button but;
 private TextField tf;
 private TextArea ta;
 
 private Dialog d;//误操作提示框
 private Label lab;//
 private Button okBut;
 MyWindow()
 {
  init();
 }
 //画界面
 public void init()
 {
  //创建f窗体,but按钮,tf文本框,ta文本域
  f = new Frame();
  f.setBounds(300,100,600,500);//窗体坐标以及窗体大小
  f.setLayout(new FlowLayout());//布局方式
  
  //创建错误滴那个东东的窗体
  d = new Dialog(f,"提示信息-self",true);//true,不关闭此窗口,后面的窗口操作不了,false后面的窗口可以继续操作
  d.setBounds(400,200,240,150);
  d.setLayout(new FlowLayout());
  lab = new Label();//封装错误信息滴
  okBut = new Button("确定");
  
  d.add(lab);
  d.add(okBut);
  
  but = new Button("转到");
  tf = new TextField(60);
  ta = new TextArea(25,70);//行,列
  
  f.add(tf);
  f.add(but);
  f.add(ta);
  
  myEvent();
  f.setVisible(true);
  
 }
 public void myEvent()
 { 
  //按钮退出
  but.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    showDir();
   }
  });
  //弹出对话框的按钮事件
  okBut.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    d.setVisible(false);
   }
  });
  
  tf.addKeyListener(new KeyAdapter()
  {
   public void keyPressed(KeyEvent e)
   {
    if(e.getKeyCode()==KeyEvent.VK_ENTER)
     showDir();
   }
  });
  
  
  
  //弹出对话框的窗体事件
  d.addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    d.setVisible(false);
   }
  });
  
  //f的窗口事件
  f.addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
 }
 public void showDir()
 {
  String dirPath = tf.getText();
  File dir = new File(dirPath);//封装成对象
  if(dir.exists() && dir.isDirectory())//dir存在,并且是目录
  {
   ta.setText("");//清空上一次查询
   String[] names = dir.list();
   for(String name : names)
   {
    ta.append(name+"\r\n");
   }
  }
  else
  {
   //错误提示信息
   String info = "您输入的信息是:"+dirPath+"错误滴,请重新输入";
   lab.setText(info);
   d.setVisible(true);
  }
 }
}


class MyWindowDemo {
 public static void main(String[] args)
 {
  new MyWindow();
 }
}

GUI-菜单
Menu();//菜单,菜单既可以添加菜单,也可以添加菜单条
MenuItem();//菜单条

mb.add(m);//添加"文件"
m.add(subMenu);//文件下面添加子惨淡
subMenu.add(subItem);//子条目
m.add(closeItem);
文件Menu
|--子菜单Menu
  |--子条目MenuItem
|--退出MenuItem


//菜单
import java.awt.*;
import java.awt.event.*;
class MyMenuDemo {
 private Frame f;
 private MenuBar mb;//菜单栏
 private Menu m,subMenu;//菜单
 private MenuItem closeItem,subItem;//子菜单
 
 MyMenuDemo()
 {
  init();
 }
 public void init()
 {
  f = new Frame();
  f.setBounds(100,100,500,600);
  f.setLayout(new FlowLayout());
  
  mb = new MenuBar();
  m = new Menu("文件");
  closeItem = new MenuItem("退出");
  subItem = new MenuItem("子条目");
  subMenu = new Menu("子菜单");

  f.setMenuBar(mb);//添加菜单
  mb.add(m);//添加"文件"
  m.add(subMenu);//文件下面添加子菜单
  subMenu.add(subItem);//子条目
  m.add(closeItem);
  
  myEvent();
  f.setVisible(true);
 }
 public void myEvent()
 {
  //f的窗口事件
  f.addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
  closeItem.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    System.exit(0);
   }
  });
 }

 public static void main(String[] args)
 {
  new MyMenuDemo();
 }
}
GUI-练习-打开文件

package test11;
//练习-打开文件
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuTest {
 private Frame f;
 private MenuBar bar;//菜单栏
 private Menu fileMenu;//菜单
 private MenuItem openItem,saveItem,closeItem;//子菜单
 private FileDialog openDia,saveDia;//打开,保存
 private TextArea ta;//文本区域
 
 MyMenuTest()
 {
  init();
 }
 public void init()
 {
  f = new Frame();
  f.setBounds(100,100,500,600);
  //f.setLayout(new FlowLayout());
  
  bar = new MenuBar();
  fileMenu = new Menu("文件");
  closeItem = new MenuItem("退出");
  openItem = new MenuItem("打开");
  saveItem  = new MenuItem("保存");
  ta = new TextArea();
  
  f.setMenuBar(bar);//添加菜单
  bar.add(fileMenu);//添加"文件"
  fileMenu.add(openItem);
  fileMenu.add(saveItem);
  fileMenu.add(closeItem);
  f.add(ta);//文本区域
  
  
  openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);
  saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);
  
  myEvent();
  f.setVisible(true);
 }
 public void myEvent()
 {
  //打开的事件
  openItem.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    openDia.setVisible(true);//显示
    String dirPath = openDia.getDirectory();//路径
    String fileName = openDia.getFile();//名字
    //System.out.println(dirPath+fileName);
    if(dirPath==null || fileName==null)//如果有一个为空的话,那么就返回
     return ;
    ta.setText("");//添加下个文件之前先清空文本区域
    File file = new File(dirPath+fileName);
    try
    {
     BufferedReader bufr = new BufferedReader(new FileReader(file));
     String line = null;
     while((line=bufr.readLine())!=null)
     {
      ta.append(line+"\r\n");
     }
     bufr.close();
    }
    catch(IOException es)
    {
     throw new RuntimeException("读取失败");
    }
   }
  });
  //保存的事件
  saveItem.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    saveDia.setVisible(true);
   }
  });
  
  
  //f的窗口事件
  f.addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
  closeItem.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    System.exit(0);
   }
  });
 }

 public static void main(String[] args)
 {
  new MyMenuTest();
 }
}

GUI-保存文件

package test11;
//练习-打开文件
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuTest {
 private Frame f;
 private MenuBar bar;//菜单栏
 private Menu fileMenu;//菜单
 private MenuItem openItem,saveItem,closeItem;//子菜单
 private FileDialog openDia,saveDia;//打开,保存
 private TextArea ta;//文本区域
 private File file;
 
 MyMenuTest()
 {
  init();
 }
 public void init()
 {
  f = new Frame();
  f.setBounds(100,100,500,600);
  //f.setLayout(new FlowLayout());
  
  bar = new MenuBar();
  fileMenu = new Menu("文件");
  closeItem = new MenuItem("退出");
  openItem = new MenuItem("打开");
  saveItem  = new MenuItem("保存");
  ta = new TextArea();
  
  f.setMenuBar(bar);//添加菜单
  bar.add(fileMenu);//添加"文件"
  fileMenu.add(openItem);
  fileMenu.add(saveItem);
  fileMenu.add(closeItem);
  f.add(ta);//文本区域
  
  
  openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);
  saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);
  
  myEvent();
  f.setVisible(true);
 }
 public void myEvent()
 {
  //保存的事件
  saveItem.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    //弹与不弹就看文件存不存在..
    if(file==null)
    {   //弹出
     saveDia.setVisible(true);
    
    String dirPath = saveDia.getDirectory();//路径
    String fileName = saveDia.getFile();//名字
    if(dirPath==null || fileName==null)//如果有一个为空的话,那么就返回
     return ;
    file = new File(dirPath+fileName);
    }
    try
    {
     BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
     
     String text = ta.getText();
     bufw.write(text);
     bufw.close();
    }
    catch(IOException ex)
    {
     throw new RuntimeException();
    }
   }
  });
  
  
  
  //打开的事件
  openItem.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    openDia.setVisible(true);//显示
    String dirPath = openDia.getDirectory();//路径
    String fileName = openDia.getFile();//名字
    System.out.println(dirPath+fileName);
    if(dirPath==null || fileName==null)//如果有一个为空的话,那么就返回
     return ;
    ta.setText("");//添加下个文件之前先清空文本区域
    file = new File(dirPath+fileName);
    try
    {
     BufferedReader bufr = new BufferedReader(new FileReader(file));
     String line = null;
     while((line=bufr.readLine())!=null)
     {
      ta.append(line+"\r\n");
     }
     bufr.close();
    }
    catch(IOException es)
    {
     throw new RuntimeException("读取失败");
    }
   }
  });
   
  //f的窗口事件
  f.addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    System.exit(0);
   }
  });
  closeItem.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent e)
   {
    System.exit(0);
   }
  });
 }

 public static void main(String[] args)
 {
  new MyMenuTest();//实例一个菜单窗体
 }
}


GUI-jar包双击执行
jar -cvf my.jar mymenu

1,创建一个文档,内容如下
Main-Class: 包名.类名"回车"
例如:
Main-Class: mymenu.MyMenuTest

2,执行命令如下:
jar -cvfm 自定义.jar 配置文件名 包名
jar -cvfm my.jar 1.txt mymenu

3,必须要注册到本地才能用,javaw

 

posted on 2013-05-14 13:57  小川!  阅读(166)  评论(0编辑  收藏  举报