首页 > 代码库 > 黑马程序员——Java基础——GUI

黑马程序员——Java基础——GUI

第一讲  图形化用户界面

GUI(图形用户界面)
GUI
• Graphical User Interface(图形用户接口)。
• 用图形的方式,来显示计算机操作的界面,这样更方便更直观
CLI
• Command line User Interface (命令行用户接口)
• 就是常见的Dos命令行操作。
• 需要记忆一些常用的命令,操作不直观。

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

Awt与 Swing
• java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
• javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件

技术分享

Container常用的子类:Window   Panel

Window常用子类:Frame   Dialog

二、布局管理器

容器中的组件的排放方式,就是布局。
常见的布局管理器:
• FlowLayout(流式布局管理器)从左到右的顺序排列。flow嘛,跟着走就是流水
                •  Panel默认的布局管理器。
• BorderLayout(边界布局管理器)board嘛就是打麻将,所以是东西南北中布局
                •      Frame默认的布局管理器。
• GridLayout(网格布局管理器)Brid网格状的
• CardLayout(卡片布局管理器)
• 选项卡
• GridBagLayout(网格包布局管理器)
• 非规则的矩阵

 1 import java.awt.*; 2 /*创建步骤: 3  * 1、用Frame创建窗口 4  * 2、对窗口进行进本操作 5  *     大小setSize(),位置setLocation()、布局setLayout 6  * 3、定义组件(如Button按钮 、Label标签、Checkbox复选框等) 7  * 4、setVisible(boolean);显示窗口与否 8  */ 9 public class AwtDemo {10     public static void main(String[] args){11         Frame f=new Frame("水音");//创建12         f.setSize(500,400);//大小13         f.setLocation(300,200);//位置14         f.setLayout(new FlowLayout());//边界布局(桌子打麻将不仅)是默认的,这里改成流式跟班布局15         16         Button b=new Button("有压力");17         f.add(b);//按钮添加在窗口18         f.setVisible(true);//显示窗口19     }20 }

五、事件监听机制:

技术分享

1、组合:

  1)事件源(组件):awt或swing包中的图形化界面组件;

  2)事件(Event):每件时间有都有自己特有的对应事件;

  3)监听器:将可触发某一事件的动作,都封装在监听器中

  4)事件处理:引发事件后的处理方式;

2、使用方法

  1)确定事件源(容器或组件)。通过事件源对象的addXXXlistener()方法将监听器注册到该事件源上

如:

f.addWindowListener(new mylis());//主函数引用的方法//定义一个监听器基础WindowAdapter,并复写7大方法class mylis extends WindowAdapter {    public void WindowClosing(){        System.out.println("关闭按钮被按下");        System.exit(0);    }}

2)然而一般是使用你们匿名内部类方法:

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("开启");
  }
});

练习:面向对象的思想做一次按钮关闭窗口的监听

 1 import java.awt.*; 2 import java.awt.event.*; 3  4 class EvenDemo { 5 //    定义组件按钮和界面 6     private Frame f=null; 7     private Button but=null; 8 //    构造函数让他一new就执行 9     EvenDemo(){10         win();11     }12 //    定义窗口13     public void win(){14         f=new Frame("我是窗口");15         but=new Button("我是按钮");16         f.setBounds(250,250,250,250);//设置大小位置17         f.setLayout(new FlowLayout());//改成流式布局18 //        f加入but19         f.add(but);20         myEvent();21         f.setVisible(true);22     }23 //    定义时间24     public void myEvent(){25 //        窗口时间26         f.addWindowListener(new WindowAdapter() {27             public void windowClosing(WindowEvent e){28                 System.exit(0);29             }    30         });31         /*32          * 那么现在让按钮做时间源的话,选择哪个监听器呢?33          * 应该在API查阅button的描述,最后找到addActionListener34          * 35          */36         but.addActionListener(new ActionListener(){37 38             public void actionPerformed(ActionEvent arg0) {39                 System.out.println("按钮搞上你");40                 System.exit(0);41             }42         });43     }    44     public static void main(String[] args){45         new EvenDemo();46     }47 }

 

练习大全:鼠标(进入、双击、点击),键盘(点击,组合件),文本框(输入,非法输入)的监听

 1 import java.awt.*; 2 import java.awt.event.*; 3 class MouseEvent { 4 //    定义组件按钮和界面 5     private Frame f=null; 6     private Button but=null; 7     private TextField tf; 8 //    构造函数让他一new就执行 9     MouseEvent(){10         win();11     }12 //    定义窗口13     public void win(){14         f=new Frame("我是窗口");15         but=new Button("我是按钮");16         f.setBounds(250,250,250,250);//设置大小位置17         f.setLayout(new FlowLayout());//改成流式布局18 //        f加入but19         tf=new TextField(20);20         21         f.add(tf);22         f.add(but);23         myEvent();24         f.setVisible(true);25     }26 //    定义时间27     public void myEvent(){28 //        窗口时间29         f.addWindowListener(new WindowAdapter() {//比较多的时候是Adapter30             public void windowClosing(WindowEvent e){31                 System.exit(0);32             }    33         });34 //        按钮监听35         but.addActionListener(new ActionListener(){36 37             public void actionPerformed(ActionEvent arg0) {38                 System.out.println("按钮搞上你");39 //                System.exit(0);40             }41         });42 //        文本框注意使用的键盘监听43         tf.addKeyListener(new KeyAdapter() {44             public void keyPress(KeyEvent e){45                 int code=e.getKeyCode();46                 if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)){47                     System.out.println(code+""+e.getKeyCode());            76             }77         })    ;78         79         80     }    81     protected int getClickCount() {82         // TODO Auto-generated method stub83         return 0;84     }85     public static void main(String[] args){86         new MouseEvent();87     }88 }

 

练习:当文本框出现误操作时,出现提醒的机制

  1 import java.awt.*;  2 import java.awt.event.*;  3 import java.io.*;  4   5 import javax.swing.Action;  6   7 public class MyWindowDemo {  8   9     private Frame f; 10     private Button b; 11     private TextField tf;//文本框 12     private TextArea ta;//文本域 13      14     private Button okb; 15     private Dialog d;//出错的对话框 16     private Label lab;//出错的警示语标签 17     MyWindowDemo(){ 18         win(); 19     } 20 //    先做窗口 21     public void win(){ 22         f=new Frame("窗口"); 23         f.setBounds(200,200,600,300); 24         f.setLayout(new FlowLayout()); 25          26         b=new Button("按钮"); 27          28         tf=new TextField(30);//30长的文本框 29 //         30         ta=new TextArea(10,40);//高和长 31          32 //        各种添加 33         f.add(b); 34         f.add(tf); 35         f.add(ta); 36 //        事件发生 37         event(); 38 //        显示窗口 39         f.setVisible(true); 40     } 41      42 //    自定义事件 43     public void event(){ 44         f.addWindowListener(new WindowAdapter() { 45             public void windowClosing(WindowEvent e){ 46                 System.exit(0); 47             }             48         }); 49  50 //    按钮文本框内容搜索 51         b.addActionListener(new ActionListener() { 52             public void actionPerformed(ActionEvent e) { 53                 showFile(); 54             }             55         }); 56 //    文本框按钮enter后事件 57         tf.addKeyListener(new KeyAdapter(){ 58             public void keyPressed(KeyEvent e){ 59                 if(e.getKeyCode()==KeyEvent.VK_ENTER) 60                     showFile(); 61             } 62         }); 63     }     64 //    定义一个查看文件的方法 65     private void showFile(){ 66         ta.setText("");//每次清屏 67         String str=tf.getText();//得到文本框的值 68         File dir=new File(str);//创建一个文本框值对应的文件 69         if(dir.exists()&&dir.isDirectory()){//如果文件且有目录 70             String[] names=dir.list();//那就遍历下存好 71             for(String name:names){ 72                 ta.append(name+"\r\n"); 73             } 74         }else{ 75 //            对话框设置 76             d=new Dialog(f,"错误信息",true); 77             d.setBounds(400,200,180,150); 78             d.setLayout(new FlowLayout()); 79 //            按钮盒标签 80             okb=new Button("确定"); 81             lab=new Label("输入的信息:"+str+"是错误的"); 82              83             d.add(okb); 84             d.add(lab); 85 //            对话框关闭 86             d.addWindowListener(new WindowAdapter(){ 87                 public void windowClosing(WindowEvent e){ 88                     d.setVisible(false);//窗体不显示 89                 } 90             }); 91 //            对话框的确定按钮 92             okb.addActionListener(new ActionListener() { 93                 public void actionPerformed(ActionEvent e) { 94                     d.setVisible(false);//okb按下后窗体不显示             95                 } 96             }); 97              98             d.setVisible(true); 99         }100     }101     102     public static void main(String[] args){103         new MyWindowDemo();104     }105 }

 

菜单:MenuBar

MenuComponent

  |-MenuBar:菜单栏,可添加菜单和菜头子条目

  |-MenuItem:是最终的条目,没有三角标

    |-Menu:菜单,可添加菜单和MenuItem,有三角标

一般对Menu和MenuItem的对象作为事件源添加获得监听ActionListener,并进行事件处理

 

 1 import java.awt.*; 2 import java.awt.event.*; 3  4 //练习菜单的使用并制作退出时间 5 public class myMubuDemo { 6 //定义组件 7     private Frame fra; 8     private MenuBar mb; 9     private Menu m1,m2;10     private MenuItem close1,subI;11 //    初始化12     myMubuDemo(){13         win();14     }15     private void win(){16 //        窗体17         fra=new Frame("xxx");18         fra.setBounds(300,100,500,600);19         fra.setLayout(new FlowLayout());20 //        菜单的设置21         mb=new MenuBar();22         m1=new Menu("选项1");23         m2=new Menu("子菜单");24         25         close1=new MenuItem("退出");26         subI=new MenuItem("子条目");27 //        从小开始添加28         m2.add(subI);29         m1.add(m2);30         m1.add(close1);31         32         mb.add(m1);33 //    注意不是add    窗体添加菜单bar34         fra.setMenuBar(mb);35 //        时间发生36         myEvent();37         38         fra.setVisible(true);39     }40     private void myEvent() {41 //        x关闭功能42         fra.addWindowListener(new WindowAdapter(){43             public void windowClosing(WindowEvent e){44                 System.exit(0);45             }46         });47 //        点击MenuItem关闭功能48         close1.addActionListener(new ActionListener(){49             public void actionPerformed(ActionEvent arg0) {50                 System.exit(0);51             }52         });53     }54     public static void main(String[] args){55         new myMubuDemo();56     }57 }

 

 

以下是j制作一个文本软件和制作Jar包的练习

先制作一个简易的文本软件:

package Menu;/*需求:制作一个简易的记事本程序 * 要求:有菜单,文件有打开、保存、退出的功能。还将协会的程序变为可双击执行的程序 *  * 步骤:    一、代码部分 *            1、我需要new一下构造函数就执行功能,所以各种组件定义在主函数外,由构造 *              函数启动个功能窗口myWin,有功能窗口启动时间myEvent *            2、文件的打开、保存功能由FileDialog实现 * *        二、jar包部分  *             以图列展现 */import java.awt.*;import java.awt.event.*;import java.io.*;public class MenuText {//    定义个组件//    基本组件    private Frame fra;    private    MenuBar bar;    private    Menu fileMe;    private MenuItem openI,saveI,otherSave,closeI;    private TextArea ta;//文本域//    用于保存于另存组件    private    FileDialog openDia,saveDia,saveDiaa;         private    File file;//    构造函数    MenuText(){        myWin();    }//    窗口实现    private void myWin(){//        搞组件啦        fra=new Frame("简易文本");        fra.setBounds(300,150,600,500);                ta=new TextArea();        bar=new MenuBar();        fileMe=new Menu("文件");        openI=new MenuItem("打开");        saveI=new MenuItem("保存");        otherSave=new MenuItem("另存为");        closeI=new MenuItem("退出");//        用于打开保存文件的组件FileDialog        openDia = new FileDialog(fra,"选择打开的文件",FileDialog.LOAD);//注意打开的最后参数        saveDia = new FileDialog(fra,"选择存的文件",FileDialog.SAVE);//注意打开的最后参数        saveDiaa = new FileDialog(fra,"选择存的文件",FileDialog.SAVE);//注意打开的最后参数                myEvent();        //        添加组件        fileMe.add(openI);        fileMe.add(saveI);        fileMe.add(otherSave);        fileMe.add(closeI);                bar.add(fileMe);        fra.add(ta);        fra.setMenuBar(bar);                fra.setVisible(true);    }//    事件监听    private void myEvent(){//        窗口关闭功能退出关闭和x关闭        fra.addWindowListener(new WindowAdapter(){            public void windowClosing(WindowEvent e){                System.out.println("x关闭");                System.exit(0);            }        });        closeI.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e) {                System.out.println("退出关闭");                System.exit(0);            }        });//        打开事件,打开需要使用FileDialog,需要知道文件目录,文件名,需要使用IO        openI.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e) {//        显示文件对话框                                openDia.setVisible(true);//                需要文件目录与名字                String di=openDia.getDirectory();                String fileName=openDia.getFile();                                if(di==null||fileName==null)//打开了对话框却没有做操作                    return;//                就可以搞一个文件了                file =new File(di,fileName);//这个就是我们打开的文件//                一下是使用IO缓冲流惊醒文件传输                try {                    ta.setText("");//情况我现在窗口的文字//                需要用缓冲流读取file在放弃ta里                    BufferedReader br=                            new BufferedReader(new FileReader(file));                    String line=null;                    while((line=br.readLine())!=null){                        ta.append(line+"\r\n");                    }                    br.close();                } catch (IOException e2) {                    throw new RuntimeException("文件打开失败");                 }                }                    });        //        保存事件        saveI.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e1) {//                如果第一次保存会显示对话框                if(file==null){//                    显示对话框                    saveDia.setVisible(true);                    String di=saveDia.getDirectory();                    String fileName=saveDia.getFile();                    if(di==null||fileName==null)//打开了对话框却没有做操作                        return;                    file =new File(di,fileName);//这个就是我们保存的文件                                    }                    save();//保存文件的方法            }        });//        另存事件        otherSave.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e2) {//                另存一定有对话框//                    显示对话框                saveDiaa.setVisible(true);//                目录和文件名来自对话框,就是                String di=saveDiaa.getDirectory();                String fileName=saveDiaa.getFile();                                file =new File(di,fileName);//这个就是我们保存的文件                                save();//                保存时,默认上次打开对话框文件位置                openDia.setFile(file.getName());            }        });    }//    保存文件使用IO技术,将窗口的内容写入新的文件中    private void save(){        try {            BufferedWriter bw=//写入file,所以保存和另存的区别在于file的不同                    new BufferedWriter(new FileWriter(file));            String line=ta.getText();            bw.write(line);//            bw.flush();应该close写在try所以不刷,一般close写在finally就需要刷            bw.close();        } catch (IOException e) {            throw new RuntimeException("文件保存失败");        }    }        public static void main(String[] args){        new MenuText();    }    }

导入Jar的步骤

1、我已经生成了一个包:D:\Java520s\GUI\src\Menu

2、

 

黑马程序员——Java基础——GUI