JAVA基础 day24 GUI的学习 事件监听机制 编写简易的记事本 jar包双击执行

GUI:图形用户接口

JAVA为GUI提供的对象都在java.Awt和javax.Swing两个包里。

java.Awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能。属于重量级控件。

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

继承关系。

GUI布局

创建图形化界面的步骤:
1.创建Frame窗体
2.对窗体进行基本设置(大小,位置,颜色)
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.通过setVisible(true)让窗体可见。

Frame示例:

import java.awt.*;
class FrameDemo {
    public static void main(String[]args)
    {
        Frame f=new Frame("my awt");
        f.setSize(500,400);//设置窗口大小 (长,宽)
        f.setLocation(400,300); 设置窗口位置 (距离左上角的x,距离左上角的y)
        Button b=new Button("按钮");
        f.add(b);
        f.setVisible(true);//设置窗体可见
    }
}

事件监听机制:
事件:一个状态的改变,或者一个活动的发生。例如单击。
事件源:能够产生事件的对象,例如文本框,按钮。
事件监听器:用来监听事件源。

1.将监听器注册到事件源
2.事件源上有事件发生。
3.产生事件对象传给监听器。
4.监听器用定义好的方法去处理。

窗体事件

//addWindowListener(WindowListener l) 方法可以添加窗体监听器。
//方法接受的是一个接口,如果想要实现这个接口,则需要覆写它的7个方法,太过麻烦
//该接口有个抽象子类WindowAdapter,只需要继承这个子类,然后覆写自己需要用到的方
//法即可
import java.awt.*;
import java.awt.event.*;
class AwtDemo
{
    public static void main(String[]args)
    {
        Frame f=new Frame("AWT");
        f.setSize(500,400);
        f.setLocation(500,400);
        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("窗口打开");
            }
        }
        );
        f.setVisible(true);
    }
}

编程:按钮事件

import java.awt.*;
import java.awt.event.*;
class AwtTest
{
    private Frame f;
    private Button b;
    AwtTest()
    {
        init();
    }
    public void init()//正式开发时用一个方法进行初始化
    {
        f=new Frame("Awt");
        b=new Button("退出按钮");
        f.setBounds(400,300,600,500);
        f.setLayout(new FlowLayout());
        f.add(b);
        events();
        f.setVisible(true);
    }
    public void events()//这个方法里写了所有的事件
    {
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        }
        );
        b.addActionListener(new ActionListener()//按钮事件
        {
            public void actionPerformed(ActionEvent e)
            {
                System.out.println("按钮关闭");
                System.exit(0);
            }
        }
        );
    }
    public static void main(String[]args)
    {
        new AwtTest();
    }
}

编程:鼠标事件:

import java.awt.*;
import java.awt.event.*;
class MouseEventDemo
{
    private Frame f;
    private Button b;
    MouseEventDemo()
    {
        init();
    }
    public void init()
    {
        f=new Frame("Awt");
        b=new Button("退出按钮");
        f.setBounds(400,300,600,500);
        f.setLayout(new FlowLayout());
        f.add(b);
        events();
        f.setVisible(true);
    }
    public void events()
    {
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        }
        );
        b.addMouseListener(new MouseAdapter()//添加鼠标监听器
        {
            int count=1;
            int clickcount=1;
            int doubleclick=1;
            public void mouseEntered(MouseEvent e)
            {
                System.out.println("鼠标进入组件"+count++);
            }
            public void mouseClicked(MouseEvent e)
            {
                if (e.getClickCount()==2)//判断鼠标点击的次数
                    System.out.println("双击"+doubleclick++);
                else
                System.out.println("鼠标点击"+clickcount++);
            }

        }
        );
    }


    public static void main(String[]args)
    {
        new MouseEventDemo();
    }
}

键盘事件

import java.awt.*;
import java.awt.event.*;
class KeyEventDemo
{
    private Frame f;
    private Button b;
    private TextField tf;//文本框
    KeyEventDemo()
    {
        init();
    }
    public void init()
    {
        f=new Frame("Awt");
        b=new Button("退出按钮");
        tf=new TextField(20);
        f.setBounds(400,300,600,500);
        f.setLayout(new FlowLayout());
        f.add(tf);
        f.add(b);
        events();
        f.setVisible(true);
    }
    public void events()
    {
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        }
        );
        b.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                if(e.isShiftDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)//判断组合键的方法
                    System.exit(0);
                System.out.println(e.getKeyText(e.getKeyCode())+"------"+e.getKeyLocation());
            }
        }
        );
        tf.addKeyListener(new KeyAdapter()//文本框添加键盘监听器,只能输入数字,不能输入字母
        {
            public void keyPressed(KeyEvent e)
            {
                if (!((e.getKeyCode()>=KeyEvent.VK_0)&&(e.getKeyCode()<=KeyEvent.VK_9)))
                {
                    System.out.println(e.getKeyCode()+"是非法的");
                    e.consume();//销毁对象。当输入的非数字,则销毁,不出现在文本框中
                }

            }
        }
        );
    }
    public static void main(String[]args)
    {
        new KeyEventDemo();
    }
}

编程:在文本框输入目录,文本区域内显示文件目录的文件夹和文件。

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class FileAwtDemo
{
    private Frame f;
    private Button b;
    private TextField tf;
    private TextArea ta;
    private String s;
    private File fl;

    private Dialog dl;
    private Label l;
    private Button okb;

    FileAwtDemo()
    {
        init();
    }
    public void init()
    {
        f=new Frame("FileAwt");
        b=new Button("转到");
        tf=new TextField(20);
        ta=new TextArea();
        dl=new Dialog(f,true);
        l=new Label();
        okb=new Button("确定");
        f.setBounds(400,300,600,500);
        f.setLayout(new FlowLayout());
        dl.setBounds(500,400,250,150);
        dl.setLayout(new FlowLayout());
        dl.add(l);
        dl.add(okb);
        f.add(tf);
        f.add(b);
        f.add(ta);
        events();
        f.setVisible(true);
    }
    public void events()
    {
        b.addMouseListener(new MouseAdapter()//按钮事件监听器
        {
            public void mouseClicked(MouseEvent e)
            {

                 fileToArea();
            }
        }
        );
        f.addWindowListener(new WindowAdapter()//窗体的事件监听器
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        }
        );
        tf.addKeyListener(new KeyAdapter()//文本框的监听器
        {
            public void keyPressed(KeyEvent e)
            {
                if(e.getKeyCode()==KeyEvent.VK_ENTER)//当按回车时和按按钮效果一样
                {
                    fileToArea();
                }
            }
        });
        okb.addMouseListener(new MouseAdapter()//对话框的确定按钮事件监听器
        {
            public void mouseClicked(MouseEvent e)
            {
                dl.setVisible(false);
            }
        });
    }
    public void fileToArea()//遍历文件目录并取出名字
    {
        s=tf.getText();
        fl=new File(s);
        if(fl.exists()&&fl.isDirectory())
        {
            ta.setText(" ");
        String [] str=fl.list();
        for (int i=0;i<str.length;i++)
        {
        ta.append(str[i]);
        ta.append("\r\n");
        }
        }
        else
        {
            l.setText("您输入的"+fl+"是无效路径");
            dl.setVisible(true);
        }
    }
    public static void main(String[]args)
    {
        new FileAwtDemo();
    }
}

GUI菜单
菜单栏里添加菜单
菜单里添加菜单或者菜单选项

import java.awt.*;
import java.awt.event.*;
class MyMenuDemo
{
    private Frame f;
    private Menu m,m1;//菜单
    private MenuBar mb;//菜单栏
    private MenuItem mi;//菜单选项
    MyMenuDemo()
    {
        init();
    }
    public void init()
    {
        f=new Frame("my menu");
        m=new Menu("文件");
        mb=new MenuBar();
        mi=new MenuItem("退出");
        m1=new Menu("子菜单");

        mb.add(m);
        m.add(m1);
        m.add(mi);
        f.setBounds(400,300,600,500);
        f.setMenuBar(mb);
        f.setVisible(true);

    }
    public static void main(String[]args)
    {
        new MyMenuDemo();
    }
}

编程:编写一个简单的记事本软件,具有打开文件和保存文件的功能

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyMenuDemo
{
    private Frame f;
    private Menu filemenu;
    private MenuBar mb;
    private MenuItem openItem,saveItem,closeItem;//三个菜单选项
    private FileDialog opendia,savedia;//两个文件对话框用于打开和保存
    private TextArea ta;//文本区域
    private File file;
    MyMenuDemo()
    {
        init();
    }
    public void init()
    {
        f=new Frame("my menu");
        filemenu=new Menu("文件");
        mb=new MenuBar();
        ta=new TextArea();
        openItem=new MenuItem("打开");
        saveItem=new MenuItem("保存");
        closeItem=new MenuItem("退出");
        opendia=new FileDialog(f,"打开文件",FileDialog.LOAD);//LOAD是打开文件模式
        savedia=new FileDialog(f,"保存文件",FileDialog.SAVE);//SAVE是保存文件的模式
        mb.add(filemenu);
        filemenu.add(openItem);
        filemenu.add(saveItem);
        filemenu.add(closeItem);
        f.setBounds(300,100,700,800);
        f.setMenuBar(mb);
        f.add(ta);
        events();
        f.setVisible(true);

    }
    public void events()
    {
          f.addWindowListener(new WindowAdapter()
          {
              public void windowClosing(WindowEvent e)
              {
                  System.exit(0);
              }
          }
          );    
          openItem.addActionListener(new ActionListener()//打开文件的事件监听器
          {
              public void actionPerformed(ActionEvent e)
              {
                  ta.setText("");
              opendia.setVisible(true);
              file=new File(opendia.getDirectory(),opendia.getFile());//获取文件的路径和名字

              try{
              BufferedReader br=new BufferedReader(new FileReader(file));
              String line=null;
              while ((line=br.readLine())!=null)
              {
                  ta.append(line+"\r\n");//打印到文本区域中
              }
              br.close();
              }catch(IOException ex)
              {
                  System.out.println("打开失败");
              }

              }
          }
          );
          saveItem.addActionListener(new ActionListener()//保存按钮的事件监听器
          {
              public void actionPerformed(ActionEvent e)
              {   
                  if (file==null)//判断文件是否存在,不存在就创建,否则不创建
                  {
                  savedia.setVisible(true);
                  file=new File(savedia.getDirectory(),savedia.getFile());
                  }
                  try{
                      BufferedWriter bw=new BufferedWriter(new FileWriter(file));
                      String text=ta.getText();
                      bw.write(text);
                      bw.close();


                  }catch(IOException ex)
                  {
                      System.out.println("保存失败");
                  }
              }
          });
          closeItem.addActionListener(new ActionListener()
          {
              public void actionPerformed(ActionEvent e)
              {
                  System.exit(0);
              }
          });

    }
    public static void main(String[]args)
    {
        new MyMenuDemo();
    }
}

让程序变成jar包双击执行

1.先把程序指定一个包,class文件放在包内(javac -d 包存放的目录 源文件名)
2.把包打包成jar包 (jar -cvf jar包名字 包名)
3.这时候程序不能运行,因为生成了很多个class文件,程序不知道哪个是主函数所在的文件。所以需要更改配置信息,设置主函数所在的class文件。方法为:随便创建一个文件,里面输入。Main-Class:(空格)包名.类名(回车)
然后再打包 (jar -cvfm jar包名字.jar 刚才创建的配置文件 包名) 就OK了

你可能感兴趣的:(java)