黑马程序员_GUI
GUI
java.awt 包 java.swing包
Java将图形界面,用包中的类,完成图形化界面的开发
awt包中类必须依赖操作系统,重量级组件
swing包中类基于awt的功能,由Java代码完全实现的图形界面,不依赖操作系统,轻量级组件
Frame类 制作窗体
Frame类中的方法:
不带标题的窗口:Frame()
带有标题的窗口:Frame(窗口名)
让窗体显示的方法 setVisible(boolean )
设置窗体的大小 setSize(int width,int height)
对窗体定位,父类的setLocation(width,height)
设置尺寸和位置 setBounds(int x ,int y, int width,int height)
设置窗体的背景色 setBackground(Color c)万物皆对象,颜色也是对象,封装到了Color类
获取屏幕分辨率的方式 ToolKit实现,Toolkit中静态方法 getDeafultToolKit,返回其子类的对象。再调用Toolkit类的方法getScreenSize获取屏幕分辨率,返回 Dimension对象,这个对象的成员变量 width height就是屏幕的分辨率
Toolkit.getDeafultToolkit().getScreenSize().width
setLoction((width-100)/2,(height-30)/2);
布局管理器
FlowLayout
上到下,左到右
BorderLayout 边界布局
东、南、西、北、中
GridLayout 网格布局
规则矩阵
GridLayout 不规则的网格布局
不规则矩阵
CardLayout 卡片布局
选项卡
描述按钮的类
1、 java.awt.Button
构造方法:带有一个String类型的标签 Button(String lable )
2、将按钮放在窗体上,使用的是窗体的方法 Frame类的add(按钮)
3、随意放置,大小自定义调节的按钮
取消布局管理器Frame类的setLayout(null)
如果取消了布局管理器,组件,必须定义位置和尺寸,否则不显示 setBounds(x,y,width,height)
事件监听机制
组成:
事件源:就是用户可以操作的组件。按钮,窗体,文本框
事件:鼠标事件,键盘事件,窗体事件
监听器:内置于事件源上的一种监听机制。监听鼠标事件,只要有鼠标的动作,就会被监听器捕获
事件处理:一旦监听器监听到了动作,就调用响应的函数,进行事件的处理
适配器设计模式
1、 类适配器类,作用实现接口,重写接口中的全部抽象方法,但是重写后方法的主体为空。我们开发者不需要直接实现接口,只需继承适配器了,重写想要的方法就可以了
如 实现WindowListener接口 的窗口适配器WindowAdapter类
2、写事件监听器
标准格式:
事件源.addXXXListener(new XXXAdapter(){
public void 方法名(XXXEvent e){
}
});
xxx:代表事件
f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.out.println(e); System.exit(0); } });
3、鼠标事件
1 /* 2 * 鼠标事件 3 */ 4 import java.awt.*; 5 import java.awt.event.*; 6 7 public class FrameDemo3 { 8 public static void main(String[] args) { 9 Frame f = new Frame("鼠标事件"); 10 f.setBounds(200, 100, 500, 400); 11 f.setLayout(null); 12 13 f.setVisible(true); 14 Button but = new Button("确定"); 15 but.setBounds(100, 50, 50, 30); 16 f.add(but); 17 // 对事件源按钮,添加鼠标事件 18 but.addMouseListener(new MouseAdapter() { 19 // 重写鼠标的点击事件 20 public void mouseClicked(MouseEvent e) { 21 // System.out.println(e); 22 if (e.getClickCount() == 12) 23 System.out.println("点击了按钮"); 24 } 25 //鼠标进入事件源 26 public void mouseEntered(MouseEvent e) { 27 System.out.println("鼠标进入"); 28 } 29 //鼠标离开事件源 30 public void mouseExited(MouseEvent e) { 31 System.out.println("鼠标离开"); 32 } 33 34 }); 35 36 } 37 }
4、键盘事件
KeyEvent类中的方法:
int getKeycode() int getKeyChar()
KeyEvent类中的静态常量封装了键盘上所对应的码值。这些常量以“VK_键名”的形式组成。如:KeyEvent.VK_0代表键盘上输入0
KeyEvent继承的父类方法:
consume() 阻止非法数据的输入
boolean isXXXDown() 判断是否按下了某个键
TextField类的方法:
setEchochar() 以“*”显示按下的键
5、获取键盘的输入
1 import java.awt.*; 2 import java.awt.event.*; 3 4 public class KeyInput { 5 public static void main(String[] args){ 6 Frame frame=new Frame("键盘输入"); 7 frame.setBounds(500,299, 600, 500); 8 frame.setBackground(new Color(202,232,237)); 9 frame.setLayout(null); 10 frame.setVisible(true); 11 12 TextField tf=new TextField(); 13 tf.setBounds(20,40, 400, 30); 14 frame.add(tf); 15 tf.setEchoChar('*'); 16 tf.addKeyListener(new KeyAdapter() { 17 public void keyPressed(KeyEvent e){ 18 int code =e.getKeyCode(); 19 char c = e.getKeyChar(); 20 System.out.println(c+""); 21 if(e.isControlDown()&&code==KeyEvent.VK_ENTER){ 22 System.out.println("组合键"); 23 } 24 } 25 }); 26 } 27 }
6、文件列表的摸拟
import java.awt.*; import java.awt.event.*; import java.io.File; public class FileList { //定义窗口 private Frame frame; //定义单行文本 private TextField frame_tf; // 跳转按钮 private Button frame_but; // 多行文本 private TextArea frame_ta; // 对话框 private Dialog dialog ; //对话框的确定按钮 private Button dialog_but; // 对话框上的文本标签 private Label dialog_lbl; // 获取屏幕分辨率 private static final int WIDTH=Toolkit.getDefaultToolkit().getScreenSize().width; private static final int HEIGHT=Toolkit.getDefaultToolkit().getScreenSize().height; //文件列表的构造函数 public FileList(){ // 初始化的函数 init(); } private void init(){ // 初始化窗口 frame=new Frame("文件列表"); // 设置窗口的位置和大小 frame.setBounds((WIDTH-600)/2, (HEIGHT-500)/2, 600, 500); // 设置背景 frame.setBackground(new Color(202,232,237)); // 清空布局 frame.setLayout(null); // 显示窗口 frame.setVisible(true); // 初始化化单行文本 frame_tf=new TextField(); // 设置单行文本的位置和大小 frame_tf.setBounds(20,40, 400, 30); // 将单行文本添加进窗口 frame.add(frame_tf); // 初始化跳转按钮 frame_but=new Button("跳转"); frame_but.setBounds(440,40 ,70 ,30 ); frame.add(frame_but); // 初始化多行文本 frame_ta=new TextArea(); frame_ta.setBounds(20,85, 550, 400); frame.add(frame_ta); // 初始化对话框 dialog=new Dialog(frame,"错误路径",true); dialog.setBounds((WIDTH-600)/2, (HEIGHT-150)/2, 600, 150); dialog.setLayout(null); // 初始化按钮 dialog_but=new Button("确定"); dialog_but.setBounds(320, 90, 50, 25); dialog.add(dialog_but); // 处理事件 event(); } // 事件的处理 private void event(){ // 窗口的关闭 frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); // 按钮跳转 frame_but.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e){ getDir(); } }); // 输入文本的键盘事件 frame_tf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { // 判断按下的是不是回车键 int code=e.getKeyCode(); if(code==KeyEvent.VK_ENTER) // 遍历目录 getDir(); } }); // 定义对话框的关闭按钮 dialog.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ dialog.setVisible(false); } }); // 定义对话框上的确定按钮 dialog_but.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ dialog.setVisible(false); } }); } //遍历目录 public void getDir(){ // 获取目录的路径 String path=frame_tf.getText(); if(path==null || "".equals(path)) return ; // 将目录路径封装到File类中 File file=new File(path); // 判断路径是否存在 if(!file.exists()){ // 初始化button if(dialog_lbl==null){ dialog_lbl=new Label ("输入的路径:"+path+",有误"); }else dialog_lbl.setText("输入的路径:"+path); dialog_lbl.setBounds(120, 50, 300, 25); dialog.add(dialog_lbl); dialog.setVisible(true); }else{ // 遍历目录 // 追加到多行文本的时候,清空多行文本 frame_ta.setText(""); // 返回封装路径下的全路径 File[] files=file.listFiles(); for(File f:files){ frame_ta.append(f+"\r\n"); } } } }
菜单
1、 MenuBar
用窗体的setMenuBar方法设置MenuBar
构造方法只有空参数的
add(Menu)将菜单添加到菜单栏
Menu
构造方法,带有一个String标签的
add(MenuItem)添加菜单条目到菜单中
MenuItem
构造方法,带有一个String标签的
addActionListener()添加活动的事件监听
2、模拟记事本
窗体设置Bar,Bar添加Menu,Menu添加MenuItem
1 import java.awt.*; 2 import java.awt.event.*; 3 import java .io.*; 4 public class Note { 5 //定义屏幕分辨率 6 private static final int WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width; 7 private static final int HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height; 8 //定义窗体 9 private Frame frm; 10 //展示列表多行文本 11 private TextArea frm_ta; 12 //菜单栏MenuBar 13 private MenuBar bar ; 14 //菜单Menu 15 private Menu menu ; 16 //菜单项MenuItem 17 private MenuItem open,save; 18 //定义文件对话框 19 private FileDialog fdl ; 20 private File selectFile = null; 21 22 public Note(){ 23 init(); 24 } 25 private void init(){ 26 // 初始化窗体 27 frm=new Frame("记事本"); 28 // 设置窗体的位置和大小 29 frm.setBounds((WIDTH-600)/2, (HEIGHT-550)/2, 600, 550); 30 // 设置窗体的背景颜色 31 frm.setBackground(Color.lightGray); 32 // 清空布局 33 frm.setLayout(null); 34 // 将窗体显示 35 frm.setVisible(true); 36 37 // 初始化话菜单 38 bar=new MenuBar(); 39 // 用窗体的setMenuBar方法来设置菜单栏 40 frm.setMenuBar(bar); 41 // 在菜单栏上设置菜单 42 menu=new Menu("文件"); 43 bar.add(menu); 44 // 在菜单中添加菜单项 45 open=new MenuItem("打开"); 46 save=new MenuItem("保存"); 47 menu.add(open); 48 menu.add(save); 49 //初始化多行文本 50 frm_ta=new TextArea(); 51 frm_ta.setBounds(5, 48, 590, 495); 52 frm.add(frm.add(frm_ta)); 53 54 // 添加事件 55 event(); 56 } 57 58 private void event(){ 59 // 窗口关闭 60 frm.addWindowListener(new WindowAdapter() { 61 public void windowClosing(WindowEvent e){System.exit(0);} 62 }); 63 64 // 菜单项的打开,添加活动事件 65 open.addActionListener(new ActionListener() { 66 public void actionPerformed(ActionEvent e) { 67 // 初始化文件打开对话框,为frm添加名为"资源管理器"的用于读取文件的对话框 68 fdl=new FileDialog(frm,"资源管理器",FileDialog.LOAD); 69 // 使文件对话框可见 70 fdl.setVisible(true); 71 72 // 获取用户选择的文件 73 // 获取文件对话框的文件 74 String filename = fdl.getFile(); 75 // 获取文件对话框的目录 76 String dir= fdl.getDirectory(); 77 // 如果用户没选择目录(路径)或者没选择文件,就退出函数.什么也不执行 78 if(dir==null||filename==null){ 79 return; 80 } 81 // 初始化选择的文件 82 selectFile=new File(dir,filename); 83 // 遍历选择的文件 84 readFile(selectFile); 85 } 86 }); 87 88 // 菜单项中保存的事件监听 89 save.addActionListener(new ActionListener() { 90 public void actionPerformed(ActionEvent e) { 91 if(selectFile==null){ 92 // 初始化保持的文件对话框 93 fdl=new FileDialog(frm,"资源管理器",FileDialog.SAVE); 94 fdl.setVisible(true); 95 96 String dir=fdl.getDirectory(); 97 String filename=fdl.getFile(); 98 if(dir==null||filename==null){ 99 return; 100 } 101 // 将选择的文件路径封装成File对象 102 selectFile =new File(dir,filename); 103 } 104 // 将多行文本中的文件保存到file中 105 saveFile(selectFile); 106 } 107 }); 108 } 109 110 // 读取打开的文夹 111 private void readFile(File file){ 112 BufferedReader br=null; 113 try{ 114 br=new BufferedReader(new FileReader(file)); 115 String len=null; 116 frm_ta.setText(""); 117 while((len=br.readLine())!=null){ 118 frm_ta.append(len+"\r\n"); 119 } 120 }catch(IOException e){ 121 e.printStackTrace(); 122 throw new RuntimeException("打开文件失败!"); 123 }finally{ 124 try{ 125 if(br!=null) 126 br.close(); 127 }catch(IOException e){ 128 throw new RuntimeException("读取文件后关闭失败"); 129 } 130 } 131 } 132 133 //保存文件的方法 134 public void saveFile(File file){ 135 // 获取文本框中的内容 136 String text = frm_ta.getText(); 137 FileWriter fw=null; 138 try{ 139 fw=new FileWriter(file); 140 fw.write(text); 141 fw.flush(); 142 }catch(IOException e){ 143 throw new RuntimeException("文件保存失败"); 144 }finally{ 145 try{ 146 if(fw!=null) 147 fw.close(); 148 }catch(IOException e){ 149 throw new RuntimeException("文件写入关闭失败!"); 150 } 151 } 152 153 } 154 }