Java基础--GUI图形化界面

GUI

  1. GUI:Graphical User Interface图形用户接口;
  2. Java为GUI提供的对象都存在java.Awt和javax.Swing包中;
    两者的区别:java.Awt依赖本地系统方法实现功能,重量级控件;java.Swing在AWT基础上提供更多组件,完全由java实现,轻量级控件;

GUI继承关系图

Java基础--GUI图形化界面_第1张图片

布局管理器

  1. 布局:容器中的组件的排放方式;
  2. 常见的布局管理器:
    • FlowLayout-流式布局:从左到右的顺序排列,Panel默认布局;默认居中;
    • BorderLayout-边界布局:东南西北中,Frame默认布局;默认以最大面积填充;
    • GridLayout-网格布局:规则的矩阵;
    • CardLayout-卡片布局:选项卡;
    • GridBagLayout-网格包布局:非规则的矩阵;

Component类

  1. 概述:该类是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互,典型图形用户界面中的按钮,复选框和滚动条都是组件示例;
  2. 该类的直接常用子类:Button、Checkbox、Container、Lable、TextComponent;
  3. 构造方法:
    Component()构造一个新组件;
  4. 常用方法:

Container

该组件比较特殊,可将其他组件添加到容器的列表中;
add(Component comp);将指定组件追加到容器尾部;
add(Component comp,int index);将指定组件添加到容器的给定位置上;

建立一个窗体

  1. Container常用子类Window Panel(面板不能单独存在)
  2. Window常用子类:Frame Dialog
  3. 简单的窗体创建过程:
    Frame f=new Frame(“my window”);//带标题的窗体;
    f.setLayout(new FlowLayout);//设置布局;
    f.setSize(500,400);//设置窗体大小;
    f.setLocation(300,200);//设置本地位置;
    Button b=new Button();//创建一个按钮;
    f.add(b);//键按钮b添加到窗体;
import java.awt.*;
import java.awt.event.*;
class  FrameDemo{
    //定义该图形中所需的组件的引用。
    private Frame f;
    private Button but;
    FrameDemo(){
        init();
    }
    public void init(){
        f = new Frame("my frame");
        //对frame进行基本设置。
        f.setBounds(300,100,600,500);
        f.setLayout(new FlowLayout());
        but = new Button("my button");
        //将组件添加到frame中
        f.add(but);
        //加载一下窗体上事件。
        myEvent();
        //显示窗体;
        f.setVisible(true);
    }
    private void myEvent(){
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        //让按钮具备退出程序的功能
        /*
        按钮就是事件源。
        那么选择哪个监听器呢?
        通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器。
        需要查看该组件对象的功能。
         通过查阅button的描述。发现按钮支持一个特有监听addActionListener。
        */
        but.addActionListener(new ActionListener(){
            private int count = 1;
            public void actionPerformed(ActionEvent e){
                //System.out.println("退出,按钮干的");
                //System.exit(0);       
                //f.add(new Button("Button-"+(count++)));
                //f.setVisible(true);
                //f.validate();
                //System.out.println(e.getSource());
                Button b = (Button)e.getSource();       
                Frame f1 = (Frame)b.getParent();
                f1.add(new Button("button-"+count++));
                f1.validate();
            }
        });
    }
    public static void main(String[] args){
        new FrameDemo();
    }
}

创建图形化界面的步骤:

  1. 创建Frame窗体;
  2. 对窗体进行基本设置。比如:大小、位置、布局等;
  3. 定义组件;
  4. 将组件通过窗体的add方法添加到窗体中;
  5. 让窗体显示,通过setVisible(true)方法;

事件监听机制

  1. 事件监听机制组成

    • 事件源(组件)
    • 事件(Event)
    • 监听器(Listener)
    • 事件处理(引发事件后处理方式)
  2. 事件监听机制流程图
    Java基础--GUI图形化界面_第2张图片

  3. 事件监听机制的特点:

    • 事件源:就是awt包或者Swing包中的那些图形界面组件;
    • 事件:每一个事件源都有自己特有的对应事件和共性事件;
    • 监听器:将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中;
    • 以上三者java中都已经定义好了直接获取其对象来用即可,我们要做的就是对产生的动作进行处理
  4. 添加事件监听器:
    窗体事件:

    • addWindowListener(WindowListener l);添加窗口监听器;
      该方法为Window类中的方法,添加指定的窗口侦听器,以从此窗口接收窗口事件,如果l为null,则不执行任何操作;
    • WindowListener:用于接收窗口事件的侦听器接口;
    • WindowAdepter以实现该接口,但方法为空,此类存在的目的就是方便于创建侦听器对象,(如果要实现WindowListener接口,则需要定义接口内的所有方法,比较麻烦,故:此类的出现,只需将需要的方法复写即可);
      例 :定义一个类继承WindowAdpter并复写关闭方法,则可实现窗口关闭的需要:

      class MyWin extends WindowAdapter
      {
          public void WindowClosing(WindowEvent e)
          {
              System.exit(0);
          }
      }

      该方法关联到监听器并添加到事件源,点击关闭按钮,则会退出程序方法中的参数:WindowEvent e为事件信息;
      注:添加事件监听器是,需导入Java.awt.even包;

  5. 事件监听机制:

    • 去顶事件源(容器或组件)例:窗体,按钮;
    • 通过事件源对象的add×××Listener()方法将侦听器注册到该事件源上;
    • 该方法中接收×××Listener的子类对象,或者×××Listener的子类×××Adapter的子类对象;
    • 一般用匿名内部类来表示;
    • 在覆盖方法的时候,方法的参数一般是×××Event类型的变量接收;
    • 事件触发后会把事件打包成对象传递给该变量(其中包括事件源对象,通过getSource()或者getComponent()获取);
mport java.awt.*;
import java.awt.event.*;
import java.io.*;
class  MyWindowDemo{
    private Frame f;
    private TextField tf;
    private Button but;
    private TextArea ta;
    private Dialog d;
    private Label lab;
    private Button okBut;
    MyWindowDemo(){
        init();
    }
    public void init(){
        f = new Frame("my window");
        f.setBounds(300,100,600,500);
        f.setLayout(new FlowLayout());
        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(new FlowLayout());
        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);
    }
    private void  myEvent(){
        okBut.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                d.setVisible(false);
            }
        });
        d.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                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 = "您输入的信息:"+dirPath+"是错误的。请重输";
            lab.setText(info);
            d.setVisible(true);
        }
    }
    public static void main(String[] args) {
        new MyWindowDemo();
    }
}

附:Component中的方法:
- addKeyListener;添加键盘事件;
- addMouseListener;添加鼠标事件;

Action事件

  • addActionListener(ActionListener l);类Button方法;
  • ActionListener侦听器下的方法;
  • actionPerformed(ActionEvent e);

鼠标事件

  1. addMouseListener(MouseListener l);鼠标侦听器;类Component中的方法;
  2. MouseListener侦听器下的方法:(常用)MouseAdapter()
    • mouseClicked(MouseEvent e);单击并释放;
    • mouseDragged(~ e);按下并拖动;
    • mouseEntered(~ e);~进入组件;
    • mouseExited(~ e);~离开~;
    • mouseMored(~ e);~移动到组件上,但无按键按下;
    • mousePressed(~ e);~释放时~;
    • mouseWheelMored(MouseWheelEvent e);滚轮旋转;
  3. MouseEvent事件下的常用方法:
    -getClickCount();返回鼠标单击次数(例定义双击时发生事件)

键盘事件

  1. addKeyListener(KeyListener l);鼠标侦听器,该方法是Component下的方法;
  2. KeyListener接口;KeyAdapter,用于接收键盘事件;
  3. 该类中的方法:
    • keyPressed(keyEvent e);按下某个键时;
    • keyReleased(keyEvent e);释放某个键时;
    • keyTyped(keyEvent e);键入某个键时;
  4. keyEvent中的常用方法;
    • 字段摘要,键盘上所有键对应的值:static int~
      例:VK_0,VK_1……;
      getKeyChar();返回与此事件关联的字符;
      getKeyCode();返回与此事件关联的整数keyCode;
      getKeyText(int keyCode);放回描述keyCode的String;
      例:getKeyText(VK_SPACE);返回SPACE字符串;
      ……
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());
        tf = new TextField(20);
        but = new Button("my button");  
        f.add(tf);
        f.add(but);
        myEvent();
        f.setVisible(true);
    }
    private 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添加一个键盘监听。
        but.addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent e){ 
                if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)
                    //System.exit(0);
                System.out.println("ctrl+enter is run");
                //System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode());
            }
        });
        /*
        but.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.out.println("action ok");
            }
        });
        */
        /*
        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++);
            }
        });
        */
    }
    public static void main(String[] args) {
        new MouseAndKeyEvent();
    }
}

TextField单行文本

  1. 构造函数:
    • TextField()/(int columns)/(String text)/(String text,int colmns);columns-指定长度,text-初始化文本;
  2. 给该组件添加键盘监听,keyListener,通过键盘给文本框中输入文字,当限定条件仅输入指定范围文本,有效输入按其他不输入时,可使用keyEvent事件父类InputEvent类中的方法:
    • consume();该方法不会按默认方式处理,即按下限定条件外的键时则不会输入到文本框中;
    • 组合键的使用:
      • isAltDown();返回Alt键是否按下;
      • isControlDown();返回Control键是否按下;
      • isShiftDown();返回shift键是否按下;
        使用以上三个方法+键盘,组成组合键,例:
        e.isControlDown()&&e.getKeyCode()==keyEvent.VK_EVTER;即:Ctrl+Enter组合键;

TextArea文本区域(多行文本)

  1. 构造函数:
    • TextArea(int rows,int columns);row-行数,columns-列数;
  2. 常用方法:
    • append(String str);//将给定文本追加到文本区的当前文本;
    • getText();返回此文本组件表示的文本(父类方法);
    • setText(String t);将此文本组件显示的文本设置为指定文本(父类方法);
      t-新文本;如果文本为null,则将文本设置为“”;

Dialog对话框

  1. 常用构造函数:
    • Dialog(Fram owner,String title,boolean modal);owner-该对话框所依赖的窗体,一般对话框不单独存在,title-该对话框的标题,modal-如果值为true,则该对话框不关闭时,它所依赖的窗体无法操作;
  2. Dialog对话框使用方式同Frame一样初始化时可设置大小,位置,标题名,以及他所依附的window,可添加按钮以提示信息(Lable),可设置布局模式;

Label标签

  1. 常见构造函数:
    Label(String text)/(String text,int alignment);text-标签显示的字符串,alignment-对齐方式值;

  2. 常用方法:

    • getText();获取标签文件;
    • setText(String text);设置标签文件,text-文本值;
  1. 抽象类MenuComponent是所有与菜单相关的组件的超类,这方面MenuComponent与AWT组件的抽象超类Component相似;
  2. 该类的子类:MenuBar,MenuItem;
  3. 菜单继承体系:

Java基础--GUI图形化界面_第3张图片

  1. 该类封装绑定到框架的菜单栏的平台概念,可以使Fram的setMenuBar方法将菜单栏与Fram对象相关联,例:
    MenuBar mb=new MenuBar();
    Fram f=new Frame();
    f.setMenuBar(mb);

  2. 常用方法:
    add(Menu m);将指定的菜单添加到菜单栏;
    ……

  1. 菜单中的所有项必须属于类MenuItem或其子类,常用构造方法:
    • MenuItem(String label,MenuShortcut s);label-此菜单项的标签,s-与此菜单关联的MenuShortcut的实例;
  2. 常用方法:
    • getLabel();获取此菜单的标签;
    • isEnabled();检查是否启用此菜单;
    • setEnabled(boolean b);设置是否可以选择此菜单项;
    • setLabel(String label);将此菜单的标签设置为指定标签;
    • setShortcut(MenuShortcut s);设置与此菜单项关联的MenuShortcut 的对象;
    • addActionListener(ActionListener l);添加指定侦听器;
  1. 该类的对象是从菜单栏部署的下拉是菜单组件,菜单可以是任意分离式菜单,菜单中的每一项都必须属于MenuItem类,它可以是MenuItem的一个实例,子菜单或复选框,Menu为MenuItem的子类;
    简单说:窗体(Frame)中可以添加菜单栏(MenuBar);
    菜单栏中可以添加菜单Menu或MenuItem子菜单;
    MenuItem下不能添加东西,只能被添加;

  2. 构造方法;

    • Menu()/(String label)/(String label,boolean tearOff);label-指定标签,tearOff-是否可分离,true:为可分离式;
  3. 常用方法:

    • add(MenuItem mi);将指定的菜单项添加到此菜单;
    • add(String label);将带有指定标签的项添加到此菜单;
      ……
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class MyMenuTest{
    private Frame f;
    private MenuBar bar;
    private TextArea ta;
    private Menu fileMenu;
    private MenuItem openItem,saveItem,closeItem;
    private FileDialog openDia,saveDia;
    private File file;
    MyMenuTest(){
        init();
    }
    public void 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);
    }
    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(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.flush();
                    bufw.close();
                }catch (IOException ex){
                    throw new RuntimeException();
                }       
            }
        });
        openItem.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                openDia.setVisible(true);
                String dirPath = openDia.getDirectory();
                String fileName = openDia.getFile();
//              System.out.println(dirPath+"..."+fileName);
                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");
                    }
                    bufr.close();
                }catch (IOException ex){
                    throw new RuntimeException("读取失败");
                }
            }
        });
        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 MyMenuTest();
    }
}

FileDialog

  1. 该类是Dialog的一个子类,该类显示一个对话框窗口,用户可以从中选择文件,通过模式的设定其是打开文件或保存文件;
  2. 构造函数:
    • FileDialog(Dialog/Frame parent,String title,int mode);parent-所属的对话框或窗体,title-对话框标题,mode-如果值为SAVE则要写入文件,值为LOAD则要读取文件;
  3. 常用方法:
    • getDirectory();获取文件对话框的目录;
    • getFile();获取文件对话框的选定文件;
    • setFilenameFilter(FilenameFilter filter);

jar文件

将一个java程序做成一个可双击执行的程序,jar包;
制作步骤:

  1. 将文件打包编译:
    • 在源文件开头写上package+包名;
    • 将类设置为public;
  2. 编译:将文件包编译到指定目录下
    javac -d c:\……(目录路径) MyPackage.java(源文件名);

  3. 配置信息设置:添加主类名称;

    • 建立一个文本文件;
    • 写入主类名配置信息:
      格式:Main-Class: myprogram(包名).MyProgram(类名)
      注:“Main-Class:”后面+“空格”,结尾+“回车”;
    • 保存(文件名随意);
  4. 打jar包
    • 到刚打包好的目录下使用jar命令生成jar包;
    • 格式:jar-cvf my.jar(jar包名,自定义) myprogram(刚打包的包名)
  5. 指定文件配置信息,将刚才设置爱好的配置信息编译进jar包,命令(先进入到包存储目录下):
    jar - cvfm my.jar(jar包名) 1.txt(配置文件) mymenu(包名);

  6. 将jar文件关联到jre\bin下的javaw.exe文件;
    注:XP系统可通过配置系统文件win7系统下需要通过修改注册表才能实现
    HKEY_CLASSES_ROOT\Application\javaw.ext\shell\open\command,修改数据值为:[“D:\Program\Files\Java\jdk1.6…\jre\bin\javaw.exe”-jar”%1”](在元数据的”%1”前面加上“-jar”即可,如上所示;)

你可能感兴趣的:(java基础)