黑马程序员 —— 图形用户接口GUI (第二十二天)
来源:互联网 发布:罗蒙诺索夫知乎 编辑:程序博客网 时间:2024/06/07 05:11
一 概述
1.GUI
- Graphical User InterFace (图形用户接口)
- 用图形的方式,来显示计算机操作的界面,这样更方便、更直观。
2、CLI
- Command line User Interface(命令行用户接口)
- 就是常见的Dos命令行操作
- 需要记忆一些常用的命令,操作不直观
3.举例:比如,创建文件夹,或者删除文件夹等
4.Javs为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
5.Awt和Swing
java.Awt:Abstract Window Tookit(抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件
javax.Swing:在AWT的基础上,建立的一套图像界面系统,其中提供了更多的组件,而且完全由于Java实现,增强了移植性,属轻量级控件。
二 GUI布局
1.容器中的组件的排放方式,就是布局。
2.常见的布局管理器:
(1)Flow Layout(流式布局管理器)
- 从左到右的顺序排列
- Panel默认的布局管理器
(2)BorderLayout(边界布局管理器)
- 东、南、西、北、中(上下左右中)
- Frame默认的布局管理器
(3)GridLayout(网格布局管理器)
- 规则的矩阵
(4)CardLayout(卡片布局管理器)
- 选项卡
(5)GridBagLayout(网格包布局管理器)
- 非规则的布局
三 GUI_Frame
创建图形化界面步骤如下:
- 常见frame窗体
- 对窗体进行基本设置(比如大小、位置、布局等等)
- 定义组件
- 将组件通过窗体的add方法添加到窗体中
- 让窗体显示,通过setVisible(true)
示例代码:
import java.awt.*;public class Demo {public static void main(String[] args) throws Exception {// 默认是边界布局Frame f = new Frame("my awt");// 窗口的长宽f.setSize(500, 400);// 窗口距离显示器边距的距离f.setLocation(300, 200);// 默认是边界布局f.setLayout(new FlowLayout());Button b = new Button("我是一个按钮");f.add(b);// 设置可见f.setVisible(true);sop("my awt");}public static void sop(Object obj) {System.out.println(obj);}}
上面的代码只是弄了个窗体显示,不会有任何反应。
四 事件监听机制
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);//设置窗体出现在屏幕的位置f.setVisible(true);4.事件监听机制组成
- 事件源(组件):就是awt或者swing包中的那些图形界面组件
- 事件(Event):每一个事件源,都有自己的特有的对应事件,和共性事件
- 监听器(Listener):将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中
- 事件处理方式(引发事件后处理方式)
5.组件、Event、Listener在Java中,都已经定义好了,直接获取其对象来用就可以了。我们要做的就是对产生的动作进行处理。
五 窗体事件
要使图形化窗口的按钮有反应,要了解下面这些方法:
void addWindowListener(WindowListener l):添加指定的窗口侦听器,以从此窗口接收窗口事件
1.WindowListener为接口,要想使用,必须先实现方法,很麻烦。他有一个实现类,子类,实现了接口,不过为空方法。
public abstract class WindowAdapter extends Object implements WindowListener, WindowStateListener, WindowFocusListener
接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
2.事件
void windowActivated(WindowEvent e): 激活窗口时调用
void windowClosed(WindowEvent e):当窗口已被关闭时调用
void windowClosing(WindowEvent e): 窗口正处在关闭过程中时调用
void windowDeactivated(WindowEvent e):停用窗口时调用
void windowDeiconified(WindowEvent e):取消图标化窗口时调用
void windowGainedFocus(WindowEvent e)
该 Window 被设置为聚焦 Window 时调用,聚焦 Window 意味着该 Window 或其某个子组件将接收键盘事件。
void windowIconified(WindowEvent e):图标化窗口时调用
void windowLostFocus(WindowEvent e)
该 Window 不再为聚焦 Window 时调用,不再为聚焦 Window 意味着键盘事件不再传递到该 Window 或其任意子组件。
void windowOpened(WindowEvent e)
已打开窗口时调用。
void windowStateChanged(WindowEvent e)
窗口状态改变时调用。
示例代码:
/*创建图形化界面1、常见frame窗体2、对窗体进行基本设置 比如大小、位置、布局。3、定义组件4、将组件通过窗体的add方法添加到窗体中5、让窗体显示,通过setvisible(true)*/import java.awt.*;import java.awt.event.*;public class Demo{ public static void main(String[] args) throws Exception{ //默认是边界布局 Frame f = new Frame("my awt"); //窗口的长宽 f.setSize(500,400); //窗口距离显示器边距的距离 f.setLocation(300,200); //默认是边界布局 f.setLayout(new FlowLayout()); //添加指定的窗口侦听器,以从此窗口接收窗口事件。 f.addWindowListener(new MyWin()); Button b = new Button("我是一个按钮"); f.add(b); //设置可见 f.setVisible(true); sop("my awt"); } public static void sop(Object obj){ System.out.println(obj); }}//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。//并覆盖了其中的所有方法,那么我只要继承自WindowAdapter覆盖我需要的方法即可。class MyWin extends WindowAdapter{ public void windowClosing(WindowEvent e){ Demo.sop("将要关闭"); System.exit(0); } public void windowOpened(WindowEvent e){ Demo.sop("我被打开"); } public void windowActivated(WindowEvent e){ Demo.sop("激活"); }}
六 Action事件
事件监听机制
- 确定事件源(容器或组件)
- 通过事件源对象的addXXXLIstener()方法将监听器注册到该事件源上
- 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdaper的子类对象
- 一般用匿名内部类来表示
- 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收
- 事件出发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponet()获取)
import java.awt.*;import java.awt.event.*;public class Demo{ //定义图形中所需的组件的引用 private Frame f; private Button but; Demo(){ init(); } public static void main(String[] args) throws Exception{ new Demo(); } public void init(){ f = new Frame("my frame"); //对frame进行基本设置 //f.setSize(500,400); //void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。 f.setBounds(300,400,600,500); f.setLayout(new FlowLayout()); but = new 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(){ public void actionPerformed(ActionEvent e){ System.out.println("按钮退出"); System.exit(0); } }); } public static void sop(Object obj){ System.out.println(obj); }}
七 鼠标事件
import java.awt.*;import java.awt.event.*;public class Demo {// 定义图形中所需的组件的引用private Frame f;private Button but;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my frame");// 对frame进行基本设置// f.setSize(500,400);// void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。f.setBounds(300, 400, 600, 500);f.setLayout(new FlowLayout());but = new 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() {public void actionPerformed(ActionEvent e) {sop("鼠标活动");}});but.addMouseListener(new MouseAdapter() {private int count = 1;private int clickCount = 1;public void mouseEntered(MouseEvent e) {sop("鼠标进入事件" + (count++));}public void mouseClicked(MouseEvent e) {if (e.getClickCount() == 2) {sop("鼠标双击事件");} else {sop("鼠标点击事件" + (clickCount++));}}});}public static void sop(Object obj) {System.out.println(obj);}}
八 键盘事件
import java.awt.*;import java.awt.event.*;public class Demo {// 定义图形中所需的组件的引用private Frame f;private Button but;private TextField tf;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my frame");// 对frame进行基本设置// f.setSize(500,400);// void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。f.setBounds(300, 400, 600, 500);f.setLayout(new FlowLayout());but = new Button("退出");// 文本框tf = new TextField(20);// 将组件添加到frame中f.add(tf);f.add(but);// 加载一下窗体上的事件myEvent();// 显示窗体f.setVisible(true);}private void myEvent() {but.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {System.exit(0);}if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {sop("ctrl + enter");}sop(KeyEvent.getKeyText(e.getKeyChar()) + "...."+ e.getKeyCode());}});tf.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {int code = e.getKeyCode();if (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {sop(code + "是非法的");// 屏蔽键e.consume();}}});}public static void sop(Object obj) {System.out.println(obj);}}
九 练习:列出指定目录内容
import java.io.*;import java.util.*;import java.awt.*;import java.awt.event.*;public class Demo {private Frame f;private TextField tf;private Button but;private TextArea ta;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my window");f.setLayout(new FlowLayout());f.setBounds(300, 100, 600, 500);tf = new TextField(60);but = new Button("转到");ta = new TextArea(25, 70);f.add(tf);f.add(but);f.add(ta);myEvent();f.setVisible(true);}private void myEvent() {f.addWindowListener(new WindowAdapter() {public void windowCloseing(WindowEvent e) {System.exit(0);}});but.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String dirPath = tf.getText();tf.setText("");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");}}}});}public static void sop(Object obj) {System.out.println(obj);}}
十 对话框Dialog
import java.io.*;import java.util.*;import java.awt.*;import java.awt.event.*;public class Demo {private Frame f;private TextField tf;private Button but;private TextArea ta;private Dialog dl;private Label lab;private Dialog d;private Button okBut;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my window");f.setLayout(new FlowLayout());f.setBounds(300, 100, 600, 500);tf = new TextField(60);but = new Button("转到");ta = new TextArea(25, 70);f.add(tf);f.add(but);f.add(ta);lab = new Label();d = new Dialog(f, "提示信息-self", true);okBut = new Button("确定");d.setBounds(400, 200, 240, 150);d.setLayout(new FlowLayout());d.add(lab);d.add(okBut);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) {showDir();}});d.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {d.setVisible(false);}});okBut.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {d.setVisible(false);}});tf.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_ENTER) {showDir();}}});}public void showDir() {String dirPath = tf.getText();tf.setText("");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 sop(Object obj) {System.out.println(obj);}}
十一 菜单
import java.io.*;import java.util.*;import java.awt.*;import java.awt.event.*;public class Demo {private Frame f;private MenuBar mb;private Menu m, subMenu;private MenuItem closeItem, subItem;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my window");f.setLayout(new FlowLayout());f.setBounds(300, 100, 500, 600);mb = new MenuBar();subMenu = new Menu("子菜单");m = new Menu("文件");closeItem = new MenuItem("退出");subItem = new MenuItem("子条目");subMenu.add(subItem);m.add(subMenu);m.add(closeItem);mb.add(m);myEvent();f.setMenuBar(mb);f.setVisible(true);}private void myEvent() {f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});closeItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);}});}public static void sop(Object obj) {System.out.println(obj);}}
十二、十三 练习-打开、保存文件
import java.io.*;import java.util.*;import java.awt.*;import java.awt.event.*;public class Demo{ private Frame f; private TextArea ta; private MenuBar bar; private Menu fileMenu; private MenuItem openItem,saveItem,closeItem; private FileDialog openDia,saveDia; private File file; Demo(){ init(); } public static void main(String[] args) throws Exception{ new Demo(); } public void init(){ f = new Frame("my window"); //f.setLayout(new FlowLayout()); f.setBounds(300,100,500,600); ta = new TextArea(); bar = new MenuBar(); fileMenu = new Menu("文件"); openItem = new MenuItem("打开"); saveItem = new MenuItem("保存"); closeItem = new MenuItem("退出"); fileMenu.add(openItem); fileMenu.add(saveItem); fileMenu.add(closeItem); bar.add(fileMenu); myEvent(); f.add(ta); f.setMenuBar(bar); openDia = new FileDialog(f,"我要打开",FileDialog.LOAD); saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE); f.setVisible(true); } private void myEvent(){ f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); openItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ openDia.setVisible(true); String dirPath = openDia.getDirectory(); String fileName = openDia.getFile(); if(dirPath==null||fileName==null) return; ta.setText(""); openFile(dirPath,fileName); f.setTitle("文件:"+dirPath+fileName); } }); 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; saveFile(dirPath,fileName); f.setTitle("文件:"+dirPath+fileName); }else{ saveFile(); } } }); closeItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } }); } public void openFile(String dirPath,String fileName){ 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"); } }catch(IOException ioe){ throw new RuntimeException("读取失败"); } } public void saveFile(){ saveFile(null,null); } public void saveFile(String dirPath,String fileName){ if(file==null){ file = new File(dirPath,fileName); } try{ BufferedWriter bufw = new BufferedWriter(new FileWriter(file)); String text = ta.getText(); bufw.write(text); bufw.close(); }catch(IOException ioe){ throw new RuntimeException("读取失败"); } } public static void sop(Object obj){ System.out.println(obj); }}
十四 jar包双击执行
jar -cvfm my.jar 1.txt mymenu
Main-class: mymenu.Demo //要有空格和回车
- 黑马程序员 —— 图形用户接口GUI (第二十二天)
- 黑马程序员-GUI(图形用户接口)
- 黑马程序员——java第二十二天:GUI
- 黑马程序员--java笔记13--图形用户接口GUI
- 黑马程序员--Java基础学习(GUI图形化界面)第二十二天
- 黑马程序员--第二十二天:图形化界面
- 黑马程序员——>第二十二天<GUI(概念-布局-事件监听-鼠标键盘-对话框-菜单)>
- 黑马程序员——图形用户界面GUI
- 黑马程序员——GUI图形用户界面
- 黑马程序员——GUI图形编程
- 黑马程序员——GUI 图形用户界面
- 黑马程序员——GUI(图形用户界面)
- 黑马程序员——图形用户界面GUI
- 黑马程序员—GUI(图形用户界面)
- 黑马程序员—GUI图形用户界面
- 黑马程序员—图形用户界面GUI
- 黑马程序员—GUI(图形用户界面)
- 黑马程序员—GUI(图形化界面)
- http 错误码大全
- Java分页代码实例
- cocos2d-x 实现真随机函数
- 【C++学习】——第一遍看书总结
- UVa 11134 Fabled Rooks(贪心)
- 黑马程序员 —— 图形用户接口GUI (第二十二天)
- Redis学习4--集合
- MBProgressHUD 弹出提醒框使用例子
- 常用UI组件(widgets)之文本框(TextView)(一)
- 【Jenkins系列之二】利用Jenkins+Github进行自动化测试的步骤
- 码率、帧率和I B P帧
- 日常英语口语学习1:在家中——送礼物,生活习惯,理财
- 初探 if(!cin)
- Redis学习6-有序集合(soted set /zset)