一。开发架构
1.最外层是一个jframe的框架
2.可以在框架中添加任意组件
3.组件分为两大类:
a。容器类型:可以继续在该容器中添加其他组件。例如:jpanel 面板,可以多个面板添加到同一个框架中
b。具体的组件:按钮,文本框,标体,文本域,可以添加到容器类型中
4.事件:是触发事件完成一定的功能
常用事件有:
a.按钮的监听事件:ActionListener 监听按钮的点击事件
b.鼠标监听事件:MouseListener 监听鼠标的按下,弹起,鼠标的移动
c.键盘监听事件:KeyListener 监听键盘的点击,弹起事件
5.在swing组件如何加载图片 见 PictureDEmo
a.通过jlable标签来加载
b.jpanel中的画笔对象来画出来
6.在jframe来自定义画板,画自己想要的内容。步骤
a.创建一个自定义的面板类,继承jpanel
b.初始化面饭的相关显示属性
c.把该面板加入到jframe中
d.在面板类中重写paintComponent(Graphics g)此方法,这个方法里面就是我们画画的地方
作业1.登录窗口
如果用户输入的是用户名“root”,密码“admin” 则登录成功,显示另外一个窗体并显示登录XXXX成功
如果输入有误弹出密码错误提示
作业2.通过按键左右键的点击来切换图片的显示 总共五张图片 如果到了末尾再点调回第一张
作业3:做一个计算器,完成通用功能
二。例子
计算器+按钮监听实例:
1 package com.demo1116; 2 3 import java.awt.Font; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.awt.event.KeyAdapter; 7 import java.awt.event.KeyEvent; 8 import java.awt.event.KeyListener; 9 10 import javax.swing.JButton; 11 import javax.swing.JFrame; 12 import javax.swing.JLabel; 13 import javax.swing.JTextField; 14 import javax.swing.plaf.basic.BasicSplitPaneUI.KeyboardUpLeftHandler; 15 16 public class MyFrame extends JFrame{ 17 double num1;//存放第一个数字 18 double num2;//存放第二个数字 19 String type;//记录当前的运算符号 20 boolean isSecond = false;//记录是否是第二个数字的开始 21 //按钮 22 JButton jb1; 23 JButton jb2; 24 JButton jb3; 25 26 JButton jb_point; 27 JButton jb_add; 28 JButton jb_result; 29 //标体 30 JLabel jl1; 31 //文本框 32 JTextField jtf_username; 33 public MyFrame() { 34 //设置窗口的关闭模式 关闭窗口立即终止程序 35 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 36 setSize(500, 500);//设置框架的大小 37 setLayout(null);//设置布局管理器为null,则表示使用手动布局 38 setLocationRelativeTo(null); 39 setTitle("计算器"); 40 //添加其他组件 41 jb1 = new JButton("1"); 42 jb1.setBounds(20, 100, 50, 50); 43 jb1.addActionListener(new MyButtonActionListener("1"));//给按钮添加事件监听器 44 this.add(jb1);//添加组件到容器中 45 46 jb2 = new JButton("2"); 47 jb2.setBounds(80, 100, 50, 50); 48 jb2.addActionListener(new MyButtonActionListener("2"));//给按钮添加事件监听器 49 this.add(jb2);//添加组件到容器中 50 51 jb3 = new JButton("3"); 52 jb3.setBounds(150, 100, 50, 50); 53 jb3.addActionListener(new MyButtonActionListener("3"));//给按钮添加事件监听器 54 this.add(jb3);//添加组件到容器中 55 56 jb_point = new JButton("."); 57 jb_point.setBounds(150, 180, 50, 50); 58 jb_point.addActionListener(new MyButtonActionListener("."));//给按钮添加事件监听器 59 this.add(jb_point);//添加组件到容器中 60 61 jb_add = new JButton("+"); 62 jb_add.setBounds(150, 250, 50, 50); 63 jb_add.addActionListener(new MyButtonActionListener("+"));//给按钮添加事件监听器 64 this.add(jb_add);//添加组件到容器中 65 66 jb_result = new JButton("="); 67 jb_result.setBounds(150, 320, 50, 50); 68 jb_result.addActionListener(new MyButtonActionListener("="));//给按钮添加事件监听器 69 this.add(jb_result);//添加组件到容器中 70 71 // jl1 = new JLabel("用户名:"); 72 // jl1.setBounds(20, 100, 150, 50); 73 // jl1.setFont(new Font("", Font.BOLD, 20));//给组件设置字体样式 74 // this.add(jl1); 75 76 jtf_username = new JTextField("0"); 77 jtf_username.setBounds(20, 20, 420, 50); 78 jtf_username.setEnabled(false);//不可编辑状态 79 jtf_username.setFont(new Font("", Font.BOLD, 20)); 80 //将文本框的输入右对齐 81 jtf_username.setHorizontalAlignment(JTextField.RIGHT); 82 this.add(jtf_username); 83 84 setVisible(true);//设置框架是否可见 85 } 86 87 class MyButtonActionListener implements ActionListener{ 88 String num; 89 MyButtonActionListener(String num){ 90 this.num = num; 91 } 92 @Override 93 public void actionPerformed(ActionEvent e) { 94 switch(num){ 95 case "1": 96 case "2": 97 case "3": 98 case "4": 99 case "5": 100 case "6": 101 case "7": 102 case "8": 103 case "9": 104 if(jtf_username.getText().equals("0")){ 105 jtf_username.setText(""); 106 } 107 if(isSecond){ 108 jtf_username.setText(""); 109 } 110 jtf_username.setText(jtf_username.getText()+num); 111 isSecond = false; 112 break; 113 case ".": 114 if(jtf_username.getText().indexOf(".")==-1){ 115 jtf_username.setText(jtf_username.getText()+num); 116 } 117 break; 118 case "+": 119 num1 = Double.valueOf(jtf_username.getText());//记录第一个数 120 isSecond = true;//接下来要输入第二个数字 121 type = "+";//记录运算符号 122 break; 123 case "=": 124 num2 = Double.valueOf(jtf_username.getText());//记录第二个数 125 switch(type){ 126 case "+": 127 jtf_username.setText(num1+num2+""); 128 } 129 break; 130 } 131 132 133 } 134 } 135 136 public static void main(String[] args) { 137 new MyFrame(); 138 } 139 }
键盘监听实例:
1 package com.demo1116; 2 3 import java.awt.event.KeyAdapter; 4 import java.awt.event.KeyEvent; 5 import java.awt.event.KeyListener; 6 7 import javax.swing.JFrame; 8 import javax.swing.JLabel; 9 10 public class KeyActionDemo extends JFrame{ 11 JLabel jl; 12 13 public void init(){//初始化界面 14 this.setSize(500, 500); 15 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 this.setLocationRelativeTo(null);//设置窗口初始出现的位置为屏幕中央 17 18 jl = new JLabel(); 19 jl.setBounds(10, 10, 30, 30); 20 this.add(jl); 21 22 this.addKeyListener(new MyKeyListener()); 23 24 this.setVisible(true); 25 } 26 27 public KeyActionDemo() { 28 init(); 29 } 30 31 public static void main(String[] args) { 32 new KeyActionDemo(); 33 } 34 35 /** 36 * 键盘的监听适配器,该类实现类keylistener接口,所以继承该类等于实现了接口,优势是我们可以选择性的重写里面的方法 37 * @author allen 38 * 39 */ 40 class MyKeyListener extends KeyAdapter{ 41 @Override 42 public void keyPressed(KeyEvent e) { 43 jl.setText(e.getKeyCode()+""); 44 } 45 } 46 }
加载图片实例:
1 package com.demo1116; 2 3 4 import java.awt.Graphics; 5 import java.awt.image.BufferedImage; 6 import java.io.File; 7 import java.io.IOException; 8 9 import javax.imageio.ImageIO; 10 import javax.swing.ImageIcon; 11 import javax.swing.JFrame; 12 /** 13 * 加载图片案例 14 * @author allen 15 */ 16 import javax.swing.JLabel; 17 import javax.swing.JPanel; 18 import javax.swing.border.Border; 19 public class PictureDemo extends JFrame{ 20 JLabel jl_pic; 21 private void init() { 22 this.setSize(500, 400);// 设置窗体大小,宽和高 单位是像素 23 this.setResizable(false);// 设置窗体大小固定 24 this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);// 设置窗体关闭时主线程自动关闭 25 this.setLocationRelativeTo(null);// 设置窗体出现的位置在显示器正中 26 this.setLayout(null);// 不使用布局管理器,启用手动布局 27 28 //第一种方式显示图片 29 // jl_pic = new JLabel(new ImageIcon("img/1.jpg")); 30 // jl_pic.setBounds(0, 0, 500, 400); 31 // this.add(jl_pic); 32 //第二种方式显示图片 33 MyPanel mp = new MyPanel(); 34 this.add(mp); 35 this.setVisible(true); 36 } 37 38 public PictureDemo() { 39 init(); 40 } 41 42 public static void main(String[] args) { 43 new PictureDemo(); 44 } 45 } 46 /** 47 * 自定义面板 在面板中可以完成图片的制作 48 * @author allen 49 */ 50 class MyPanel extends JPanel{ 51 public MyPanel() { 52 this.setBounds(0, 0, 500, 400); 53 this.setVisible(true); 54 } 55 56 @Override 57 protected void paintComponent(Graphics g) { 58 // TODO Auto-generated method stub 59 try { 60 //将图片文件读取到java缓存中,备用 61 BufferedImage bi = ImageIO.read(new File("img/1.jpg")); 62 //用画笔工具讲图片画到面板中去 63 g.drawImage(bi, 0, 0, this); 64 } catch (IOException e) { 65 // TODO Auto-generated catch block 66 e.printStackTrace(); 67 } 68 } 69 }