一。开发架构
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:做一个计算器,完成通用功能
二。例子
计算器+按钮监听实例:
package com.demo1116; import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.plaf.basic.BasicSplitPaneUI.KeyboardUpLeftHandler; public class MyFrame extends JFrame{
double num1;//存放第一个数字
double num2;//存放第二个数字
String type;//记录当前的运算符号
boolean isSecond = false;//记录是否是第二个数字的开始
//按钮
JButton jb1;
JButton jb2;
JButton jb3; JButton jb_point;
JButton jb_add;
JButton jb_result;
//标体
JLabel jl1;
//文本框
JTextField jtf_username;
public MyFrame() {
//设置窗口的关闭模式 关闭窗口立即终止程序
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 500);//设置框架的大小
setLayout(null);//设置布局管理器为null,则表示使用手动布局
setLocationRelativeTo(null);
setTitle("计算器");
//添加其他组件
jb1 = new JButton("1");
jb1.setBounds(20, 100, 50, 50);
jb1.addActionListener(new MyButtonActionListener("1"));//给按钮添加事件监听器
this.add(jb1);//添加组件到容器中 jb2 = new JButton("2");
jb2.setBounds(80, 100, 50, 50);
jb2.addActionListener(new MyButtonActionListener("2"));//给按钮添加事件监听器
this.add(jb2);//添加组件到容器中 jb3 = new JButton("3");
jb3.setBounds(150, 100, 50, 50);
jb3.addActionListener(new MyButtonActionListener("3"));//给按钮添加事件监听器
this.add(jb3);//添加组件到容器中 jb_point = new JButton(".");
jb_point.setBounds(150, 180, 50, 50);
jb_point.addActionListener(new MyButtonActionListener("."));//给按钮添加事件监听器
this.add(jb_point);//添加组件到容器中 jb_add = new JButton("+");
jb_add.setBounds(150, 250, 50, 50);
jb_add.addActionListener(new MyButtonActionListener("+"));//给按钮添加事件监听器
this.add(jb_add);//添加组件到容器中 jb_result = new JButton("=");
jb_result.setBounds(150, 320, 50, 50);
jb_result.addActionListener(new MyButtonActionListener("="));//给按钮添加事件监听器
this.add(jb_result);//添加组件到容器中 // jl1 = new JLabel("用户名:");
// jl1.setBounds(20, 100, 150, 50);
// jl1.setFont(new Font("", Font.BOLD, 20));//给组件设置字体样式
// this.add(jl1); jtf_username = new JTextField("0");
jtf_username.setBounds(20, 20, 420, 50);
jtf_username.setEnabled(false);//不可编辑状态
jtf_username.setFont(new Font("", Font.BOLD, 20));
//将文本框的输入右对齐
jtf_username.setHorizontalAlignment(JTextField.RIGHT);
this.add(jtf_username); setVisible(true);//设置框架是否可见
} class MyButtonActionListener implements ActionListener{
String num;
MyButtonActionListener(String num){
this.num = num;
}
@Override
public void actionPerformed(ActionEvent e) {
switch(num){
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
case "8":
case "9":
if(jtf_username.getText().equals("0")){
jtf_username.setText("");
}
if(isSecond){
jtf_username.setText("");
}
jtf_username.setText(jtf_username.getText()+num);
isSecond = false;
break;
case ".":
if(jtf_username.getText().indexOf(".")==-1){
jtf_username.setText(jtf_username.getText()+num);
}
break;
case "+":
num1 = Double.valueOf(jtf_username.getText());//记录第一个数
isSecond = true;//接下来要输入第二个数字
type = "+";//记录运算符号
break;
case "=":
num2 = Double.valueOf(jtf_username.getText());//记录第二个数
switch(type){
case "+":
jtf_username.setText(num1+num2+"");
}
break;
} }
} public static void main(String[] args) {
new MyFrame();
}
}
键盘监听实例:
package com.demo1116; import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import javax.swing.JFrame;
import javax.swing.JLabel; public class KeyActionDemo extends JFrame{
JLabel jl; public void init(){//初始化界面
this.setSize(500, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);//设置窗口初始出现的位置为屏幕* jl = new JLabel();
jl.setBounds(10, 10, 30, 30);
this.add(jl); this.addKeyListener(new MyKeyListener()); this.setVisible(true);
} public KeyActionDemo() {
init();
} public static void main(String[] args) {
new KeyActionDemo();
} /**
* 键盘的监听适配器,该类实现类keylistener接口,所以继承该类等于实现了接口,优势是我们可以选择性的重写里面的方法
* @author allen
*
*/
class MyKeyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
jl.setText(e.getKeyCode()+"");
}
}
}
加载图片实例:
package com.demo1116; import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
/**
* 加载图片案例
* @author allen
*/
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
public class PictureDemo extends JFrame{
JLabel jl_pic;
private void init() {
this.setSize(500, 400);// 设置窗体大小,宽和高 单位是像素
this.setResizable(false);// 设置窗体大小固定
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);// 设置窗体关闭时主线程自动关闭
this.setLocationRelativeTo(null);// 设置窗体出现的位置在显示器正中
this.setLayout(null);// 不使用布局管理器,启用手动布局 //第一种方式显示图片
// jl_pic = new JLabel(new ImageIcon("img/1.jpg"));
// jl_pic.setBounds(0, 0, 500, 400);
// this.add(jl_pic);
//第二种方式显示图片
MyPanel mp = new MyPanel();
this.add(mp);
this.setVisible(true);
} public PictureDemo() {
init();
} public static void main(String[] args) {
new PictureDemo();
}
}
/**
* 自定义面板 在面板中可以完成图片的制作
* @author allen
*/
class MyPanel extends JPanel{
public MyPanel() {
this.setBounds(0, 0, 500, 400);
this.setVisible(true);
} @Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
try {
//将图片文件读取到java缓存中,备用
BufferedImage bi = ImageIO.read(new File("img/1.jpg"));
//用画笔工具讲图片画到面板中去
g.drawImage(bi, 0, 0, this);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}