黑马程序员——Java基础知识——GUI
2015-03-29 19:44
447 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
一、概述
GUI(GraphicalUser Interface) ,图形用户界面,是计算机与用户交互的方式。计算机与用户交互有两种方式:GUI和CLI。对两种方式的特点进行介绍:
GUI:GraphicalUser Interface,图形用户接口,用图形方式,显示计算机操作界面,方便直观。
CLI:Command LineUser Interface,命令行用户接口,就是常见的Dos命令行操作,需要记住一些命令,操作不直观。
Java将GUI提供的对象,都存在于两个包中:java.Awt包和java.Swing包。
java Awt包:Abstract Window Toolkit,抽象窗口工具包。要调用本地系统方法实现功能,属重量级控件。
java Swing包:在Awt的基础上建立的一套图形界面系统,其中提供了更多的组件,且完全由Java实现,增强了移植性,属轻量 级控件
还有一个 Eclipse提供的Swt包。
通过下图了解java中各组件之间的继承关系。如图:
Container:容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
Container常用子类:Window Panel(面板,不能单独存在)
Window常用子类:Frame Dialog
二、布局管理器
布局就是容器的组件排列方式。
常见的布局管理器:
(1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器。
(2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame默认的管理器。窗体中只有一个组件时,覆盖整个窗体
(3)GridLayout:网格式布局管理器,规则的矩阵,如计算器。
(4)CardLayout:卡片式布局管理器,即选项卡。
(5)GridBayLayout:网格包布局管理器,非规则矩阵
如果存在多种布局方式,如何创建窗体界面呢?步骤:
(1)先将窗体Frame进行大区域的划分,设置其布局管理器,加入面板Panel
(2)将组件加入Panel,设置面板的布局管理器。
三、窗体的创建过程
步骤:1.创建Frame窗体 Frame f=new Frame(标题);
2.对窗体进行基本设置,如大小、位置、布局等。
f.setSize(int wight,int hight) 设置窗体大小
f.setLocation(int x,int y) 设置窗体显示位置,x为横坐标
f.setBounds(int x,int y,int wight,int hight) 直接设置窗体的位置和大小
f.setLayout(Layout layout) 选择布局格式。
3.定义组件。如:Button b=new Button(按钮名);
4.将组件添加到窗体中。f.add(b);
5.显示窗体 f.setVisible(true);如果传入false窗体不显示。
下面通过一段代码展示整个过程:
在运行程序后,发现无法直接在窗体上实现关闭,这时就需要学习图形化界面中事件监听机制,来实现窗体的操作。
四、事件的监听机制
首先通过事件的监听流程图,对事件的监听机制进行一下认识,如图:
组成部分:
事件源:awt或swing包中的图形界面组件。
事件(Event):每一个事件都有自己特有的对应事件和共性事件。
监听器(Listener):将可触发某一事件的动作(不只一个动作),都封装到监听器里。
事件处理:引发事件后的处理方式。
事件源、事件、监听器可以通过获取其对象来使用,最后的事件处理方式需要自己定义。
操作步骤:
1.确定事件源,作用在窗体 ,还是窗体的哪个组件上。
2.通过事件源对象的addXXXlistener()方法将监听器注册到该事件源上。 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。一般用匿名内部类表示该对象。
3.覆盖方法,方法的参数一般是XXXEvent类型的变量。在事件触发后就会把事件打包成对象传递给这个变量。
下面通过具体的几个程序学习各种操作事件包括键盘事件、鼠标事件等的监听和处理过程。如下:
菜单栏(MenuBar):可添加菜单和菜单条目。要先创建菜单栏,再创建菜单。通过setMenuBar()方法,将菜单栏添加到窗体中
菜单(Menu):继承菜单项,可添加菜单和菜单项。
菜单项(MenuItem):最终的菜单项。
下面通过一个程序展示菜单的建立以及菜单功能的实现 ,如下:
下面利用菜单制作一个简易的记事本程序,这时就需要另一个组件——FileDialog(文件对话框),具体程序如下:
-------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、概述
GUI(GraphicalUser Interface) ,图形用户界面,是计算机与用户交互的方式。计算机与用户交互有两种方式:GUI和CLI。对两种方式的特点进行介绍:
GUI:GraphicalUser Interface,图形用户接口,用图形方式,显示计算机操作界面,方便直观。
CLI:Command LineUser Interface,命令行用户接口,就是常见的Dos命令行操作,需要记住一些命令,操作不直观。
Java将GUI提供的对象,都存在于两个包中:java.Awt包和java.Swing包。
java Awt包:Abstract Window Toolkit,抽象窗口工具包。要调用本地系统方法实现功能,属重量级控件。
java Swing包:在Awt的基础上建立的一套图形界面系统,其中提供了更多的组件,且完全由Java实现,增强了移植性,属轻量 级控件
还有一个 Eclipse提供的Swt包。
通过下图了解java中各组件之间的继承关系。如图:
Container:容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
Container常用子类:Window Panel(面板,不能单独存在)
Window常用子类:Frame Dialog
二、布局管理器
布局就是容器的组件排列方式。
常见的布局管理器:
(1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器。
(2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame默认的管理器。窗体中只有一个组件时,覆盖整个窗体
(3)GridLayout:网格式布局管理器,规则的矩阵,如计算器。
(4)CardLayout:卡片式布局管理器,即选项卡。
(5)GridBayLayout:网格包布局管理器,非规则矩阵
如果存在多种布局方式,如何创建窗体界面呢?步骤:
(1)先将窗体Frame进行大区域的划分,设置其布局管理器,加入面板Panel
(2)将组件加入Panel,设置面板的布局管理器。
三、窗体的创建过程
步骤:1.创建Frame窗体 Frame f=new Frame(标题);
2.对窗体进行基本设置,如大小、位置、布局等。
f.setSize(int wight,int hight) 设置窗体大小
f.setLocation(int x,int y) 设置窗体显示位置,x为横坐标
f.setBounds(int x,int y,int wight,int hight) 直接设置窗体的位置和大小
f.setLayout(Layout layout) 选择布局格式。
3.定义组件。如:Button b=new Button(按钮名);
4.将组件添加到窗体中。f.add(b);
5.显示窗体 f.setVisible(true);如果传入false窗体不显示。
下面通过一段代码展示整个过程:
public static void main(String[] args) { //创建窗体 Frame f=new Frame("我的窗体"); //对窗体进行基本设置 f.setBounds(400, 500, 400, 350);//设置窗体的位置和大小 f.setLayout(new FlowLayout());//设置流式布局 //定义组件 Button b=new Button("按钮"); //添加组件 f.add(b); //显示窗体 f.setVisible(true); }
在运行程序后,发现无法直接在窗体上实现关闭,这时就需要学习图形化界面中事件监听机制,来实现窗体的操作。
四、事件的监听机制
首先通过事件的监听流程图,对事件的监听机制进行一下认识,如图:
组成部分:
事件源:awt或swing包中的图形界面组件。
事件(Event):每一个事件都有自己特有的对应事件和共性事件。
监听器(Listener):将可触发某一事件的动作(不只一个动作),都封装到监听器里。
事件处理:引发事件后的处理方式。
事件源、事件、监听器可以通过获取其对象来使用,最后的事件处理方式需要自己定义。
操作步骤:
1.确定事件源,作用在窗体 ,还是窗体的哪个组件上。
2.通过事件源对象的addXXXlistener()方法将监听器注册到该事件源上。 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。一般用匿名内部类表示该对象。
3.覆盖方法,方法的参数一般是XXXEvent类型的变量。在事件触发后就会把事件打包成对象传递给这个变量。
下面通过具体的几个程序学习各种操作事件包括键盘事件、鼠标事件等的监听和处理过程。如下:
/** 创建一个窗体 ,并让窗体和按钮都能实现关闭窗体的功能 */ class EventDemo { //定义组件引用 private Frame f; private Button b; EventDemo(){ init(); } //创建窗体,实现功能 private void init(){ //创建窗体 f=new Frame("My Frame"); //对窗体进行基本设置 f.setBounds(300,100,600,500); f.setLayout(new FlowLayout()); //添加组件 b=new Button("My Button"); f.add(b); //加载事件 myEvent(); //显示窗体 f.setVisible(true); } //注册事件 private void myEvent(){ //实现窗体的关闭功能 f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.exit(0); } }); //实现按钮的关闭功能 b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); } public static void main(String[]args){ //运行窗体 new EventDemo(); } }从上面的程序可以得到几个知识点:1.当要添加的监听器内的方法很多时(一般超过2个),这时可以添加它的子类XXXAdapter来代替,XXXAdapter已经覆盖了对应的监听器的方法,添加时只需要覆盖需要的方法即可。2.查阅组件的功能,选择要添加的监听器。3.明确事件,并对事件处理。添加什么监听器,就需要添加什么事件。
/** 给按钮添加键盘、鼠标监听。 */ class EventDemo { //定义组件引用 private Frame f; private Button but; EventDemo() { init(); } private void init() { //创建窗体 f = new Frame("my frame"); //窗体设置 f.setBounds(300,100,600,500); f.setLayout(new FlowLayout()); //创建组件 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.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_ENTER) System.out.println("enter is coming"); } }); //给按钮添加鼠标监听 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 EventDemo(); } }要注意的是一个组件上如果即添加了鼠标监听,又添加了活动监听,会先执行鼠标监听的处理动作。
/** 列出指定目录内容 */ class EventDemo { //定义组件引用 private Frame f; private TextField tf; private Button but; private TextArea ta; EventDemo() { init(); } //窗体创建,功能实现 private void init() { f = new Frame("My Frame"); f.setBounds(300,100,600,500); f.setLayout(new FlowLayout()); 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() { //文本框添加键盘监听 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"); } } public static void main(String[] args) { new EventDemo(); } }注意的是这个窗体在运行时,用户有可能输入的不是一个目录,这时就需要对用户进行提醒,就需要另一个组件——对话框。下面就通过建立对话框,完善该程序的功能,在输入错误的信息时,就调用对话框,提醒用户。如下:
class EventDemo { //定义组件引用 private Frame f; private TextField tf; private Button but; private TextArea ta; private Dialog d; private Label lab; private Button dBut; EventDemo() { init(); } //窗体创建,功能实现 private void init() { f = new Frame("My Frame"); 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,"提示信息",true); d.setBounds(400,200,240,150); d.setLayout(new FlowLayout()); lab = new Label(); dBut = new Button("确定"); //添加组件 d.add(lab); d.add(dBut); f.add(tf); f.add(but); f.add(ta); //加载事件 myEvent(); //显示窗体 f.setVisible(true); } private void myEvent() { //文本框添加键盘监听 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); } }); //给对话框的按钮添加活动监听。 dBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { d.setVisible(false); } }); //给对话框添加窗口监听 d.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { d.setVisible(false); } }); } //定义显示目录内容的方法 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 EventDemo(); } }五、菜单
菜单栏(MenuBar):可添加菜单和菜单条目。要先创建菜单栏,再创建菜单。通过setMenuBar()方法,将菜单栏添加到窗体中
菜单(Menu):继承菜单项,可添加菜单和菜单项。
菜单项(MenuItem):最终的菜单项。
下面通过一个程序展示菜单的建立以及菜单功能的实现 ,如下:
/** 建立一个具有退出功能的菜单项 */ class EventDemo { private Frame f; private MenuBar mb; private Menu m,subMenu; private MenuItem closeItem,subItem; EventDemo() { init(); } public void init() { f = new Frame("My Frame"); f.setBounds(300,100,500,600); f.setLayout(new FlowLayout()); //创建菜单、菜单栏、菜单项对象 mb = new MenuBar(); m = new Menu("文件"); subMenu = new Menu("子菜单"); subItem = new MenuItem("子条目"); closeItem = new MenuItem("退出"); subMenu.add(subItem); m.add(subMenu); m.add(closeItem); mb.add(m); //添加菜单栏 f.setMenuBar(mb); //加载事件 myEvent(); //显示窗体 f.setVisible(true); } private void myEvent() { //给菜单项添加监听 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 EventDemo(); } }通过对菜单项或菜单添加活动监听,可以进行对应的事件处理,实现功能。
下面利用菜单制作一个简易的记事本程序,这时就需要另一个组件——FileDialog(文件对话框),具体程序如下:
<pre name="code" class="java">public class EventDemo { //定义组件引用 private Frame f; private MenuBar bar; private TextArea ta; private Menu fileMenu; private MenuItem openItem,saveItem,closeItem; private FileDialog openDia,saveDia; private File file; EventDemo() { 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(); 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 EventDemo(); } }
-------------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
相关文章推荐
- 黑马程序员---java基础知识(九):GUI
- 黑马程序员--GUI界面编程--java学习日记9(基础知识)
- 黑马程序员学习log第七篇基础知识:JAVA的面向对象之GUI总结
- 黑马程序员---java基础知识之GUI
- 黑马程序员,Java基础知识九:GUI图形用户界面
- 黑马程序员-Java语言基础– GUI 图形用户界面 第22天
- 黑马程序员_java初级基础知识汇总(常量和变量、语句、函数、数组)
- 黑马程序员_java基础11-GUI
- 黑马程序员_java基础知识学习总结三
- 2.java GUI基础知识点
- 黑马程序员——java语言基础知识回顾(四)
- 黑马程序员_Java基础_GUI(图形用户接口)
- 黑马程序员 java 基础知识
- 黑马程序员_java基础知识补充
- 黑马程序员 java学习笔记-基础知识盘点
- 黑马程序员_java基础知识学习总结二
- 黑马程序员--java基础知识注意点收录
- 黑马程序员0831_java基础知识+多线程部分
- 黑马程序员0822_java基础知识
- 黑马程序员——java语言基础知识回顾(三)