黑马程序员——15Java图形用户界面GUI

时间:2023-01-27 13:14:22

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

1,GUI——Graphical User Interface(图形用户接口)用图形的方式,来显示计算机操作的界面,这样更方便更直观。

     GLI——Command line User Interface (命令行用户接口), 就是常见的Dos 命令行操作。 需要记忆一些常用的命令,操作不直观。 举例:创建文件夹,或者删除文件夹等。
 Java GUI 提供的对象都存在java.Awt javax.Swing 两个包中。
 Awt Swing
java.Awt——Abstract Window Toolkit( 抽象窗口工具包) ,需要调用本地系统方法实现功能,属于重量级控件。

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

黑马程序员——15Java图形用户界面GUI  
Container :为容器。是一个特殊的组件,该组件可以通过add 方法添加其他组件进来。

2, 容器中的组件的排放方式,就是布局。
  常见的布局管理器:
          FlowLayout (流式布局管理器):   从左到右的顺序排列, Panel 默认的布局管理器。
          BorderLayout( 边界布局管理器 ):   东,南,西,北,中。 Frame 默认的布局管理器。
         GridLayout( 网格布局管理器):       规则的矩阵。
         CardLayout( 卡片布局管理器):      选项卡。
         GridBagLayout( 网格包布局管理器): 非规则的矩阵。
3,创建图形化界面:
        1)创建Frame窗体。
        2)对窗体进行基本设置。比如,大小,位置,布局。
        3)定义组件。
        4)将组件通过窗体的add方法添加到窗体中。
        5)让窗体显示,通过setVisible(true)。
    事件监听机制的特点:
        1)事件源。
        2)事件。
        3)监听器。
        4)事件处理。
事件源:就是Awt包或者Swing包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不只一个动作),都已经封装到了监听器中。
以上三者在java中都已经定义好了,直接获取其对象来用就可以了。
我们要做的事件是:对产生的动作进行处理。
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);
        f.setLocation(300,200);
        f.setLayout(new FlowLayout());
        Button b=new Button("我是一个按钮");
        f.add(b);
        f.addWindowListener(new MyWin());
        f.setVisible(true);
             }
        }
        class MyWin implements WindowListener{
//覆盖7个方法。可是我只用到了关闭的动作,其他的动作都没有用到,可是却必须复写。
        }
         //因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。
        //并覆盖了其中的所有方法。那么我只要继承自WindowAdapter覆盖我需要的方法即可。
        class MyWin extends WindowAdapter{
        public void windowClosing(WindowEvent e){
        //System.out.println ("window closing---"+e.toString());
        System.exit(0);
        }
        public void windowActivated(WindowEvent e){
        System.out.println("active");
        }
        public void windowOpened(WindowEvent e){
        System.out.println("open");
        }
        }

4,事件监听机制组成。事件源(组件),事件(Event),监听器(Listener),事件处理(引发事件后处理方式)。

黑马程序员——15Java图形用户界面GUI

 

         我们写代码通常为了便于阅读把事件程序单独封装到一个方法中。监听器(或者适配器)用匿名内部类实现后作为参数添加到图形界面中。
         public void myEvent(){
                //让frame具备关闭的功能。
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);
}
});

5, 鼠标和键盘的事件监听。
    ·       import java.awt.*;
            import java.awt.event.*;
            class MouseAndKeyEvent{
                    private Frame f;
                    private Button but;
                    private TextField tf;
                    MouseAndKeyEvent() {
                            init();
                    }
                    public void init(){
                            f=new Frame("my frame");
                            f.setBounds(300,100,600,500);
                            f.setLayout(new FlowLayout());
                            but=new Button("登陆");
                            tf=new TextField(20);
                            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)){
                                                    System.out.println(code+"...是非法的");
                                                    e.consume();
                                            }
                                    }
                            });
                            but.addKeyListener(new KeyAdapter(){
                                    public void keyPressed(KeyEvent e){
                                             //按下Ctrl+Enter则退出。
                                            if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
                                                    System.exit(0);
                                            System.out.println(e.getKeyText(e.getKeyCode()));
                                    }
                            });
                            but.addActionListener(new ActionListener(){
                                    public void actionPerformed(ActionEvent e){
                                            System.out.println("按钮活动监听");
                                    }
                            });
                            but.addMouseListener(new MouseAdapter(){
                                    private int count=1;
                                    private int clickcount=1;
                                    private int doubleclickcount=1;
                                    public void mouseClicked(MouseEvent e){
                                            //一般交给活动事件监听
                                            if(e.getClickCount()==1)
                                                    System.out.println("鼠标单击---"+clickcount++);
                                             if(e.getClickCount()==2&&e.getButton()==MouseEvent.BUTTON1)
                                                    System.out.println("鼠标双击==="+doubleclickcount++);
                                    }
                                    public void mousePressed(MouseEvent e) {
                                            System.out.println("鼠标按下"+clickcount);
                                    }
                                    public void mouseReleased(MouseEvent e){
                                            System.out.println("鼠标释放"+clickcount);
                                    }
                            });
            }
                    public static void main(String[] args){
                            new MouseAndKeyEvent();
                    }
            }

6,对话框Dialog。
        import java.awt.*;
        import java.awt.event.*;
        import java.io.*;
          private void myEvent(){
                okBut.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                                d.setVisible(false);
                        }
                });
                //隐藏对话框。
                daglog.addWindowListener(new WindowAdapter(){
                        public void windowClosing(WindowEvent e){
                                daglog.setVisible(false);
                        }
                });
                //定义Enter快捷键。
                okBut.addKeyListener(new KeyAdapter(){
                        public void keyPressed(KeyEvent e){
                                if(e.getKeyCode()==KeyEvent.VK_ENTER)
                                        d.setVisible(false);
                        }
                });
                tf.addKeyListener(new KeyAdapter(){
                        public void keyPressed(KeyEvent e){
                                if(e.getKeyCode()==KeyEvent.VK_ENTER)
                                        showDir();
                        }
                });
                but.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                                showDir();
                        }
                });
                //关闭窗口。
                f.addWindowListener(new WindowAdapter(){
                        public void windowClosing(WindowEvent e){
                                System.exit(0);
                        }
                });
        }
        private void showDir(){
                String dirPath=tf.getText();
                File dir=new File(dirPath);
                 //若目录存在且确定是目录,则显示目录下的文件名。否则报错,调用对话框给出提示信息。
                if(dir.exists()&&dir.isDirectory()){
                        ta.setText("");
                        String[] names=dir.list();
                        for(String name:names) {
                                ta.append(name+"\r\n");
                        }
                }else {
                        String info=null;
                        if(!(dirPath.equals("")))
                                info="警告:您输入的信息"+dirPath+"错误,请查询后点确定重新输入哈!";
                        else
                                info="警告:!!拜托哥们,输入的信息不能为空,点确定后重新输入!!";
                        lab.setText(info);
                        daglog.setVisible(true);
                }
        }

7,设置frame的菜单栏,菜单,菜单项。
    public void init(){
            //设置frame容器
            f=new Frame("my window");
            f.setBounds(300,100,600,400);
            bar=new MenuBar();
            ta=new TextArea();
            //创建各种组件
            fileMenu=new Menu("文件");
            newMenu=new Menu("新建");
            net=new MenuItem(".net文件");
            java=new MenuItem("java文件");
            html=new MenuItem("html文件");
            openItem=new MenuItem("打开");
            saveItem=new MenuItem("保存");
            closeItem=new MenuItem("退出");  
                //将MenuItem添加到newMenu子菜单中。Menu继承于MenuItem。
                newMenu.add(java);
                newMenu.add(net);
                newMenu.add(html);
                //MenuItem add(MenuItem mi)  将指定的菜单项添加到此菜单。其中newMenu还有子菜单。
                fileMenu.add(newMenu);
                fileMenu.add(openItem);
                fileMenu.add(saveItem);
                fileMenu.add(closeItem);

                 //往菜单栏里添加菜单。
                bar.add(fileMenu);

                 //设置frame的菜单栏
                f.setMenuBar(bar);
                openDia=new FileDialog(f,"打开文件",FileDialog.LOAD);
                saveDia=new FileDialog(f,"保存文件",FileDialog.SAVE);

                f.add(ta);
                myEvent();
                f.setVisible(true);
        
        //定义图形界面的事件。
        private void myEvent(){
                 //打开指定目录下的文件,并将其内容显示在文本区。
                openItem.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e){
                                openDia.setVisible(true);
                                String dirPath=openDia.getDirectory();
                                String fileName=openDia.getFile();
                                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");
                                     }catch (IOException ie){
                                throw new RuntimeException("读取失败");
                                 }
                        }
                });
                 //保存文本区的内容到指定目录下。
                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 oe){
                                            throw new RuntimeException("写入失败");
                                }
                        }
                });
        }

注意:
1)设置菜单重点掌握菜单栏,菜单,子菜单,菜单项之间的嵌套和包含关系。菜单栏MenuBar只能添加菜单Menu。Menu类继承于MenuItem类,但MenuItem不具备添加add的功能。菜单Menu可以添加菜单项MenuItem,也可添加子菜单Menu。所以,
子菜单必须定义为Menu才行。

2)监听器为接口,所有其所有的方法,在子类中必须全部复写,当所以方法的个数大于2个的,API为我们提供了对应的适配器抽象类,它用空方法复写了父类接口的所有抽象方法,这时,我们就可以直接继承适配器,在复写我们需要的方法即可。这样大大简化的代码。
 
 

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