GUI概述
一、概述
Component:构件、组件 Button:按钮
Container:容器(能添加组件)
Label:标签(封装文字)
Window:窗口
Checkbox:复选框
Frame:框架
TextCompent:文本组件
Dialog:对话框
TextArea:
FileDialog:文件对话框
TextFiled:
GUI布局
一、布局管理器分类
1.流式布局管理器 FlowLayout
2.边界式布局管理器 BorderLayout
如果不指定组件的方向,就会如右图所示,最大面积填充这个窗体(因为默认的情况就是居中),如果再添加组件那么就会继续覆盖。
3.网格布局管理器 GridLayout
例子:计算器
4.网格包布局管理器 GridBagLayout
例子:计算器
5.卡片布局管理器 CardLayout
6.坐标式布局
JBulider,eclipse+图形化界面
****如果遇到混合式布局的情况,先需要用panel面板来存放布局****
Frame
一、概述
Frame
是带有标题和边框的顶层窗口。
BorderLayout
。
二、代码
- /*
- 创建图形化界面的思路:
- 1.创建frame窗体。
- 2.对窗体进行基本设置
- 比如大小,位置,布局。
- 3.定义组件。
- 4.将组件通过窗体的add方法添加到界面中
- 5.让窗体显示,通过setVisible(true)方法。
- */
- import java.awt.*;
- class AwtDemo
- {
- public static void main(String[] args)
- {
- Frame f=new Frame("my awt");//默认的布局为——边界式布局。
- f.setSize(500,400);//用来设置窗体的长和宽,(x,y)坐标轴的形式
- f.setLocation(300,200);//用来设置窗体左上角的顶点距离左、上的距离。
- f.setLayout(new FlowLayout());//将该窗体的布局改为流式布局
- Button b=new Button("我是一个按钮");//创建一个按钮对象
- f.add(b);//向窗体f内添加一个按钮
- f.setVisible(true);//设置f这个窗体为可见,如果不设置则Frame不显示
- System.out.println("Hello World!");
- }
- }
事件监听机制
一、概述
事件监听机制的特点:
1.事件源
2.事件
3.监听器
4.事件处理
事件源:就是awt包或者swing包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件
监听器:将可以触发某一个事件的动作都已经封装到了监听器中。
以上三者都已经定义好了,直接获取其对象来用就可以了。
我们要做的事情就是对产生的动作进行处理。
窗体事件
一、窗体事件实现
Window类——>
addWindowListener(WindowListener l)
方法——>WindowListener接口——>WindowAdapter抽象类
有两种方法实现事件监听
1.匿名内部类
- f.addWindowListener(new WindowAdapter()
- {
- public void windowClosing(WindowEvent e)
- {
- System.exit(0);
- }
- });
2.继承WindowAdapter抽象类
- class MyWin extends WindowAdapter
- {
- public void windowClosing(WindowEvent e)
- {
- //System.out.println("window is closing..."+e.toString);
- System.exit(0);
- }
- }
二、完整代码
- 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);//用来设置窗体的长和宽,(x,y)坐标轴的形式
- f.setLocation(300,200);//用来设置窗体左上角的顶点距离左、上的距离。
- f.setLayout(new FlowLayout());//将该窗体的布局改为流式布局
- Button b=new Button("我是一个按钮");//创建一个按钮对象
- f.add(b);//向窗体f内添加一个按钮
- //f.addWindowListener(new MyWin());
- f.addWindowListener(new WindowAdapter()
- {
- public void windowClosing(WindowEvent e)
- {
- System.exit(0);
- }
- });
- f.setVisible(true);//设置f这个窗体为可见,如果不设置则Frame不显示
- System.out.println("Hello World!");
- }
- }
- class MyWin extends WindowAdapter
- {
- public void windowClosing(WindowEvent e)
- {
- //System.out.println("window is closing..."+e.toString);
- System.exit(0);
- }
- }
Action事件
一、概述
Button类——>
addActionListener(ActionListener l)方法——>ActionListener接口
由于ActionListener内的方法少于三个,所以它没有adapter适配器。
二、代码
- b.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- System.exit(0);
- }
- });
共性事件——鼠标事件和键盘事件
一、概述
1.Componet类——>
addMouseListener(MouseListener l)——>MouseLister接口——>MouseAdapter抽象类
2.Component类——>addKeyListener(KeyListener l)——>KeyListener接口——>KeyAdapter抽象类
1.鼠标事件代码
- but.addMouseLister(new MouseAdapter()
- {
- int count=1;
- public void mouseEntered(MouseEvent e)//鼠标进入组件事件
- {
- System.out.println("鼠标进入Button组件"+count++);
- }
- public void mouseClicked(MouseEvent e)//鼠标点击事件。如果有action事件存在,那么也会先执行鼠标事件。
- {
- if(e.getClickCount()==2)//用MouseEvent事件e来监听点击了几次
- System.out.println("鼠标点击了Button组件"+count++);
- }
- });
- but.addKeyListener(new KeyAdapter()//键盘监听
- {
- public void keyPressed(KeyEvent e)//由键盘事件对象来获取键盘按下的键
- {
- //e.getKeyChar();获取按下了那些键
- //e.getKeyCode();获取按下键的“码”
- //KeyEvent.getKeyText();返回描述 keyCode 的 String,如 "HOME"、"F1" 或 "A"。
- if(e.getKeyCode()==27/*或者把27换成KeyEvent.VK_ESCAPE*/)//如果but是当前事件源,按下ESC则会退出
- {
- System.exit(0)
- }
- }
- });
- 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);
- f.add(tf);
- but =new Button("my button");
- f.add(but);
- myEvent();
- f.setVisible(true);
- }
- private void myEvent()
- {
- f.addWindowListener(new WindowAdapter()
- {
- public void windowClosing(WindowEvent e)
- {
- System.exit(0);
- }
- });
- but.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)//鼠标和键盘都可以让Action触发。
- {
- System.out.println("action OK");
- }
- });
- but.addMouseListener(new MouseAdapter()
- {
- int count=1;
- public void mouseEntered(MouseEvent e)//鼠标进入组件事件
- {
- System.out.println("鼠标进入Button组件"+count++);
- }
- public void mouseClicked(MouseEvent e)//鼠标点击事件。如果有action事件存在,那么也会先执行鼠标事件。
- {
- if(e.getClickCount()==2)//用MouseEvent事件e来监听点击了几次
- System.out.println("鼠标点击了Button组件"+count++);
- }
- });
- but.addKeyListener(new KeyAdapter()//键盘监听
- {
- public void keyPressed(KeyEvent e)//由键盘事件对象来获取键盘按下的键
- {
- //e.getKeyChar();获取按下了那些键
- //e.getKeyCode();获取按下键的“码”
- //KeyEvent.getKeyText();返回描述 keyCode 的 String,如 "HOME"、"F1" 或 "A"。
- if(e.getKeyCode()==27/*或者把27换成KeyEvent.VK_ESCAPE*/)//如果but是当前事件源,按下ESC则会退出
- {
- System.exit(0);
- }
- if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)//实现ctrl+回车的组合键功能,其中isControlDown()是InputEvent类
- { //下继承过来的方法。
- System.exit(0);
- }
- }
- });
- tf.addKeyListener(new KeyAdapter()
- {
- public void keyPressed(KeyEvent e)
- {
- if(!(e.getKeyCode()>KeyEvent.VK_0&&e.getKeyCode()<KeyEvent.VK_9))
- {
- System.out.println("您输入的字符非法");
- e.consume();//简单来说,该方法是用来取消该事件的操作。
- }
- }
- });
- }
- public static void main(String[] args)
- {
- new MouseAndKeyEvent();
- }
- }
列出指定目录内容(带有对话框)
一、代码
- import java.awt.*;
- import java.awt.event.*;
- import java.io.*;
- class DialogDirectoryDemo2
- {
- private Frame f;
- private Button b;
- private TextField tf;
- private TextArea ta;
- private Dialog d;
- private Label l;
- private Button ok;
- DialogDirectoryDemo2()
- {
- init();
- }
- private void init()
- {
- f=new Frame("my frame");
- f.setBounds(300,200,500,600);
- f.setLayout(new FlowLayout());
- tf=new TextField(40);
- b=new Button("转到");
- ta=new TextArea(30,50);
- d=new Dialog(f,"错误提示",false);
- d.setBounds(400,300,200,100);
- d.setLayout(new FlowLayout());
- l=new Label("您所输入的目录不存在,请重新输入",Label.CENTER);
- ok=new Button("确定");
- d.add(l);
- d.add(ok);
- f.add(tf);
- f.add(b);
- f.add(ta);
- DemoEvent();
- f.setVisible(true);
- }
- public void DemoEvent()
- {
- /*1*/f.addWindowListener(new WindowAdapter()//监听f的WindowEvent e
- {
- public void windowClosing(WindowEvent e)
- {
- System.exit(0);
- }
- });
- /*2*/d.addWindowListener(new WindowAdapter()//监听d的WindowEvent e
- {
- public void windowClosing(WindowEvent e)
- {
- d.setVisible(false);
- }
- });
- /*3*/ok.addActionListener(new ActionListener()//监听ok的ActionEvent
- {
- public void actionPerformed(ActionEvent e)
- {
- d.setVisible(false);
- }
- });
- /*4*/b.addActionListener(new ActionListener()//监听b的ActionEvent
- {
- public void actionPerformed(ActionEvent e)
- {
- show();
- }
- });
- /*5*/tf.addActionListener(new ActionListener()//监听tf的ActionEvent
- {
- public void actionPerformed(ActionEvent e)
- {
- show();
- }
- });
- }
- public void show() //将在TextField按下回车和点击Button做出的相同的事件响应进行封装
- {
- String s=tf.getText();
- File file=new File(s);
- if(file.isDirectory()&&file.exists())
- {
- ta.setText("");
- String[] list=file.list();
- for(String str:list)
- {
- ta.append(str+"\r\n");
- }
- }
- else
- {
- l.setText("你输入的目录\""+s+"\"不存在");
- d.setVisible(true);
- }
- tf.setText("");
- }
- public static void main(String[] args)
- {
- new DialogDirectoryDemo2();
- }
- }
可以打开文件和保存文件的——GUI菜单
一、概述
菜单栏(MenuBar)——>菜单(Menu)——>菜单项(MenuItem)或者菜单(Menu,即子菜单)
二、代码
- import java.io.*;
- import java.awt.*;
- import java.awt.event.*;
- public class SaveAndOpenMenu
- {
- private Frame f;
- private TextArea ta;
- private MenuBar mb;
- private Menu m;
- private MenuItem mi1;
- private MenuItem mi2;
- private MenuItem mi3;
- private File file;
- SaveAndOpenMenu()
- {
- init();
- }
- public void init()
- {
- f=new Frame("DEMO");
- f.setBounds(500,400,400,500);
- ta=new TextArea();
- mb=new MenuBar();
- m=new Menu("选项");
- mi1=new MenuItem("保存");
- mi2=new MenuItem("打开");
- mi3=new MenuItem("关闭");
- mb.add(m);
- m.add(mi1);
- m.add(mi2);
- m.add(mi3);
- f.setMenuBar(mb);
- f.add(ta);
- f.setVisible(true);
- event();
- }
- public void event()
- {
- f.addWindowListener(new WindowAdapter()
- {
- public void windowClosing(WindowEvent e)
- {
- System.exit(0);
- }
- });
- mi3.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- System.exit(0);
- }
- });
- mi1.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- if(file==null)
- {
- FileDialog fd=new FileDialog(f,"保存文件",FileDialog.SAVE);
- fd.setVisible(true);
- String directory=fd.getDirectory();
- String name=fd.getFile();
- if(directory==null||name==null)
- return;
- file=new File(directory,name);
- }
- BufferedWriter bw=null;
- try
- {
- String str=ta.getText();
- bw=new BufferedWriter(new FileWriter(file));
- bw.write(str);
- bw.close();
- }
- catch (IOException ex)
- {
- throw new RuntimeException("文件保存出现问题");
- }
- }
- });
- mi2.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- FileDialog fd=new FileDialog(f,"保存文件",FileDialog.LOAD);
- fd.setVisible(true);
- String directory=fd.getDirectory();
- String name=fd.getFile();
- if(directory==null||name==null)
- return;
- file=new File(directory,name);
- ta.setText("");
- BufferedReader br=null;
- try
- {
- br=new BufferedReader(new FileReader(file));
- String str=null;
- while((str=br.readLine())!=null)
- {
- ta.append(str+"\r\n");
- }
- br.close();
- }
- catch (IOException ex)
- {
- throw new RuntimeException("文件打开出现问题");
- }
- }
- });
- }
- public static void main(String[] args)
- {
- new SaveAndOpenMenu();
- }
- }
JAR包双击执行
一、步骤
1.在dos环境下,.java所在文件的目录下执行以下代码
javac -d c:\ SavaAndOpenMenu.java
2.在c:\下执行以下代码
jar -cvf my.jar mymenu
但是执行以上代码会导致执行失败,原因是没有明确主函数的类。
所以需要进行以下操作
3.在c:\文件下创建一个随意命名的.txt文件,比如1.txt,并在1.txt文件中配置如下信息
Main-class: mymenu.SavaAndOpenMenu(并在信息配置结束后添加一个回车,表示该行信息配置已经到达结尾)
4.在c:\下执行以下代码
jar -cvfm my.jar 1.txt mymenu
经过以上操作即可实现JAR包双击执行。
(PS:以上步骤中的c:\文件自己指定,mymenu为类包。