一、GUI概述
1.1、GUI概述
Graphical User Interface(图形用户接口)
用图形的方式,来显示计算机操作的界面,
CLI:
Command line User Interface(命令行用户接口)
如DOS,
java为GUI提供的对象都存在java.Awt和javax.Swing两个包中.
1.2、Awt与Swing
java.Awt:Abstract Window ToolKit(抽象窗口工具包)需要调用本地系统方法实现功能。属于重量级级控件
javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植必,属于轻量级控件。
1.3、结构
二、布局管理器
2.1、布局
容器中的组件的排放方式,就是布局。
2.2、常见的布局管理
FlowLayout(流式布局管理器)
从左到右的顺序排列
Panel默认的布局管理器。
BorderLayout(边界布局管理器)
东、南、西、北、中
Fram默认的面布局管理器。
GridLayout(网格布局管理器)
规则的矩阵
CardLayout(卡片布局管理器)
选项卡
GridBagLayout(网络包布局管理器)
非规则的矩阵
2.3、
import java.awt.*;public class AwtDemo1 { public static void main(String[] args) { //声明一个容器,Frame并设置标题 Frame f=new Frame("Hello World"); //设置窗体大小第一个参数是宽度,第二个参数是高度 f.setSize(600, 300); //设置窗体运行的位置,屏幕中显示的位置 f.setLocation(400, 200); //设置窗体布局方式,默认为BorderLayout,设置为流式布局 f.setLayout(new FlowLayout()); //声明新的控件 Button btn=new Button("按键"); //将控件添加到窗体 f.add(btn); //设置窗体可见,默认是不可见的 f.setVisible(true); }}
三、事件
3.1、事件监听机制
事件源(组件)awt包或者swing中的那些图形界面组件
事件(Event):每一个事件源都自己的特有的对应的事件和共性事件
监听器(Listener):将可以触发某一个事件的动作(不只一个动作)都已经封闭到了监听器中.
以上3种,都在java中已经定义好了,直接获取对象用使用就可以
事件处理(引发事件后处理方式):我们要做的事情是,就是产生的动作进行处理.
3.2、事件监听机制特点
3.3、 示例
WindowsListener 接口有7个方法要重写,一般为直接实现而使用其子类
WindwoAdapter()
接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
扩展此类可创建 WindowEvent
侦听器并为所需事件重写该方法。(如果要实现 WindowListener
接口,则必须定义该接口内的所有方法。此抽象类将所有方法都定义为 null,所以只需针对关心的事件定义方法。)
只需要继承 WindwoAdapter类,实现需要的方法即可
import java.awt.*;import java.awt.event.*;public class AwtDemo1 { public static void main(String[] args) { //声明一个容器,Frame并设置标题 Frame f=new Frame("Hello World"); //设置窗体大小第一个参数是宽度,第二个参数是高度 f.setSize(600, 300); //设置窗体运行的位置,屏幕中显示的位置 f.setLocation(400, 200); //设置窗体布局方式,默认为BorderLayout,设置为流式布局 f.setLayout(new FlowLayout()); //声明新的控件 Button btn=new Button("按键"); //添加监听事件 //将控件添加到窗体 f.add(btn); //设置窗体可见,默认是不可见的 f.setVisible(true); //添加监听器 f.addWindowListener(new MyWinEvent()); }}class MyWinEvent extends WindowAdapter{ @Override public void windowActivated(WindowEvent e) { // 激活窗口时调用 super.windowActivated(e); System.out.println("我被激活了"); } @Override public void windowClosed(WindowEvent e) { // 当窗口已被关闭时调用 super.windowClosed(e); System.out.println("我被关闭了"); } @Override public void windowClosing(WindowEvent e) { // 窗口正处在关闭过程中时调用。 super.windowClosing(e); System.out.println("我正在被关闭"); } @Override public void windowDeactivated(WindowEvent e) { // 停用窗口时调用。 super.windowDeactivated(e); System.out.println("我被停用了"); } @Override public void windowDeiconified(WindowEvent e) { // 取消图标化窗口时调用 super.windowDeiconified(e); System.out.println("取消图标化窗口"); } @Override public void windowGainedFocus(WindowEvent e) { // 该 Window 被设置为聚焦 Window 时调用,聚焦 Window 意味着该 Window 或其某个子组件将接收键盘事件。 super.windowGainedFocus(e); System.out.println("获取焦点"); } @Override public void windowIconified(WindowEvent e) { //图标化窗口时调用。 super.windowIconified(e); System.out.println("图标化窗口时调用。"); } @Override public void windowLostFocus(WindowEvent e) { // 该 Window 不再为聚焦 Window 时调用,不再为聚焦 Window 意味着键盘事件不再传递到该 Window 或其任意子组件。 super.windowLostFocus(e); System.out.println("失去焦点"); } @Override public void windowOpened(WindowEvent e) { //已打开窗口时调用。 super.windowOpened(e); System.out.println("窗口打开了"); } @Override public void windowStateChanged(WindowEvent e) { // 窗口状态改变时调用。 super.windowStateChanged(e); System.out.println("窗口状态改变时调用。"); } }
四、Action事件
4.1、Action事件
addActionListener(ActionListener l)
添加指定的动作侦听器,以接收发自此按钮的动作事件
只有一个方法
actionPerformed(ActionEvent e)
发生操作时调用。
用于接收操作事件的侦听器接口。对处理操作事件感兴趣的类可以实现此接口,而使用该类创建的对象可使用组件的 addActionListener
方法向该组件注册。在发生操作事件时,调用该对象的 actionPerformed
方法。
4.2、示例
import java.awt.*;import java.awt.event.*;class ActionDemo { public static void main(String[] args) { new FrameDemo(); }}class FrameDemo{ //定义成员变量frame和Button private Frame f; private Button btn; public FrameDemo() { init(); } public void init() { //初始人成员变量,并设置初始值 f=new Frame("我的Frame窗体"); //设置窗口位置水平与垂直坐标,宽度与高度 f.setBounds(200,200,600,500); // f.setLocation(400,100); //可见的 f.setVisible(true); //设置布局 f.setLayout(new FlowLayout()); //给窗体添中监听器,事件 myEvent(); btn=new Button("我的按键"); //添控件添加到frame窗体上 f.add(btn); //给按键添加Action事件 btn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("按键事件!,按键关闭窗口"); System.exit(0); } }); } //事件方法 private void myEvent() { //添加事件 f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.out.println("myFram 关闭"); System.exit(0); } }); }}
五、鼠标、键盘与对话框事件
5.1、示例
/*鼠标与键盘事件*/import java.awt.*;import java.awt.event.*;class AwtDemo3 { public static void main(String[] args) { new mouseAndKey(); }}class mouseAndKey{ private Frame f; private Button btn; private TextField tf; public mouseAndKey() { init(); } //初始化 public void init() { f=new Frame("My Frame"); btn=new Button("My Button"); //指定列数 tf=new TextField(20); //设置位置,大小 f.setBounds(200,300,500,400); f.setLayout(new FlowLayout()); //流式布局 f.add(btn); f.add(tf); f.setVisible(true); //为窗口添加监听器 myEvent(); //添加鼠标监听器 addMouseEvent(); //添加键盘监听器 addMykeyEvent(); //添加文件框监听器 addTfEvent(); } //窗口监听器 private void myEvent() { f.addWindowListener(new WindowAdapter(){ //添加关闭事件 public void windowClosing(WindowEvent e) { System.out.println("窗口关闭了"); System.exit(0); } }); } //添加鼠标事件 private void addMouseEvent() { btn.addActionListener(new ActionListener(){ //活动状态 public void actionPerformed(ActionEvent e){ System.out.println("窗口活动状态action"); } }); //添加鼠标监听器 btn.addMouseListener(new MouseAdapter(){ /* int clickedCount=1; //单击事件 public void mouseClicked(MouseEvent e) { System.out.println("鼠标单击"+clickedCount++); } }); */ //双击事件 int doubleClickCount=1; public void mouseClicked(MouseEvent e) { if (e.getClickCount()==2) { System.out.println("鼠标双击"+doubleClickCount++); } } //鼠标进入事件 int count=1; public void mouseEntered(MouseEvent e) { System.out.println("鼠标进入控件"+count++); } }); } private void addMykeyEvent() { btn.addKeyListener(new KeyAdapter(){ //按下某个键时调用此方法 public void keyPressed(KeyEvent e) { //System.out.println("按下:"+KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode()); /* //按下esc键关闭窗口 if(e.getKeyCode()==KeyEvent.VK_ESCAPE) { System.exit(0); } */ if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER) { System.out.println("ctrl+enter"); } } //释放某个键时调用此方法。 public void keyReleased(KeyEvent e) { //System.out.println("释放:"+KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode()); } //键入某个键时调用此方法。 public void keyTyped(KeyEvent e) { //System.out.println("输入:"+KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode()); } }); } private void addTfEvent(){ 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(); } } }); }}
示例、
/*在文本框中输入目录,点击转到 按键,将该目录中的文件与文件夹名称列在下面的文本区域中*/import java.awt.*;import java.awt.event.*;import java.io.*;class TextFieldDemo { public static void main(String[] args) { new MyTextField(); }}/* private Frame f; 窗体 private Button btn; 按键 private TextField tf; 文本框 private TextArea ta; 多行文本域 private Dialog d; 对话框 private Label lab; 文本信息 private Button okBtn; 确定按键*/class MyTextField{ private Frame f; private Button btn; private TextField tf; private TextArea ta; private Dialog d; private Label lab; private Button okBtn; public MyTextField() { init(); } //初始化 public void init() { f=new Frame("根据目录列出所有文件"); f.setBounds(300,100,600,500); f.setLayout(new FlowLayout()); tf=new TextField(30); btn=new Button("转到"); ta=new TextArea(20,50); /* 提示窗口 */ d=new Dialog(f,"提示信息",true); lab=new Label(); okBtn=new Button("确定"); d.add(lab); d.add(okBtn); d.setBounds(400,200,240,150); d.setLayout(new FlowLayout()); //将控件添回到窗体 f.add(tf); f.add(btn); f.add(ta); //设置窗体可见 f.setVisible(true); //添加事件 myEvent(); } public void myEvent() { //窗体监听器, 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) { //调用 showDir(); } } } ); //按键添加监听器,事件输入完成,点按键执行 btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //调用显示 showDir(); } } ); //对话框事件 //窗体监听器, d.addWindowListener(new WindowAdapter(){ //关闭事件 public void windowClosing(WindowEvent e) { //将对话框隐藏 d.setVisible(false); } }); okBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {//将对话框隐藏 d.setVisible(false); } }); } private void showDir() { //获取文本框输入的内容 String dirPath=tf.getText(); //封装为文件 File dir=new File(dirPath); //判断是不是目录同时是否存在 if(dir.exists()&&dir.isDirectory()) { //存在并且目录存在就把多行文本框清空 ta.setText(""); //获取文件列表 File [] files=dir.listFiles(); for(File f:files) { //向多行文本域中添加内容,增加 ta.append(f.getName()+"\n"); } }else { //对话框信息设置 String info="您输入的路径:"+dirPath+" 是错误的请重新输入"; lab.setText(info); //对话框显示 d.setVisible(true); } //将文本框清空 tf.setText(""); }}
六、菜单
6.1、示例
/* 菜单:private Frame f; 窗体 private MenuBar mb; 菜单栏 private Menu m; 菜单 private MenuItem closeItem; 菜单项关闭菜单*/import java.awt.*;import java.awt.event.*;class MenuDemo { private Frame f; private MenuBar mb; private Menu m; private Menu subMenu;//子菜单的子菜单 private MenuItem closeItem; private MenuItem subItem; //子菜单条目属于subMenu的子菜单项 //构造方法 public MenuDemo() { init(); } /* 初始化 */ public void init() { //窗体 f=new Frame("有菜单的窗体"); //设置位置,宽,高 f.setBounds(300,100,500,400); //布局 f.setLayout(new FlowLayout()); //菜单栏 mb=new MenuBar(); //菜单 m=new Menu("文件"); subMenu=new Menu("子菜单"); //菜单项 closeItem=new MenuItem("退出"); subItem=new MenuItem("子菜单条目"); //菜单添加菜单项 subMenu.add(subItem); m.add(subMenu); m.add(closeItem); //菜单栏添加菜单 mb.add(m); //窗体设置菜单栏 f.setMenuBar(mb); //设置显示 f.setVisible(true); myEvent(); } /* 设置监听器 */ private void myEvent() { /* 通过右上角X关闭窗体 */ f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.out.println("通过关闭X退出,这个窗体"); System.exit(0); } }); /* 通过菜单退出 */ closeItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("通过菜单退出,这个窗体"); System.exit(0); } }); } /* 测试 */ public static void main(String[] args) { new MenuDemo (); }}
七、打开与关闭文件
7.1、示例,添加打开菜单项
FileDialog
public FileDialog(Frame parent, String title, int mode)
- 创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。
如果
mode
的值为LOAD
,那么文件对话框将查找要读取的文件,所显示的文件是当前目录中的文件。如果mode
的值为SAVE
,则文件对话框将查找要写入文件的位置。- 参数:
parent
- 对话框的所有者title
- 对话框的标题mode
- 对话框的模式,可以是FileDialog.LOAD
或FileDialog.SAVE
/* 菜单: private Frame f; 窗体 private MenuBar mb; 菜单栏 private Menu m; 菜单 private MenuItem openItem; 打开 private MenuItem closeItem; 关闭 private MenuItem saveItem;保存 //构造方法*/package mymenu;import java.awt.*;import java.awt.event.*;import java.io.*;public class MenuDemo1 { private Frame f; private MenuBar mb; private Menu fileMenu; private MenuItem openItem; private MenuItem closeItem; private MenuItem saveItem; private FileDialog openDia; //打开对话框 private FileDialog saveDia;//保存对话框 private TextArea ta; private File file; //构造方法 public MenuDemo1() { init(); } /* 初始化 */ public void init() { //窗体 f=new Frame("有菜单的窗体"); //设置位置,宽,高 f.setBounds(300,100,650,500); //布局 //f.setLayout(new FlowLayout()); //菜单栏 mb=new MenuBar(); //菜单 fileMenu=new Menu("文件"); //菜单项 openItem=new MenuItem("打开"); saveItem=new MenuItem("保存"); closeItem=new MenuItem("退出"); //菜单添加菜单项 fileMenu.add(openItem); //添加打开 fileMenu.add(saveItem); //添加保存 fileMenu.add(closeItem); //添加关闭 //菜单栏添加菜单 mb.add(fileMenu); //窗体设置菜单栏 f.setMenuBar(mb); //打开,关闭对话框 openDia=new FileDialog(f,"打开",FileDialog.LOAD); saveDia=new FileDialog(f,"保存",FileDialog.SAVE); ta=new TextArea(); f.add(ta); myEvent(); //设置显示 f.setVisible(true); } /* 设置监听器 */ private void myEvent() { /* 通过右上角X关闭窗体 */ f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.out.println("通过关闭X退出,这个窗体"); System.exit(0); } }); /* 打开 */ openItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { openDia.setVisible(true); show(); } }); /* 保存 */ saveItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { save(); } }); /* 通过菜单退出 */ closeItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("通过菜单退出,这个窗体"); System.exit(0); } }); } private void show() { String dirPath=openDia.getDirectory(); //路径 String fileName=openDia.getFile();//文件名 //打印路径 System.out.println(dirPath+"..."+fileName); if(dirPath==null || fileName==null) return; ta.setText(""); File file=new File(dirPath,fileName); //封装为文件 BufferedReader br=null; try{ br=new BufferedReader(new FileReader(file)); String line=null; while((line=br.readLine())!=null) { ta.append(line+"\n"); } }catch(IOException e) { }finally{ try { if(br!=null) br.close(); } catch (IOException e) { } } } /* 保存 */ private void save() { if(file==null){ //设置 saveDia.setVisible(true); String dirPath=saveDia.getDirectory(); // 目录 String fileName=saveDia.getFile();//文件 //判断路径和文件名是否为空 if (dirPath==null || fileName==null)//啥也不做 return; //如果文件为空就,new file=new File(dirPath,fileName); } //不为空就直接保存 BufferedWriter bw=null; try { bw =new BufferedWriter(new FileWriter(file)); //获取多行文本框内容 String context=ta.getText(); //System.out.println(context); bw.write(context); //bw.flush(); } catch (IOException e) { }finally{ try { if (bw!=null) bw.close(); } catch (IOException ex) { } } } /* 测试 */ public static void main(String[] args) { new MenuDemo1 (); }}/*FileDialogpublic FileDialog(Frame parent, String title, int mode)创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。 如果 mode 的值为 LOAD,那么文件对话框将查找要读取的文件,所显示的文件是当前目录中的文件。如果 mode 的值为 SAVE,则文件对话框将查找要写入文件的位置。 参数:parent - 对话框的所有者title - 对话框的标题mode - 对话框的模式,可以是 FileDialog.LOAD 或 FileDialog.SAVE */
- 八、打包
8.1、将示中打所为jar文件
编译带包的源文件
javac -d F:\java\day22\menu MenuDemo1.java
打包
Manifest-Version: 1.0
Created-By: 1.8.0_60 (Oracle Corporation)
Main-Class: mymenu.MenuDemo1
每个标签冒号后都跟上一个空格
最后一行需要有一个回车键,否则后面那一行是不能打包进去的
没有空格会报
java.io.IOException: invalid header field at java.util.jar.Attributes.read(Attributes.java:393) at java.util.jar.Manifest.read(Manifest.java:182) at java.util.jar.Manifest.<init>(Manifest.java:52) at sun.tools.jar.Main.run(Main.java:132) at sun.tools.jar.Main.main(Main.java:1022)
1.txt
Main-Class: mymenu.MenuDemo1