黑马程序员——java第二十二天:GUI

------- android培训java培训、期待与您交流! ----------

GUI

GUI——Graphical UserInterface(图形用户接口)。

CLI——Command line UserInterface (命令行用户接口)就是常见的Dos命令行操作。

 

Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。

 

java.Awt:Abstract WindowToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。(快平台性较差)

javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。

 

Container:为容器,是一个特殊的组件,该组件中可以通过add 方法添加其他组件进来。

 

布局

FlowLayout(流式布局管理器)

从左到右的顺序排列。

Panel默认的布局管理器。

BorderLayout(边界布局管理器)

东,南,西,北,中

Frame默认的布局管理器。

GridLayout(网格布局管理器)

规则的矩阵

CardLayout(卡片布局管理器)

选项卡

GridBagLayout(网格包布局管理器)

非规则的矩阵(与网络布局管理器不同的是一个组件有可能占多个格子)

Frame

创建图形化界面

1、创建Frame窗体

2、对窗体进行基本设置。比如:大小、位置、布局

3、定义组件

4、将组件通过窗体的add刚发添加到窗体中

5、让窗体显示。通过setvisible(true)

 

事件监听机制

创建图形化界面:

1,创建frame窗体。

2,对窗体进行基本设置。

       比如大小,位置,布局。

3,定义组件。

4,将组件通过窗体的add方法添加到窗体中。

5,让窗体显示,通过setVisible(true)

 

 

 

 

事件监听机制的特点:

1,事件源。

2,事件。

3,监听器。

4,事件处理。

 

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

      

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

 

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

 

以上三者,在java中都已经定义好了。

直接获取其对象来用就可以了。

 

我们要做的事情是,就是对产生的动作进行处理。

窗体事件

窗口监听器:f.addWindowListener(WindowListener 1);

说明:

WindowListener作为一个接口有7个方法需要实现者覆写。

WindowListener一个子类WindowAdapter为抽象类,他覆盖了父类的所有方法,但方法都为空。这样就可以继承WindowAdapter就方便创建侦听器对象和方法的书写(不可能只需要一个关闭窗口的动作,还要把所有的方法都覆写一遍吧)。

 

因为WindowListener在java.awt.event包中,所以图形化通常要导两个包awt和awt.event包

 

WindowListener中的方法:

windowClosing(WindowEvent e)关闭窗口动作方法

windowActivated(WindowEvente)激活窗口,每次窗口被激活就会执行这个方法中的动作(每次前置也是激活)。

windowOpened(WindowEvent e)当程序被打开是会执行这个动作。

 

Component中的方法:

void setBounds(int x,int y,int width,intheight);相当于setLacation()和setSize()两个方法。

getParent():获取此组件的父级。

validate():相当于刷新布局。(已经显示容器后,在修改此容器的子组件的时候,应调用此方法)

 

把图形化与事件分开:

1、在成员变量位置定义该图形中所需的组件引用:

例:private Frame=f;

2、在构造函数中调用生成图形化的方法,使对象已建立就具备这样的图形和事件功能。

例:init();

3、定义init方法(其方法中生成图形化界面,并加载事件方法)

一、对Frame进行基本设置

二、将组建添加到Frame中

三、加载一下窗体事件

四、显示窗体

4、定义事件方法(其中有监听的组件的方法事件)

 

按钮特有的监听器——addActionListeren.(中有待实现的方法actionPorformed(ActionEvent e);)

按钮是少数没有Adapter(适配器)其中一个。(一般方法超过三个就会有适配器,因为适配器覆写了接口中的所有方法(方法为空),有利于创建方法是覆写)

 

例子

package gui;
import java.awt.*;
import java.awt.event.*;
public class AwtDemo {
   private Frame f;
   private Button b;
   public AwtDemo() {
      super();
      init();
   }
   private void init(){
      //创建一个不可见得窗体,名字为awt
      f=new Frame("awt");
      //设置窗体大小,x轴方向500,y轴方向400
      f.setSize(500, 400);
      //设置窗体距离屏幕左上角的位置x轴相对位置300,y轴相对位置200
      //f.setLocation(300, 200);
      //把Frame默认布局边界布局改为流式布局。
      //f.setLayout(new FlowLayout());
      //以上两个方法替换为
      f.setBounds(300, 200, 500, 400);
      //创建名字“按钮”的按钮
      b=new Button("关闭程序按钮按钮");
      //把按钮添加进窗体中
      f.add(b);
      myEvent();
      //设置窗体可见
      f.setVisible(true);
   }
   private void myEvent() {
      // TODO自动生成的方法存根
      b.addActionListener(new ActionListener(){
         int count=0;
         public void actionPerformed(ActionEvent e) {
            //System.out.println("按钮我关");
            //System.exit(0); 
            Button bu=(Button) e.getSource();
            Frame f1=(Frame) bu.getParent();
            f1.add(new Button("button"+count++));
            //刷新当前布局
            f1.validate();
         }       
      });
      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("打开了");
         }
      });     
   }
   public static void main(String[] args) {   
      new AwtDemo(); 
   }
}


鼠标键盘事件

鼠标键盘方法都在Component类中,因为所有组件都可以涉及到键盘鼠标事件。

 

按钮有addActionListener(ActionListener l)监听,鼠标和键盘都能操作。

              addMouseListener(MouseListenerl)监听,只间听鼠标对组件的操作。

当两者都存在监听单击时addMouseListener(MouseListener l)优先于addActionListener(ActionListener l)。

 

鼠标双击动作在MouseEvent类中有方法:e.getClickCount();//获取鼠标单击次数。

 

addKeyListener(Kyelistener l);方法多余三个所以有适配器类KeyAdapter。

Kyelistener接口中方法:keyPressed(KeyEvente);//按下某个键时调用此方法。

keyReleased(KeyEvent e);//释放某个键时调用此方法。

 

KeyEvent中方法:getKeyChar();返回为此按键事件定义的Unicode字符(可以理解为键盘上按下的键的字母)。

                            getKeyCode();返回键盘上实际键的整数代码(按下的键的代码)。

                            getKeyText(intkeyCode);返回物理键文本描述的字符串,物理键通过其keyCode标识(与getKeyChar()方法功能相同,只是字符串getKeyChar不能获取,并且他获得的是字符而不是字符串)。

 

在Event.InputEvent中有:

Boolean  isControlDown()用于判段Ctrl键是否按下。(常用于组合键)。

 

void consume();使用此事件,以便不会按照默认的方式,有产生此事件的源代码来处理此事件(比如文本框不允许输入字母,就可以调用此方法,让其输不进字母)

 

例子

package gui;
 
import java.awt.*;
import java.awt.event.*;
 
public class MouseAndKeyEvent
{
       privateFrame f;
       privateButton but;
       privateTextField tf;
       MouseAndKeyEvent()
       {
              init();
       }
       publicvoid init()
       {
              f= new Frame("my frame");
              f.setBounds(300,100,600,500);
              f.setLayout(newFlowLayout());
              tf= new TextField(20);
              but= new Button("my button");    
              f.add(tf);
              f.add(but);
              myEvent();
              f.setVisible(true);
       }
       privatevoid myEvent()
       {
              //窗体关闭监听
              f.addWindowListener(newWindowAdapter()
              {
                     publicvoid windowClosing(WindowEvent e)
                     {
                            System.exit(0);
                     }
              });
              //文本框监听键盘输入监听
              tf.addKeyListener(newKeyAdapter()
              {
                     publicvoid keyPressed(KeyEvent e)
                     {
                            intcode = e.getKeyCode();
                            if(!(code>=KeyEvent.VK_0&& code<=KeyEvent.VK_9))
                            {
                                   System.out.println(code+".....是非法的");
                                   e.consume();
                            }
                     }
              });
              //给But添加一个键盘监听。
              but.addKeyListener(newKeyAdapter()
              {      //案件监听
                     publicvoid keyPressed(KeyEvent e)
                     {     
                            if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
                                   //System.exit(0);
                            System.out.println("ctrl+enteris run");
 
                            //System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode());
                     }
              });
              /**/
              //对按钮监听(鼠标键盘都能操作)
              but.addActionListener(newActionListener()
              {
                     publicvoid actionPerformed(ActionEvent e)
                     {
                            System.out.println("actionok");
                     }
              });
             
 
              /**/
              //鼠标监听(只有鼠标操作监听)
              but.addMouseListener(newMouseAdapter()
              {
                     privateint count = 1;
                     privateint clickCount = 1;
                     //鼠标进入按钮范围监听(只有鼠标操作监听)
                     publicvoid mouseEntered(MouseEvent e)
                     {
                            System.out.println("鼠标进入到该组件"+count++);
                     }
                     //鼠标双击监听
                     publicvoid mouseClicked(MouseEvent e)
                     {
                            if(e.getClickCount()==2)
                                   System.out.println("双击动作"+clickCount++);
                     }
              });
             
       }
       publicstatic void main(String[] args)
       {
              newMouseAndKeyEvent();
       }
}


      对话框

对文本框清空操作:ta.setText();

ta.append(String s);可以向文本框添加信息

 

Dialog类——对话框

构造函数其一——Dialog(Frame owner,String tile,Boolean model);

构造一个初始不可见的Dialog对话框,它带有指定的所有者Frame。标题和模式。

当模式为true时,弹出对话框后,所属后台框体不可操作。

让对话框不显示——d.setVisible(false);

 

例子:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo
{
       privateFrame f;
       privateTextField tf;
       privateButton but;
       privateTextArea ta;
      
       privateDialog d;
       privateLabel lab;
       privateButton okBut;
 
 
       MyWindowDemo()
       {
              init();
       }
       publicvoid init()
       {
              f= new Frame("my window");
              f.setBounds(300,100,600,500);
              f.setLayout(newFlowLayout());
 
              tf= new TextField(60);
 
              but= new Button("转到");
 
              ta= new TextArea(25,70);
 
 
              d= new Dialog(f,"提示信息-self",true);
              d.setBounds(400,200,240,150);
              d.setLayout(newFlowLayout());
              lab= new Label();
              okBut= new Button("确定");
 
              d.add(lab);
              d.add(okBut);
 
 
 
              f.add(tf);
              f.add(but);
              f.add(ta);
 
 
              myEvent();
              f.setVisible(true);
       }
       privatevoid  myEvent()
       {
 
              okBut.addActionListener(newActionListener()
              {
                     publicvoid actionPerformed(ActionEvent e)
                     {
                            d.setVisible(false);
                     }
              });
              d.addWindowListener(newWindowAdapter()
              {
                     publicvoid windowClosing(WindowEvent e)
                     {
                            d.setVisible(false);
                     }
              });
 
              tf.addKeyListener(newKeyAdapter()
              {
                     publicvoid keyPressed(KeyEvent e)
                     {
                            if(e.getKeyCode()==KeyEvent.VK_ENTER)
                                   showDir();
                     }
              });
 
 
              but.addActionListener(newActionListener()
              {
                     publicvoid actionPerformed(ActionEvent e)
                     {
                            showDir();
                           
                     }
              });
 
              f.addWindowListener(newWindowAdapter()
              {
                     publicvoid windowClosing(WindowEvent e)
                     {
                            System.exit(0);   
                     }
              });
       }
 
       privatevoid showDir()
       {
              StringdirPath = tf.getText();
                           
              Filedir = new File(dirPath);
 
              if(dir.exists()&& dir.isDirectory())
              {
                     ta.setText("");
                     String[]names = dir.list();
                     for(Stringname : names)
                     {
                            ta.append(name+"\r\n");
                     }
              }
              else
              {
                     Stringinfo = "您输入的信息:"+dirPath+"是错误的。请重输";
                     lab.setText(info);
                     d.setVisible(true);
              }
       }
 
       publicstatic void main(String[] args)
       {
              newMyWindowDemo();
       }
}


菜单

想Frame中添加(MenuBar)菜单条是通过setMenuBar添加的。

把菜单添加在菜单条上。

Menu(菜单)下可以添加MenuIteam(子条目),也可以添加Menu(菜单)作为子菜单(当做为子菜单是会有箭头)。

 

例子:

 

import java.awt.*;
import java.awt.event.*;
 
 
class MyMenuDemo
{
       privateFrame f;
       privateMenuBar mb;
       privateMenu m,subMenu;
       privateMenuItem closeItem,subItem;
       MyMenuDemo()
       {
              init();
       }
       publicvoid init()
       {
              f= new Frame("my window");
              f.setBounds(300,100,500,600);
              f.setLayout(newFlowLayout());
              mb= new MenuBar();
              m= new Menu("文件");
              subMenu= new Menu("子菜单");
              subItem= new MenuItem("子条目");
              closeItem= new MenuItem("退出");
             
              subMenu.add(subItem);
              m.add(subMenu);
              m.add(closeItem);
              mb.add(m);
              f.setMenuBar(mb);
              myEvent();
              f.setVisible(true);
       }
       privatevoid myEvent()
       {
              closeItem.addActionListener(newActionListener()
              {
                     publicvoid actionPerformed(ActionEvent e)
                     {
                            System.exit(0);
                     }
              });
              f.addWindowListener(newWindowAdapter()
              {
                     publicvoid windowClosing(WindowEvent e)
                     {
                            System.exit(0);   
                     }
              });
       }
       publicstatic void main(String[] args)
       {
              newMyMenuDemo();
       }
}


记事本

package gui;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
 
public class MyMenuTest{
       privateFrame f;
       privateMenuBar bar;
       privateTextArea ta;
       privateMenu fileMenu;
       privateMenuItem openItem,saveItem,closeItem;
       privateFileDialog openDia,saveDia;
       privateFile file;
       MyMenuTest()
       {
              init();
       }
       publicvoid init()
       {
              f= new Frame("my window");
              f.setBounds(300,100,650,600);
              bar= new MenuBar();
              ta= new TextArea();
              fileMenu= new Menu("文件");     
              openItem = new MenuItem("打开");
              saveItem= new MenuItem("保存");
              closeItem= new MenuItem("退出");   
              fileMenu.add(openItem);
              fileMenu.add(saveItem);
              fileMenu.add(closeItem);
              bar.add(fileMenu);
              f.setMenuBar(bar);
              openDia= new FileDialog(f,"我要打开",FileDialog.LOAD);
              saveDia= new FileDialog(f,"我要保存",FileDialog.SAVE);
              f.add(ta);
              myEvent();
              f.setVisible(true);
       }
       privatevoid myEvent()
       {
              saveItem.addActionListener(newActionListener()
              {     
                     publicvoid actionPerformed(ActionEvent e)
                     {
                     //如果文件存在就不用弹出对话框了
                            if(file==null)
                            {
                                   saveDia.setVisible(true);
                                   StringdirPath = saveDia.getDirectory();
                                   StringfileName = saveDia.getFile();
                                   //考虑取消问题
                                   if(dirPath==null|| fileName==null)
                                          return;
                                   file= new File(dirPath,fileName);
                            }
                            try
                            {
                                   BufferedWriterbufw  = new BufferedWriter(newFileWriter(file));
                                   Stringtext = ta.getText();
                                   bufw.write(text);
                                   //bufw.flush();
                                   bufw.close();
                            }
                            catch(IOException ex)
                            {
                                   thrownew RuntimeException();
                            }                   
                     }
              });
              openItem.addActionListener(newActionListener()
              {
                     publicvoid actionPerformed(ActionEvent e)
                     {
                            openDia.setVisible(true);
                            StringdirPath = openDia.getDirectory();
                            StringfileName = openDia.getFile();
//                         System.out.println(dirPath+"..."+fileName);
                            if(dirPath==null|| fileName==null)
                                   return;
                            ta.setText("");
                            file= new File(dirPath,fileName);
                            try
                            {
                                   BufferedReaderbufr = new BufferedReader(new FileReader(file));
 
                                   Stringline = null;
 
                                   while((line=bufr.readLine())!=null)
                                   {
                                          ta.append(line+"\r\n");
                                   }
 
                                   bufr.close();
                            }
                            catch(IOException ex)
                            {
                                   thrownew RuntimeException("读取失败");
                            }
 
 
                     }
              });
              closeItem.addActionListener(newActionListener()
              {
                     publicvoid actionPerformed(ActionEvent e)
                     {
                            System.exit(0);
                     }
              });
              f.addWindowListener(newWindowAdapter()
              {
                     publicvoid windowClosing(WindowEvent e)
                     {
                            System.exit(0);   
                     }
              });
       }
       publicstatic void main(String[] args) {
              newMyMenuTest();
       }
}


 

/*

如何制作可以双击执行的jar包呢?

1,将多个类封装到了一个包(package)中。

2,定义一个jar包的配置信息。

       定义一个文件a.txt 。文件内容内容为:

       Main-Class:(空格)包名.类名(回车)

3,打jar包。

       jar-cvfm my.jar a.txt 包名

4,通过winrar程序进行验证,查看该jar的配置文件中是否有自定义的配置信息。

 

5,通过工具--文件夹选项--文件类型--jar类型文件,通过高级,定义该jar类型文件的打开动作的关联程序。

       jdk\bin\javaw.exe-jar

 

6,双击试试!。哦了。

 

 ------- android培训java培训、期待与您交流! ----------详细请查看:http://edu.csdn.net

 

*/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值