首页 > 代码库 > 黑马程序员——Java基础——GUI
黑马程序员——Java基础——GUI
第一讲 图形化用户界面
GUI(图形用户界面)
GUI
• Graphical User Interface(图形用户接口)。
• 用图形的方式,来显示计算机操作的界面,这样更方便更直观
CLI
• Command line User Interface (命令行用户接口)
• 就是常见的Dos命令行操作。
• 需要记忆一些常用的命令,操作不直观。
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中
Awt与 Swing
• java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
• javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件
Container常用的子类:Window Panel
Window常用子类:Frame Dialog
二、布局管理器
容器中的组件的排放方式,就是布局。
常见的布局管理器:
• FlowLayout(流式布局管理器)从左到右的顺序排列。flow嘛,跟着走就是流水
• Panel默认的布局管理器。
• BorderLayout(边界布局管理器)board嘛就是打麻将,所以是东西南北中布局
• Frame默认的布局管理器。
• GridLayout(网格布局管理器)Brid网格状的
• CardLayout(卡片布局管理器)
• 选项卡
• GridBagLayout(网格包布局管理器)
• 非规则的矩阵
1 import java.awt.*; 2 /*创建步骤: 3 * 1、用Frame创建窗口 4 * 2、对窗口进行进本操作 5 * 大小setSize(),位置setLocation()、布局setLayout 6 * 3、定义组件(如Button按钮 、Label标签、Checkbox复选框等) 7 * 4、setVisible(boolean);显示窗口与否 8 */ 9 public class AwtDemo {10 public static void main(String[] args){11 Frame f=new Frame("水音");//创建12 f.setSize(500,400);//大小13 f.setLocation(300,200);//位置14 f.setLayout(new FlowLayout());//边界布局(桌子打麻将不仅)是默认的,这里改成流式跟班布局15 16 Button b=new Button("有压力");17 f.add(b);//按钮添加在窗口18 f.setVisible(true);//显示窗口19 }20 }
五、事件监听机制:
1、组合:
1)事件源(组件):awt或swing包中的图形化界面组件;
2)事件(Event):每件时间有都有自己特有的对应事件;
3)监听器:将可触发某一事件的动作,都封装在监听器中
4)事件处理:引发事件后的处理方式;
2、使用方法
1)确定事件源(容器或组件)。通过事件源对象的addXXXlistener()方法将监听器注册到该事件源上
如:
f.addWindowListener(new mylis());//主函数引用的方法//定义一个监听器基础WindowAdapter,并复写7大方法class mylis extends WindowAdapter { public void WindowClosing(){ System.out.println("关闭按钮被按下"); System.exit(0); }}
2)然而一般是使用你们匿名内部类方法:
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("开启");
}
});
练习:面向对象的思想做一次按钮关闭窗口的监听
1 import java.awt.*; 2 import java.awt.event.*; 3 4 class EvenDemo { 5 // 定义组件按钮和界面 6 private Frame f=null; 7 private Button but=null; 8 // 构造函数让他一new就执行 9 EvenDemo(){10 win();11 }12 // 定义窗口13 public void win(){14 f=new Frame("我是窗口");15 but=new Button("我是按钮");16 f.setBounds(250,250,250,250);//设置大小位置17 f.setLayout(new FlowLayout());//改成流式布局18 // f加入but19 f.add(but);20 myEvent();21 f.setVisible(true);22 }23 // 定义时间24 public void myEvent(){25 // 窗口时间26 f.addWindowListener(new WindowAdapter() {27 public void windowClosing(WindowEvent e){28 System.exit(0);29 } 30 });31 /*32 * 那么现在让按钮做时间源的话,选择哪个监听器呢?33 * 应该在API查阅button的描述,最后找到addActionListener34 * 35 */36 but.addActionListener(new ActionListener(){37 38 public void actionPerformed(ActionEvent arg0) {39 System.out.println("按钮搞上你");40 System.exit(0);41 }42 });43 } 44 public static void main(String[] args){45 new EvenDemo();46 }47 }
练习大全:鼠标(进入、双击、点击),键盘(点击,组合件),文本框(输入,非法输入)的监听
1 import java.awt.*; 2 import java.awt.event.*; 3 class MouseEvent { 4 // 定义组件按钮和界面 5 private Frame f=null; 6 private Button but=null; 7 private TextField tf; 8 // 构造函数让他一new就执行 9 MouseEvent(){10 win();11 }12 // 定义窗口13 public void win(){14 f=new Frame("我是窗口");15 but=new Button("我是按钮");16 f.setBounds(250,250,250,250);//设置大小位置17 f.setLayout(new FlowLayout());//改成流式布局18 // f加入but19 tf=new TextField(20);20 21 f.add(tf);22 f.add(but);23 myEvent();24 f.setVisible(true);25 }26 // 定义时间27 public void myEvent(){28 // 窗口时间29 f.addWindowListener(new WindowAdapter() {//比较多的时候是Adapter30 public void windowClosing(WindowEvent e){31 System.exit(0);32 } 33 });34 // 按钮监听35 but.addActionListener(new ActionListener(){36 37 public void actionPerformed(ActionEvent arg0) {38 System.out.println("按钮搞上你");39 // System.exit(0);40 }41 });42 // 文本框注意使用的键盘监听43 tf.addKeyListener(new KeyAdapter() {44 public void keyPress(KeyEvent e){45 int code=e.getKeyCode();46 if(!(code>=KeyEvent.VK_0&&code<=KeyEvent.VK_9)){47 System.out.println(code+""+e.getKeyCode()); 76 }77 }) ;78 79 80 } 81 protected int getClickCount() {82 // TODO Auto-generated method stub83 return 0;84 }85 public static void main(String[] args){86 new MouseEvent();87 }88 }
练习:当文本框出现误操作时,出现提醒的机制
1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.*; 4 5 import javax.swing.Action; 6 7 public class MyWindowDemo { 8 9 private Frame f; 10 private Button b; 11 private TextField tf;//文本框 12 private TextArea ta;//文本域 13 14 private Button okb; 15 private Dialog d;//出错的对话框 16 private Label lab;//出错的警示语标签 17 MyWindowDemo(){ 18 win(); 19 } 20 // 先做窗口 21 public void win(){ 22 f=new Frame("窗口"); 23 f.setBounds(200,200,600,300); 24 f.setLayout(new FlowLayout()); 25 26 b=new Button("按钮"); 27 28 tf=new TextField(30);//30长的文本框 29 // 30 ta=new TextArea(10,40);//高和长 31 32 // 各种添加 33 f.add(b); 34 f.add(tf); 35 f.add(ta); 36 // 事件发生 37 event(); 38 // 显示窗口 39 f.setVisible(true); 40 } 41 42 // 自定义事件 43 public void event(){ 44 f.addWindowListener(new WindowAdapter() { 45 public void windowClosing(WindowEvent e){ 46 System.exit(0); 47 } 48 }); 49 50 // 按钮文本框内容搜索 51 b.addActionListener(new ActionListener() { 52 public void actionPerformed(ActionEvent e) { 53 showFile(); 54 } 55 }); 56 // 文本框按钮enter后事件 57 tf.addKeyListener(new KeyAdapter(){ 58 public void keyPressed(KeyEvent e){ 59 if(e.getKeyCode()==KeyEvent.VK_ENTER) 60 showFile(); 61 } 62 }); 63 } 64 // 定义一个查看文件的方法 65 private void showFile(){ 66 ta.setText("");//每次清屏 67 String str=tf.getText();//得到文本框的值 68 File dir=new File(str);//创建一个文本框值对应的文件 69 if(dir.exists()&&dir.isDirectory()){//如果文件且有目录 70 String[] names=dir.list();//那就遍历下存好 71 for(String name:names){ 72 ta.append(name+"\r\n"); 73 } 74 }else{ 75 // 对话框设置 76 d=new Dialog(f,"错误信息",true); 77 d.setBounds(400,200,180,150); 78 d.setLayout(new FlowLayout()); 79 // 按钮盒标签 80 okb=new Button("确定"); 81 lab=new Label("输入的信息:"+str+"是错误的"); 82 83 d.add(okb); 84 d.add(lab); 85 // 对话框关闭 86 d.addWindowListener(new WindowAdapter(){ 87 public void windowClosing(WindowEvent e){ 88 d.setVisible(false);//窗体不显示 89 } 90 }); 91 // 对话框的确定按钮 92 okb.addActionListener(new ActionListener() { 93 public void actionPerformed(ActionEvent e) { 94 d.setVisible(false);//okb按下后窗体不显示 95 } 96 }); 97 98 d.setVisible(true); 99 }100 }101 102 public static void main(String[] args){103 new MyWindowDemo();104 }105 }
菜单:MenuBar
MenuComponent
|-MenuBar:菜单栏,可添加菜单和菜头子条目
|-MenuItem:是最终的条目,没有三角标
|-Menu:菜单,可添加菜单和MenuItem,有三角标
一般对Menu和MenuItem的对象作为事件源添加获得监听ActionListener,并进行事件处理
1 import java.awt.*; 2 import java.awt.event.*; 3 4 //练习菜单的使用并制作退出时间 5 public class myMubuDemo { 6 //定义组件 7 private Frame fra; 8 private MenuBar mb; 9 private Menu m1,m2;10 private MenuItem close1,subI;11 // 初始化12 myMubuDemo(){13 win();14 }15 private void win(){16 // 窗体17 fra=new Frame("xxx");18 fra.setBounds(300,100,500,600);19 fra.setLayout(new FlowLayout());20 // 菜单的设置21 mb=new MenuBar();22 m1=new Menu("选项1");23 m2=new Menu("子菜单");24 25 close1=new MenuItem("退出");26 subI=new MenuItem("子条目");27 // 从小开始添加28 m2.add(subI);29 m1.add(m2);30 m1.add(close1);31 32 mb.add(m1);33 // 注意不是add 窗体添加菜单bar34 fra.setMenuBar(mb);35 // 时间发生36 myEvent();37 38 fra.setVisible(true);39 }40 private void myEvent() {41 // x关闭功能42 fra.addWindowListener(new WindowAdapter(){43 public void windowClosing(WindowEvent e){44 System.exit(0);45 }46 });47 // 点击MenuItem关闭功能48 close1.addActionListener(new ActionListener(){49 public void actionPerformed(ActionEvent arg0) {50 System.exit(0);51 }52 });53 }54 public static void main(String[] args){55 new myMubuDemo();56 }57 }
以下是j制作一个文本软件和制作Jar包的练习
先制作一个简易的文本软件:
package Menu;/*需求:制作一个简易的记事本程序 * 要求:有菜单,文件有打开、保存、退出的功能。还将协会的程序变为可双击执行的程序 * * 步骤: 一、代码部分 * 1、我需要new一下构造函数就执行功能,所以各种组件定义在主函数外,由构造 * 函数启动个功能窗口myWin,有功能窗口启动时间myEvent * 2、文件的打开、保存功能由FileDialog实现 * * 二、jar包部分 * 以图列展现 */import java.awt.*;import java.awt.event.*;import java.io.*;public class MenuText {// 定义个组件// 基本组件 private Frame fra; private MenuBar bar; private Menu fileMe; private MenuItem openI,saveI,otherSave,closeI; private TextArea ta;//文本域// 用于保存于另存组件 private FileDialog openDia,saveDia,saveDiaa; private File file;// 构造函数 MenuText(){ myWin(); }// 窗口实现 private void myWin(){// 搞组件啦 fra=new Frame("简易文本"); fra.setBounds(300,150,600,500); ta=new TextArea(); bar=new MenuBar(); fileMe=new Menu("文件"); openI=new MenuItem("打开"); saveI=new MenuItem("保存"); otherSave=new MenuItem("另存为"); closeI=new MenuItem("退出");// 用于打开保存文件的组件FileDialog openDia = new FileDialog(fra,"选择打开的文件",FileDialog.LOAD);//注意打开的最后参数 saveDia = new FileDialog(fra,"选择存的文件",FileDialog.SAVE);//注意打开的最后参数 saveDiaa = new FileDialog(fra,"选择存的文件",FileDialog.SAVE);//注意打开的最后参数 myEvent(); // 添加组件 fileMe.add(openI); fileMe.add(saveI); fileMe.add(otherSave); fileMe.add(closeI); bar.add(fileMe); fra.add(ta); fra.setMenuBar(bar); fra.setVisible(true); }// 事件监听 private void myEvent(){// 窗口关闭功能退出关闭和x关闭 fra.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.out.println("x关闭"); System.exit(0); } }); closeI.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("退出关闭"); System.exit(0); } });// 打开事件,打开需要使用FileDialog,需要知道文件目录,文件名,需要使用IO openI.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {// 显示文件对话框 openDia.setVisible(true);// 需要文件目录与名字 String di=openDia.getDirectory(); String fileName=openDia.getFile(); if(di==null||fileName==null)//打开了对话框却没有做操作 return;// 就可以搞一个文件了 file =new File(di,fileName);//这个就是我们打开的文件// 一下是使用IO缓冲流惊醒文件传输 try { ta.setText("");//情况我现在窗口的文字// 需要用缓冲流读取file在放弃ta里 BufferedReader br= new BufferedReader(new FileReader(file)); String line=null; while((line=br.readLine())!=null){ ta.append(line+"\r\n"); } br.close(); } catch (IOException e2) { throw new RuntimeException("文件打开失败"); } } }); // 保存事件 saveI.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e1) {// 如果第一次保存会显示对话框 if(file==null){// 显示对话框 saveDia.setVisible(true); String di=saveDia.getDirectory(); String fileName=saveDia.getFile(); if(di==null||fileName==null)//打开了对话框却没有做操作 return; file =new File(di,fileName);//这个就是我们保存的文件 } save();//保存文件的方法 } });// 另存事件 otherSave.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e2) {// 另存一定有对话框// 显示对话框 saveDiaa.setVisible(true);// 目录和文件名来自对话框,就是 String di=saveDiaa.getDirectory(); String fileName=saveDiaa.getFile(); file =new File(di,fileName);//这个就是我们保存的文件 save();// 保存时,默认上次打开对话框文件位置 openDia.setFile(file.getName()); } }); }// 保存文件使用IO技术,将窗口的内容写入新的文件中 private void save(){ try { BufferedWriter bw=//写入file,所以保存和另存的区别在于file的不同 new BufferedWriter(new FileWriter(file)); String line=ta.getText(); bw.write(line);// bw.flush();应该close写在try所以不刷,一般close写在finally就需要刷 bw.close(); } catch (IOException e) { throw new RuntimeException("文件保存失败"); } } public static void main(String[] args){ new MenuText(); } }
导入Jar的步骤
1、我已经生成了一个包:D:\Java520s\GUI\src\Menu
2、
黑马程序员——Java基础——GUI