java笔记28 GUI

来源:互联网 发布:知乎怎么回答 编辑:程序博客网 时间:2024/06/05 19:10

1.       GUI

图形化界面Graphical  User Interface  图形用户接口

用图形的方式来显示计算机操作的界面,方便直观        

2.       CLI

        Command lineUser Interface 命令行用户接口

        就是常见的dos命令行操作

        需要记忆一些常用的命令,操作不直观

3.       java为GUI提供的对象都存在java.Awt和java.Swing中

        Awt:Abstract Window Tookit(抽象窗口工具包)

        需要调用本地系统方法实现功能,属于重量级控件(比较依赖底层)

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

        

 

 

 

4.       布局管理器

容器中的组件的排放方式,就是布局。

常见的布局管理器:

FlowLayout(流式布局管理器)

从左到右的顺序排列。

Panel默认的布局管理器。

BorderLayout(边界布局管理器)

东,南,西,北,中

Frame默认的布局管理器。

GridLayout(网格布局管理器)

规则的矩阵

CardLayout(卡片布局管理器)

选项卡

GridBagLayout(网格包布局管理器)

非规则的矩阵

5.       创建图形化界面

        1、创建frame窗体

        2、对窗体进行基本设置

                 比如大小  位置  布局

        3、定义组件

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

        5、让窗体可视化,setVisible(true)      

import java.awt.*;

import javax.swing.*;

public class H_01GUI {

         public static void main(String[] args) {             

                   Frame f=new Frame("my awt");

                   f.setSize(500, 400);//先横坐标  再右坐标,设置窗体大小

                   f.setLocation(400, 200);//设置出现位置(左上角到屏幕左上角的距离)

                   f.setLayout(new FlowLayout());//设置流式布局

                   Button  b=new Button("一个按钮");//创建一个按钮                  

                   f.add(b);//按钮添加到框架中

                   f.setVisible(true);//设置可视化                        

         }

}


此时没有功能,无法关闭

6.       事件监听机制

         事件监听机制的特点

        1、事件源: awi包、swing包中的图形界面组件

        2、事件:每一个事件源都有自己特有的对应事件和共性事件(鼠标、键盘事件)

        3、监听器:将可以出发某一个时间的动作都已经封装到监听器

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

                 直接获取其对象就可以了

        4、事件处理:     

        public abstract class WindowAdapter

                 extends Object

                 implements WindowListener, WindowStateListener, WindowFocusListener

        接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。

         正常应该使用

         class Mywin implements WindowListener

         {

                   覆盖7个方法、但只想要用关闭方法,其他动作都没没有用到,可是却必须复写,非常麻烦。

         }      

        因为WindowAdapter已经实现了WindowListener接口

        并覆盖了其中所有的方法,那么只要继承自WindowAdapter覆盖需要的方法即可

                 class Mywin extends WindowAdapter

                 {

                          

                 }

import java.awt.*;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

 

public class H_04JianTing {

    public static void main(String[] args) {

        Frame f=new Frame("my awt");

        f.setSize(500, 400);//先横坐标  再右坐标,设置窗体大小

        f.setLocation(400, 200);//设置出现位置(左上角到屏幕左上角的距离)

        f.setLayout(new FlowLayout());//设置流式布局

        Button  b=new Button("一个按钮");//创建一个按钮

        f.add(b);//按钮添加到框架中

       

        f.addWindowListener(new WindowAdapter()//对frame添加监听

        {

            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);//设置可视化  如果在监听事件前,那么监听“打开”将不会执行

    }

}

 

class  MyWin extends WindowAdapter

{

    public void windowClosing(WindowEvent e)

    {

        System.out.println("window closing"+e.toString());

        System.exit(0);//可以使用匿名内部类

    }

}


7.       鼠标和键盘的监听

//给文本框添加键盘监听

        tf.addKeyListener(new KeyAdapter()

        {

            public void keyPressed(KeyEvent e)

            {

                int code=e.getKeyCode();

                if(!(code>KeyEvent.VK_0&&code<KeyEvent.VK_9))//判断输入的键是否是数字

                    {

                        System.out.println("输入错误");

                        e.consume();//不按照默认方式处理,屏蔽键

                    }

            }      

        });    

       

        //给按钮添加键盘监听

        but.addKeyListener(new KeyAdapter()

        {

            public void keyPressed(KeyEvent e)

            {

                //

                if(e.getKeyCode()==KeyEvent.VK_ESCAPE)

                    System.exit(0);

                if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)

                    System.out.println("发送信息");

                //System.out.println(e.getKeyChar()+"--"+e.getKeyCode());

            }

        });    

       

        //给按钮添加鼠标监听

        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++);

                System.out.println("点击"+clickCount++);

            }          

        });


 

8.       简易记事本程序

GUI难的地方在于设计好的布局。

后台程序起始比较简单,就是将对应的事件监听添加到对应的组件上。

以下是一个简易记事本程序

import java.awt.*;

import java.awt.event.*;

import java.io.*;

 

public class H_11MenuDemo

{

    public static void main(String[] args)

    {

       

        new MenuDemo();

    }

}

 

class MenuDemo

{

    private Frame f;

    private MenuBar mb;

    private Menu fileMenu,subMenu;

    private MenuItem openItem,saveItem,closeItem,subItem;

    private TextArea ta;

    private FileDialog openDia,saveDia;

    private File file;

   

    MenuDemo()

    {

        init();

    }

    public void init()

    {

        f=new Frame("my window");

        f.setBounds(300, 200, 600, 500);

        //f.setLayout(new FlowLayout()); 直接用边界布局

        ta=new TextArea();

       

        //实例化

        mb=new MenuBar();

        fileMenu=new Menu("文件");

        openItem=new MenuItem("打开");

        saveItem=new MenuItem("保存");

        closeItem=new MenuItem("退出");

        subItem=new MenuItem("文本文档");

        subMenu=new Menu("新建");

       

        //添加到菜单

        subMenu.add(subItem);

        fileMenu.add(subMenu);

        fileMenu.add(openItem);

        fileMenu.add(saveItem);

        fileMenu.add(closeItem);

       

               

        mb.add(fileMenu);//添加菜单到菜单条

        f.setMenuBar(mb);//添加菜单条到框架

        f.add(ta);

        openDia=new FileDialog(f,"打开",FileDialog.LOAD);//打开窗口

        saveDia=new FileDialog(f,"保存",FileDialog.SAVE);//保存窗口界面

       

        myEvent();//添加监视器

        f.setVisible(true);   

    }

    private  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(filename==null||dirpath==null)

                        return;//如果没有选择,则直接返回

                    file=new File(dirpath,filename);

                }

                BufferedWriter bufw=null;

                try

                {

                    bufw=new BufferedWriter(new FileWriter(file));

                    String text=ta.getText();

                    bufw.write(text);

                    bufw.flush();

                } catch (IOException e1) {

                    e1.printStackTrace();

                }

                finally

                {

                    if(bufw!=null)

                    {

                        try {

                            bufw.close();

                        } catch (IOException e1) {

                            e1.printStackTrace();

                        }

                    }

                }

               

            }

        });

       

        openItem.addActionListener(new ActionListener()//打开按钮的监听

        {

            public void actionPerformed(ActionEvent e)

            {

                openDia.setVisible(true);

                String dirpath=openDia.getDirectory();

                String filename=openDia.getFile();

                if(filename==null||dirpath==null)

                    return;//如果没有选择,则直接返回

                ta.setText("");

               

                BufferedReader bufr=null;

                String line=null;

                try

                {

                    bufr=new BufferedReader(new FileReader(newFile(dirpath,filename)));

                    while((line=bufr.readLine())!=null)

                    {

                        ta.append(line+"\r\n");

                    }                  

                } catch (IOException e1)

                {

                    throw new RuntimeException("读取失败");

                }

                finally

                {

                    if(bufr!=null)

                    {

                        try {

                            bufr.close();

                        } catch (IOException e1) {

                            e1.printStackTrace();

                        }

                    }                  

                }          

            }      

        });

        subItem.addActionListener(new ActionListener()

        {

            public void actionPerformed(ActionEvent e)

            {

                new MenuDemo();//达到新建文件的效果

            }      

        });

        closeItem.addActionListener(new ActionListener()

        {

            public void actionPerformed(ActionEvent arg0)

            {

                System.exit(0);

            }          

        });

        f.addWindowListener(new WindowAdapter()

        {

            public void windowClosing(WindowEvent e)

            {

                System.exit(0);

            }

        });

    }  

}


         运行效果

        

9.       可运行的jar包

         打包

         Javac  –d c:\myclass  MyMenuTest.java

         Jar –cvf my.jar MyMenu

 

         写一个txt   写明主函数

         Main-Class: mymenu.MyMenuTest   回车

         Class后面要加空格,最后要加回车

         不然不能识别。

         不带GUI的java程序可以打包,但是点击也没有用。

0 0