黑马程序员=====GUI

来源:互联网 发布:java 获取字符串下标 编辑:程序博客网 时间:2024/06/12 00:20

  ------<a  target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

GUI就是图形用户界面

java为GUI提供的对象都存在java.awt和javax.swing两个包中。
awt:全类名为:java.awt,awt全称为:abstact window toolkit抽象窗口工具包,需要调用本地系统中的方法实现功能,是一个重量级控件
swing:全类名为:java.swing,swing是在awt的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全又java实现。增强了移植性,属于轻量级控件
继承关系图
黑马程序员——GUI - pozhujun -
Container:为容器,是一个特殊的组件,该组件中可以通过add
方法添加其他组件进来。
布局管理器
容器中的组件的排放方式,就是布局。
常见的布局管理器:
FlowLayout(流式布局管理器)
从左到右的顺序排列。
Panel默认的布局管理器。
BorderLayout(边界布局管理器)
东,南,西,北,中
Frame默认的布局管理器。
GridLayout(网格布局管理器)
规则的矩阵
CardLayout(卡片布局管理器)
选项卡
GridBagLayout(网格包布局管理器)
非规则的矩阵
建立一个简单的窗体
Container常用子类: Window Panel(面板,
不能单独存在。)
Window常用子类: Frame,Dialog
简单的窗体创建过程:
Frame f = new Frame(“my window”);
f.setLayout(new FlowLayout());
f.setSize(500,400);//设置窗体大小
f.setLocation(300,200);//设置窗体出现在屏幕的位置
f.setVisible(true);
事件监听机制组成
事件源(组件)
事件( Event)
监听器( Listener)
事件处理(引发事件后处理方式)
事件监听机制流程图:
黑马程序员——GUI - pozhujun -
事件监听机制
确定事件源(容器或组件)
通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
一般用匿名内部类来表示。
在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者, getComponent()获取。)
问题:
怎么实现通过按钮关闭窗体
给窗口添加一个WindowListener覆盖WindowClosing方法,当事件被触发时执行关闭语句
怎么实现在窗体中通过按钮创建按钮。
给Button添加一个ActionListener覆盖actionPerformed方法,当动作被触发时,通过(Button)button.getSoource()获取Button对象bt,buttom.getParent().add(bt),将新按钮加入窗体中。
熟悉键盘事件与鼠标事件
鼠标事件:
but.addMouseListener(new MouseAdapter(){private int count = 1;private int clickCount = 1;public void mouseEntered(MouseEvent e) {System.out.println("鼠标进入到该组件"+count++);}public void mouseClicked(MouseEvent e){if(e.getClickCount()==2)System.out.println("双击动作"+clickCount++);}});


键盘事件:

but.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e){if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)System.out.println("ctrl+enter is run");}});


菜单体系图:
黑马程序员——GUI - pozhujun -

 MenuBar,Menu,MenuItem
先创建菜单条,再创建菜单,每一个菜单 中建立菜单项。
也可以菜单添加到菜单中,作为子菜单。
通过setMenuBar()方法,将菜单添加到Frame中。
MenuBar bar=new MenuBar();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);


练习:

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("my window");          f.setBounds(300,100,500,600);          f.setLayout(new FlowLayout());                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);      }      private void myEvent()      {          //关闭菜单具备关闭事件          closeItem.addActionListener(new ActionListener()          {              public void actionPerformed(ActionEvent e)              {                  System.exit(0);              }          });          //窗体关闭功能          f.addWindowListener(new WindowAdapter()          {              public void windowClosing(WindowEvent e)              {                  System.exit(0);               }          });      }            public static void main(String[] args)       {          new MyMenuDemo();      }  }  


jar包双击执行

        既然是图形化界面,就需要通过图形化界面的形式运行程序,而不是是用Dos命令行执行,那么如何通过双击程序就执行程序呢?这就需要将程序的class文件打包。

步骤如下:

        1、首先要在java文件中导入一个包,没有则需创建一个包,如package mymenu;

        2、生成包:通过编译javac -d c:\myclass MyMenu.java,此时则在c盘下的myclass文件夹下生成了所有的.class文件

        3、在此目录下新建一个文件,如1.txt或者其他任意名称任意扩展名的文件都可,然后在其中编辑固定的格式:“Main-Class: mymenu.MenuDemo”,只写引号中的内容。需要需要在冒号后有一个空格,在文件末尾要回车。

        4、编译:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,则直接编译jar即可得出相应的命令

        5、此时双击即可执行。

说明:

        1)在固定格式中:

                a、如果无空格:在编译的时候,就会报IO异常,提示无效的头字段,即invalidheader field。这说明1.txt在被IO流读取。

                b、如果无回车:在列表清单.MF中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行。

        2jar文件必须在系统中注册,才能运行。注册方法如下:

        A.对于XP系统:

               a.打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项

               b.选择新建--->扩展名,将扩展名设置为jar,确定

               c.选择高级,可更改图标,然后点击新建,命名为open

               d.在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。

        B.对于win7系统:

               a.改变打开方式:右击.jar文件,点击打开方式,选择默认程序为jdkbin中的javaw.exe应用程序。

               b.修改关联程序的注册表:打开注册表(win+r),找到注册表路径\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command下的字符串值,右击点修改,在原路径的中添加-jar,如:"C:\ProgramFiles\Java\jre6\bin\javaw.exe" -jar "%1",注意-jar两边要有空格,保存。

              c.双击即可执行jar程序,如果仍不能执行,则需下载最新版的jdk

示例:

/* 练习:利用Menu组件完成一个简单的记事本程序。 需求:具有文件菜单,文件中有打开,保存和退出功能。将写好的程序变为双击可执行的程序。 */    package mymenu;  import java.awt.*;  import java.awt.event.*;  import java.io.*;    class MyMenuText  {      //定义组件引用      private Frame f;      private TextArea ta;      private MenuBar mb;      private Menu fileMe;      private MenuItem openMi,saveMi,otherSaveMi,closeMi;        private FileDialog openDia,saveDia;        private File file;        //构造函数      MyMenuText()      {          init();      }        //功能实现      private void init()      {          //组件实例化          f=new Frame("MyText");          ta=new TextArea();                    mb=new MenuBar();          fileMe=new Menu("文件");          openMi=new MenuItem("打开");          saveMi=new MenuItem("保存");          otherSaveMi=new MenuItem("另存为");          closeMi=new MenuItem("退出");            openDia=new FileDialog(f,"选择打开的文件",FileDialog.LOAD);          saveDia=new FileDialog(f,"保存到哪里",FileDialog.SAVE);            //基本设置          f.setBounds(300,150,600,500);            //添加组件          f.add(ta);          f.setMenuBar(mb);            mb.add(fileMe);          fileMe.add(openMi);          fileMe.add(saveMi);          fileMe.add(otherSaveMi);          fileMe.add(closeMi);            //窗体中事件          myEvent();            //窗体显示          f.setVisible(true);      }        private void myEvent()      {          //窗体关闭功能          f.addWindowListener(new WindowAdapter()          {              public void windowClosing(WindowEvent e)              {                  System.exit(0);              }          });            //打开事件          openMi.addActionListener(new ActionListener()          {              public void actionPerformed(ActionEvent e)              {                  //显示文件对话窗口                  openDia.setVisible(true);//------------------                  String dir=openDia.getDirectory();//获取目录                  String fileName=openDia.getFile();//获取文件名                                    if(dir==null||fileName==null)//对打开了文件对话框,但未做出操作的处理                      return;                            file=new File(dir,fileName);//文件对象                  try                  {                      ta.setText("");//每打开一个文件时,将文本区的内容清空                      //带缓冲技术的读取流                      BufferedReader br=new BufferedReader(new FileReader(file));                      String line=null;//读一行                      while ((line=br.readLine())!=null)                      {                          //添加到文本区域                          ta.append(line+"\r\n");                      }                      br.close();//关流                  }                  catch (IOException ie)                  {                      throw new RuntimeException("文件打开失败");                  }              }          });            //保存事件          saveMi.addActionListener(new ActionListener()          {              public void actionPerformed(ActionEvent e)              {                  //如果是第一次保存,则显示文件对话框                  if(file==null)//-------------                  {                      //显示文件对话框                      saveDia.setVisible(true);//----------------------                      String dir=saveDia.getDirectory();                      String filename=saveDia.getFile();                                            if(dir==null||filename==null)//--------------------                          return;                        file=new File(dir,filename);                                        }                  save();//保存文件方法              }          });                    //另存为事件          otherSaveMi.addActionListener(new ActionListener()          {              public void actionPerformed(ActionEvent e)              {                  //不管是不是第一次保存,都显示文件对话框                  saveDia.setVisible(true);//----------------------                  String dir=saveDia.getDirectory();                  String filename=saveDia.getFile();                    if(dir==null||filename==null)//--------------------                      return;                    file=new File(dir,filename);                    save();//保存文件方法                  //保存时,默认文件对话框位置在打开文件的位置                  openDia.setFile(file.getName());              }          });            //退出事件          closeMi.addActionListener(new ActionListener()          {              public void actionPerformed(ActionEvent e)              {                  System.exit(0);              }          });      }            //保存文件      private void save()      {                     try          {              //带缓冲区的写入流              BufferedWriter bw=new BufferedWriter(new FileWriter(file));              //获取文本区域中的内容              String text=ta.getText();              bw.write(text);//写入文件中              bw.close();//关流            }          catch (IOException ie)          {              throw new RuntimeException("文件保存失败");          }      }        public static void main(String[] args)       {          //程序运行          new MyMenuText();      }  }  


0 0