一、 基础部分
public class 类名{}
主函数定义为public static
类中可以定义类的属性和方法
系统会自动生成一个默认的构造函数,若想在生成对象时带参数,则重载构造函数
属性一般定义为 private ,static是为了让属性能直接用类名调用
方法一般定义为public
public类名必须和文件名相同
public class Student {
/* * 无参构造函数 */ public Student(){} /* * 带name的构造函数 */ public Student(String s){name=s;}
/* * 学生的姓名属性 */ private String name; /* * 学生的学分属性 */ private int score; public void print(){ System.out.println(name+"玩的不亦乐乎"); }
|
2. 类与对象的关系
类中定义了具体对象所共有的属性和方法,类可以生成具体的对象
类是一个自定义的类型
public static void main(String args[]){
Student stu = new Student();
stu.print();
}
创建某个类的对象时,格式:类名 变量名 = new 类名()这里的类名()就是构造器方法
重新定义构造器方法就叫构造器方法的重载,代码如下
/* * 无参构造函数 */ public Student(){} /* * 带name的构造函数 */ public Student(String s){name=s;}
|
1. 方法的重载
在一个类中可以定义多个同名,但是参数类型和数量不同的方法叫方法的重载
public class UNstudent extends Student{ /** * 改写父类的study 方法 */ public void study(){ System.out.print("大学生担心挂科"); } } |
2. this关键字
this在类中用来指代当前调用该方法的对象
public loginlistener(JTextField jt1,JPasswordField jt2){ this.jt1 = jt1; this.jt2 = jt2; } |
在构造器中可以调用构造器
1) 构造器方法没有任何返回值的定义
2) 构造器方法是在创建对象的时候自动调用的
二、 画图板工程
///drawFrame//
在窗体上建立:
1.菜单栏JMemubar
//加一个jmenubar javax.swing.JMenuBar bar = new javax.swing.JMenuBar(); this.setJMenuBar(bar);
//加菜单 javax.swing.JMenu jm1 = new javax.swing.JMenu("文件 "); javax.swing.JMenu jm2 = new javax.swing.JMenu("编辑 "); javax.swing.JMenu jm3 = new javax.swing.JMenu("查看 ");
//给菜单条加菜单 bar.add(jm1); bar.add(jm2); bar.add(jm2); |
2.工具面板toolpanel
3.颜色面板 colorpanel
4.中间面板centerpanel
在centerpanel上建立:
5.画板面板drawpanel
//在centerpanel里加一个drawpanel javax.swing.JPanel drawpanel = new javax.swing.JPanel(); centerpanel.add(drawpanel); 是在centerpanel上再加面板drawpanel |
在窗体上设置
6.设置布局管理器
//给centerpanel加布局管理器 java.awt.FlowLayout centerlay = new java.awt.FlowLayout(java.awt.FlowLayout.LEFT); centerpanel.setLayout(centerlay); 布局管理器的建立方法 |
7.设置监听器
在窗体上获取
8.画布
1)画直线
public class Line extends Shape{
Line(int x1,int y1,int x2,int y2,Color color){ this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.color = color; } public void draw(Graphics g) { g.setColor(color); g.drawLine(x1, y1, x2, y2); } 取到形状及颜色 绘出直线 |
2)画矩形
3)画椭圆
4)画圆角矩形
1)如何在两个类中公用一个对象
/** * 如何在两个类中共用同一个对象 * 为了把另一个类中的对象JTxtFild用到另一个类中 就要在该类中设置参数jt1来接收这个对象 * 所以就需要重载构造函数public loginlistener(JTextField jt1,JPasswordField jt2) * 来把这个对象JTxtFild 传进来 * 然后才能在类的方法里用到这个共用的对象 */
|
2)shape多态实现
shape是抽象类 各种形状都继承shape
shape有一个未定义的方法draw
public abstract void draw(java.awt.Graphics g); |
直线类重写draw
public void draw(Graphics g) { g.setColor(color); g.drawLine(x1, y1, x2, y2); } |
在listener里
sh =new Line(x1,y1,x2,y2,color);//创建直线形状 |
//把图形画出来 sh.draw(g); |
用父类的对象调用子类方法是实现了多态
3)重绘队列
首先明确在frame里重绘,而队列是在listener里建立,如何从listener到frame呢?
在frame里实例化队列对象
MyQueue<Shape> shapes= new MyQueue<Shape>(); |
然后通过listener 的构造函数传入 //给画布加鼠标监听器 DrawListener dlis = new DrawListener(g,Group1,Group2,shapes); |
然后在listener里面改变 因为对象是传引用的 所以在listener里改变shapes ,frame里的shapes也会随之改变
最后通过遍历队列
Class MyPanel extends JPanel {
/** * 重写JPanel中用来绘制窗体的方法 */ public void paint(Graphics g) { // 调用父类的方法来正确的绘制窗体 super.paint(g); System.out.println("绘制了"); // 遍历形状队列 for (int i = 0; i < shapes.size(); i++) { // 取出形状 Shape sh = shapes.get(i); // 绘制 sh.draw(g); } } } |
这里为什么要重建一个MyPanel 因为我们获取画布只需要在drawpanel上 而如果直接在frame中重写paint方法,则是在整个窗体上获取画布,浪费资源所以这里drawpanel建立时有一点小技巧
javax.swing.JPanel drawpanel = new MyPanel(); |
4)事件监听机制的理解
/** * 事件监听机制的理解 * 在这个例子中 监听器是放在登录按钮上 * 从安装上监听器开始,监听器始终处于工作状态(即建立好监听器对象) * 知道按下登录按钮 监听器对象开始自动调用方法 实现它的功能 */ |
1) 图片的插入
先将其变成图标建立图标对象 图标->标签->标签加到窗体
javax.swing.ImageIcon icon2 = new javax.swing.ImageIcon("qq2.jpg"); // 把图片插入 JLabel secPic = new JLabel(icon2,JLabel.CENTER); // 错点1:创建图标标签 要传入图标作为参数 jf.add(secPic); // 错点2:left是jlabel的静态变量所以要用类名调用 // 错点3:是要把流式布局管理器左对齐 因为图片在label里
|
2) 设置窗体及各组件大小
/** * 1. Dimension这个类是设置组件的宽度和高度 * setsize是设置窗体jframe的 设置其他组件的size都是用这个类 * 具体实现是 * //先建立一个dimension对象 * Dimension dim = new Dimension(90,20); * //然后在这个组件里有一个方法叫 setPreferredSize 就可以设置组件的大小了 * box.setPreferredSize(dim); * drawpanel.setPreferredSize(new Dimension(500,350)); */ |
3) JMenuBar的问题
/** * 2.错点: 加菜单条JMenuBar上去的时候 * 是加到窗体上 jf.setJMenuBar(bar); * 有专门的语句 而不是加组件的 add */ |
4) loginlistener
public class loginlistener implements java.awt.event.ActionListener{ /* * 定义账号和密码 用来承接 输入的账号和密码 */ private JTextField jt1; private JPasswordField jt2;
/* * 改写他的构造函数 */ public loginlistener(JTextField jt1,JPasswordField jt2){ this.jt1 = jt1; this.jt2 = jt2;
}
/* *实现 ActionListener里的方法 */ public void actionPerformed(ActionEvent e) { /* * 调用文本输入框的gettext函数 来得到 输入的账号和密码 */ String name = jt1.getText(); String pwd = jt2.getText(); /* * 打印账号和密码到java界面上 */ System.out.print("账号:"+name+"\n"+"密码:"+pwd); }
} |
/** * 难点1:监听器里的方法在创建对象的时候就自动调用了 * 难点2:ActionEvent e暂时还没有用到 * 难点3:要获得文本区域输入的文字 就要用文本对象来调用gettext * 难点4:因为txtfild 和 passfild都是login.java里的 所以为了在这里使用只能重载构造函数 * 难点5:这里的jt1 和jt2 分别是 JTextField JPasswordField类型 而非 string类型 * 因为 我们是在 单击这个登录按钮的时候 才将 内容传入并打印出来的 * 若 在构造函数中 直接设成 string类型 则表明 把监听器 安到按钮上去的时候 内容就传进来了 */ |