Java笔记(二)(寒假)
Java 核心技术笔记
- 一. 接口、继承、多态
- 1. 继承、Object类
- 2. 多态、抽象类、接口
- 二. 类的高级特性
- 三. 异常处理
- 四. Swing程序设计
- 4.1 窗体
- 4.2 标签和图标
- 4.3 布局管理器
- 4.4 面板
- 4.5 按钮组件
- 4.6 列表组件
- 4.7 文本组件
- 4.8 常用事件监听器
- 4.9 Swing应用
一. 接口、继承、多态
1. 继承、Object类
- 使用extends关键字来标识两个类的继承关系
- 继承并不只是扩展父类的功能,还可以重写父类的方法。重写就是在子类中保留父类成员方法的名称,重写成员方法的内容,更改成员方法的存储权限,或是修改权限修饰符。
- 重写父类方法时,修改方法的修饰权限只能由小改大,不能从大变小。例如:private---->public。
- 子类重写父类的方法还可以修改方法的返回值类型。但是重写的返回值类型必须是父类同一方法返回值类型的子类。
- 在实例化子类对象时,父类无参构造方法将被自动调用。有参构造方法不能被自动调用,用户只能使用super关键字来显式的调用父类的构造方法。
- super.关键字和this关键字一样。this关键字指向本类的的对象;super.关键字指向父类中的对象。
- 多重继承
- 子类会覆盖父类的方法和属性
父类
package java_2_04_1;public class Computer
{String screen = "液晶显示屏";void starUp(){System.out.println("正在开机,请稍等········");}void showPicture(){System.out.println("鼠标点击,打开图片");}String sayHello(){// return "欢迎使用";return "welcome";}
}
子类
package java_2_04_1;public class Pad extends Computer //pad继承computer
{String battery = "5000毫安";public Pad(){this.screen = super.screen;//this.screen是继承自父类的属性。}void open5G(){System.out.println("打开5G网络");}void showPicture(){super.showPicture();System.out.println("平板电脑,触摸屏幕,打开图片");}String sayHello(){// return "欢迎使用"+"平板电脑";return super.sayHello()+"平板电脑";//使用super关键字调用父类的sayhello方法}
}
main方法
package java_2_04_1;public class Demo {public static void main(String[] args) {// TODO 自动生成的方法存根Computer father = new Computer();//创建父类对象Pad son = new Pad();//创建子类对象System.out.println("父类显示屏: "+father.screen);//输出父类属性---显示屏father.starUp();//父类方法----开机System.out.println("子类显示屏: "+son.screen);son.starUp();//子类方法----开机System.out.println("子类电池: "+son.battery);son.open5G();//子类方法----5Gson.showPicture();father.showPicture();System.out.println(father.sayHello());System.out.println(son.sayHello());}}
输出结果:
父类显示屏: 液晶显示屏
正在开机,请稍等········
子类显示屏: 液晶显示屏
正在开机,请稍等········
子类电池: 5000毫安
打开5G网络
鼠标点击,打开图片
平板电脑,触摸屏幕,打开图片
鼠标点击,打开图片
welcome
welcome平板电脑
- Object类是所有类的父类
- Object类中有三个常用的方法。
(1)getClass()方法。返回对象执行时的Class实例
(2)toString()方法。将对象返回为字符串形式。
(3)equals()方法。用equals()方法比较两个对象时,等同于“==”,比较的是两个对象的地址,而不是对象内容。这与字符串的equals()方法不一样。 - 类的上下转型
(1)向上转型:把子类对象赋值给父类类型的变量,称为向上转型。隐式转换。即:子类---------->父类。
用父类声明对象,用子类实例化对象。例如:Parents obj = new Child();
和Person tom = new Student():
(2)向下转型:把父类的对象转换为子类的对象,称为向下转型。必须显式转换。即:父类---------->子类。
用父类来声明和实例化对象,在强制转型为子类。例如:Person p = new Person();Child c = (Child)p;
- instanceof()关键字>
(1)作用:判断一个对象是否是一个类的实例化。
(2)语法:obj instanceof ExampleClass
。obj:某个类的实例化对象。ExampleClass:某个类
(3)instanceof操作符返回值为布尔值。例:boolean b = tom instanceof Person;
2. 多态、抽象类、接口
(1)多态
- 同一个变量,同一个方法,执行出不同的结果
package java_2_05;
class Animal
{void move(){}
}
class Fish extends Animal
{void move(){System.out.println("我会游泳");}
}
class Hawk extends Animal
{void move(){System.out.println("我会飞翔");}
}
public class Java_2_05
{public static void main(String[] args){Animal jack = new Animal();//实例化Jack为动物类jack.move();//空方法。jack = new Fish();//重新实例化Jack为鱼类jack.move();//输出“游泳”jack = new Hawk();//重新实例化Jack为老鹰类jack.move();//输出“飞翔”}
}
多态就是,同一个对象Jack,由于实例化的不同,执行不同的结果。
(2)抽象类
- abstract是定义抽象类的关键字。
- 不能创建抽象类的对象。如果要实例化,必须用它的子类来实例化。抽象类必须被继承。
- 抽象方法:只需要声明,不需要实现。用abstract声明的方法。抽象方法必须被抽象类的子类所重写。
- 抽象类被继承后必须实现其中所有的抽象方法。
抽象类
package java_2_05;public abstract class Teacher //抽象类
{abstract public void teaching();//抽象方法,后面直接写分号,不能有大括号。}
class MathTeacher extends Teacher
{@Overridepublic void teaching() {//前面有一个白色的小三角,说明这个方法是被重写的。// TODO 自动生成的方法存根System.out.println("我是数学老师!");}
}
class EnglishTeacher extends Teacher
{@Overridepublic void teaching() {// TODO 自动生成的方法存根System.out.println("我是英语老师!");}}
main方法
package java_2_05;public class Demo {public static void main(String[] args) {// TODO 自动生成的方法存根Teacher lee = new MathTeacher();Teacher tom = new EnglishTeacher();lee.teaching();tom.teaching();}}
(3)接口
- 接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中所有方法都没有方法体。
- 接口使用
interface
关键字声明。
(1)语法:public interface Test{void draw();}
(2)在接口中,方法必须被定义为public或abstract形式。
(3)接口的方法省略abstract关键字 - 类实现接口,使用
implements
关键字,一个类可以实现多个接口。 - 语法:class 类名 implements 接口1,接口2,接口3···
二. 类的高级特性
(1)类包
- 自己写的类可以覆盖掉API中的类。
- 导入类:
import java.lang.Math;
,“java.lang”是包名,“Math”是类名。 import java.util.*;
,这个星号表示导入“java.util”下所有的类。- 如果导入两个不同包下同名的类,实例化时需要使用完整类名。例:
java.util.Date = new java.util.Date();
- import也可以导入静态成员。语法:import static 静态成员。导入静态成员可以使编程更方便。例:
import static java.lang.System.out;
。在后面可以直接使用out.println();
。
(2)final
- final关键字用于变量声明。可以将变量(一般用大写)声明为常量。常量就是不允许被再修改的量。final关键字定义的变量必须在声明时就对其赋值。例:
final double PI = 3.14;
。 - final修饰类时,这个类不能被继承。语法:
final 类名{}
,如果类时final时,其中的所有方法都被隐式的定义为final。 - 修饰方法时,这个方法不能被重写。将方法定义为final类型,可以防止子类重写这个方法。
(3)内部类
内部类:如果在类中再定义一个类,则再类中的那个类被称为内部类。
- 成员内部类
(1)在内部类中可以随意使用外部类的成员方法和成员变量。但内部类的成员只在内部类的范围之内是可知的。
(2)内部类的实例化一定要绑定在外部类的实例上。即:Demo.innerClass in = d.new innerClass(1);
(3)成员内部类语法:
public class OuterClass{//外部类public class InnerClass{//内部类//```}}
package java_2_06;public class Demo
{innerClass obj = new innerClass(1);//调用内部类的方法,必须先创建一个内部类对象public void outf() //外部类方法{obj.inf();//调用内部类的方法}class innerClass//成员内部类{int a;public innerClass(int a){this.a = a;}public void inf()//内部类方法{System.out.println("内部类方法");}}public static void main(String[] args) {Demo d = new Demo();//定义外部类d.outf();Demo.innerClass in = d.new innerClass(1);//实例化内部类in.inf();}
}
- 局部内部类
(1)局部内部类被定义在方法体中。
三. 异常处理
- 什么是异常?程序运行是可能出现的错误都是异常。
- 异常的分类:
(1)Error:描述java运行系统中的内部错误及资源耗尽的错误。无法解决。
(2)Exception:非致命性错误,可以捕捉处理,使程序继续运行。
(3)RuntimeException:运行时错误。比如:空指针,数组下标越界等。 - 捕捉异常
(1)java捕捉异常捕获结构由try、catch、finally三部分组成。try语句存放可能发生异常的语句;catch语句在try语句之后,用来激发被捕获的异常;finally语句放在最后,无论try语句如何结束,finally语句块都会执行。
(2)当try语句块中发生异常时,程序会调转到catch代码块中执行,执行完catch代码块中的语句后,将继续执行catch后面的语句,但不会执行try代码块中发生异常的语句之后的部分。当try代码块中没有发生异常时,就不会执行catch代码块中的内容。
(3)可以在循环内部写try语句。
(4)语法:
try {语句1;语句2;
}
catch(some Exception1 e)//也可接多重catch语句
{```}
finally
{```//最后一定会执行}
package java_2_06;public class Java_2_06 {public static void main(String[] args) {try//放可能发生异常的代码{String s1 = "12";System.out.println("Hello");int age = Integer.parseInt("20L");System.out.println(age);}catch(Exception e){e.printStackTrace();System.out.println("这是catch语句");}finally{System.out.println("这是finally语句");}}
}
输出结果:
catch(Exception e)
,Exception是try代码块传给catch代码块的变量类型,e是变量名。如果有多个catch语句,如果有一个执行了,则下面的catch语句块不会被执行。- 异常处理常用三个函数来获取异常信息:
函数 | 说明 |
---|---|
e.getMessage(); | 输出错误性质 |
e.toString(); | 给出异常的类型和性质 |
e.printStackTrace(); | 指出异常的类型、性质,栈层次以及出现在程序中的位置 |
finally语句块在以下四种特殊情况会不执行:
(1)在finally语句块中发生了异常。
(2)在前面的代码中用System.exit();退出了程序。
(3)程序所在线程死亡。
(4)关闭CPU。常见异常:
异常 | 说明 |
---|---|
ClassCastException | 类转型异常 |
ClassNotFoundException | 未找到相应的类异常 |
ArithmeticException | 算术异常 |
ArrayIndexOutOdBoundsException | 数组下标越界异常 |
NullPointerException | 空指针异常 |
SQLException | 操作数据库异常 |
IOException | 出入输出异常 |
EOFException | 文件已结束异常 |
FileNotFoundException | 文件未找到异常 |
- 自定义异常
(1)自己创建一个API中不存在的异常。用这个异常来处理我们遇到的异常。 - 自定义异常步骤:
(1)创建自定义异常。public class MyException extends Exception
(2)在方法中通过throw关键字抛出异常。throw new MyException("不可以使用负数");
(3)如果在当前抛出异常的方法中处理异常,可以用try-catch语句捕获,否则在方法声明处通过throws关键字指明要把异常抛出给方法的调用者。将异常交给别人来处理。static int avg(int a,int b)throws MyException
(4)在方法的调用者中捕获并处理异常。
public class MyException extends Exception
{public MyException(String message){super(message);}
}
package java_2_07;public class Java_2_07
{static int avg(int a,int b)throws MyException//使用throws关键字将发生的异常{ //抛出到主函数中。int num;if(a<0||b<0){throw new MyException("不可以使用负数");}else if(a>100||b>100){throw new MyException("数值太大");}else{num = a+b/2;}return num;}public static void main(String[] args){try{int result = avg(103,10);System.out.println(result);}catch(MyException e){System.out.println(e);}finally{System.out.println("程序结束");}}
}
- 使用throws关键字抛出异常。将异常抛出给上一级,但最终要有能够处理该异常的代码。
- 使用throw关键字抛出异常
(1)throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句不会被执行。语法:throw new MyException("数值太大");
(2)通过throw抛出异常后,如果想在上一级代码中捕获并处理这个异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常。static int avg(int a,int b)throws MyException
(3)如果要捕获并处理throw抛出的异常,则必须用try-catch语句。
四. Swing程序设计
4.1 窗体
GUI是指图形用户界面,为程序提供图形界面。
- Swing包中的类可以用来开发图形用户界面程序,即:桌面程序。
- Swing常用组件:
组件 | 定义 |
---|---|
JButton | 按钮,可以带一些图片和文字 |
JRadioButton | 单选按钮 |
JCheckBox | 多选按钮 |
JComBox | 下拉列表框 |
JDialog | 对话框 |
JTextField | 文本框 |
JPasswordField | 密码框 |
- 窗体作为Swing应用程序中组件的承载体,处于非常重要的位置。Swing中常用的窗体包括JFrame和JDialog。
- JFrame窗体是一个容器,它是Swing程序中各个组件的载体。它拥有“最大化”、“最小化”、“关闭”等按钮。
- 如何创建一个JFrame窗体:
(1)让一个类继承JFrame,让这个类成为一个窗体。public class Demo1 extends JFrame
。
(2)在这个类的构造方法中对其初始化。public Demo1(String title)
(3)设置窗体的内容,如:窗体标题、大小,坐标、关闭方式等
(4)获将窗体转换为容器。Container c = getContentPane();
。
(5)设置容器背景颜色,然后在容器中添加或删除组件。c.add(jl);
。
package java_2_07_1;import javax.swing.*;
import java.awt.*;
public class Demo1 extends JFrame//让demo类成为一个窗体
{public Demo1(String title)//构造方法,对Demo作初始化{// JFrame jf = new JFrame(title);//实例化一个JFrame对象,title是窗体标题。创建窗体。/** 因为Demo本身就是一个窗体,就不需要再创建窗体*/setTitle(title);//设置窗体标题JLabel jl = new JLabel("这是一个JFrame窗体");//创建一个JLabel标签jl.setHorizontalAlignment(SwingConstants.CENTER);//是标签上的文字居中setResizable(false);//设置窗体是否可以改变大小,也不能最大化
// jf.setSize(500, 450);//设置窗体大小
// jf.setLocation(200, 200);//窗体显示坐标,左上角的点setBounds(200, 200, 500, 450);//上面两行代码合二为一,前两个是坐标,后两个是窗体大小int x = getX();//获取坐标int y = getY();System.out.println("x坐标:"+x+" y坐标:"+y);/** EXIT_ON_CLOSE:隐藏窗体并停止程序* DO_NOTHING_ON_CLOSE:无任何操作* HIDE_ON_CLOSE:隐藏窗体但不停止程序* DISPOSE_ON_CLOSE:释放窗体资源,过一段时间在停掉程序。*/setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭方式。Container c = getContentPane();//获取窗体一个容器c.setBackground(Color.white);//设置容器背景颜色 c.add(jl);//将标签添加到容器中。add方法可以在容器中添加组件
// c.remove(jl);//删除组件c.validate();//刷新。验证容器中的组件使容器可以重新布置组件setVisible(true);//使窗体可视}public static void main(String[] args) {// new Demo1("窗体");//我的理解是,这里只是创建对象,并没有让一个对象指向它Demo1 D = new Demo1("窗体");}
}
- JDialog窗体,它是swing组件中的对话框。它的功能是从一个窗体中弹出另外一个窗体。实质上就是另外一种类型的窗体,与JFrame窗体类似,在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体属性。
- 如何创建一个JDialog对话框窗体:
(1)让一个类继承JDialog类。public class Demo3 extends JDialog
。
(2)在构造方法中对这个对话框窗体进行设置:大小等属性。然后将其转换为容器。
(3)创建父窗体并设置属性。
(4)创建按钮,设置按钮坐标,大小。
(5)在按钮中添加动作监听。btu.addActionListener(new ActionListener() {```按按钮之后会执行的操作});
。
(6)在父窗体中添加按钮。c.add(btu);//添加按钮
。
package java_2_07_1;import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.*;public class Demo3 extends JDialog
{public Demo3(JFrame jf)//构造方法{//第一个参数是父窗体,第二个是对话框标题,第三个布尔值,是否阻塞父窗体super(jf,"对话框标题",true);//调用父类构造方法。setBounds(300,100,200,200);//设置对话框窗体坐标,大小。setResizable(false);//设置窗体是否可以改变大小,也不能最大化Container c = getContentPane();//获取窗体容器JLabel jl = new JLabel("这是一个对话框");//创建一个JLabel标签jl.setHorizontalAlignment(SwingConstants.CENTER);//是标签上的文字居中c.add(jl);}public static void main(String[] args){JFrame f = new JFrame("父窗体");f.setBounds(50, 50,700, 650);f.setVisible(true);//使父窗体可见f.setDefaultCloseOperation(EXIT_ON_CLOSE);Container c = f.getContentPane();//获取父窗体容器JButton btu = new JButton("按钮");//创建一个按钮btu.setBounds(260,60,60,20);//设置按钮相对于父窗体的位置和大小c.setLayout(new FlowLayout());//设置布局,使用流布局。btu.addActionListener(new ActionListener()//匿名内部类{public void actionPerformed(ActionEvent e) //按按钮之后会运行的方法{Demo3 d = new Demo3(f);d.setVisible(true);//使对话框可见} });//添加动作监听c.add(btu);//添加按钮}
}
4.2 标签和图标
- 标签的使用:
package java_2_07_1;import java.awt.*;import javax.swing.*;public class Demo4 extends JFrame
{public Demo4(){setBounds(100,100,500,450);//设置窗体坐标,大小setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗体关闭方式setVisible(true);//使窗体可见Container c = getContentPane();//将窗体转换为容器。JLabel jl = new JLabel("这是一个标签");//实例化一个标签对象/** Font有三个参数* 一:字体* 二:样式,比如加粗,Font.BOLD* 三:大小*/jl.setFont(new Font("微软雅黑",Font.BOLD,15));//Font有三个参数jl.setForeground(Color.red);//更改字体颜色,可以更改标签前景色jl.setHorizontalAlignment(SwingConstants.CENTER);//是标签上的文字居中
// jl.setText("更改");//更改标签内容System.out.println(jl.getText());//获取标签内容c.add(jl);}public static void main(String[] args) {Demo4 d = new Demo4();}
}
- 在窗体中添加图片
package java_2_08;import javax.*;
import javax.swing.*;
import java.awt.*;
import java.net.URL;public class Demo extends JFrame
{public Demo(){setBounds(200,200,1000,450);//设置窗体坐标,大小setDefaultCloseOperation(EXIT_ON_CLOSE);//窗体关闭方式Container c = getContentPane();//将窗体转换为容器。JLabel jl = new JLabel("这是一个展示图片的标签");jl.setSize(20, 20);//即使设置标签大小,也不能改变照片大小jl.setOpaque(true);//设置标签为不透明状态URL url = Demo.class.getResource("2.png");//获取图片地址Icon icon = new ImageIcon(url);//获取相应路径下的图片文件jl.setIcon(icon);//添加图片;c.add(jl);//将标签添加到容器中setVisible(true);//这句应该放在最后,使上面所有操作都可见。}public static void main(String[] args) {Demo d = new Demo(); }
}
4.3 布局管理器
- 在Swing中,每个组件在容器中都有一个具体的位置和大小,而在容器中摆放各种组件时很难判断其具体位置和大小。所以有了布局管理器。布局管理器提供了Swing组件安排,展示在容器中的方法和基本布局功能。
- 常用的布局管理器包括:流布局管理器、边界布局管理器、网格布局管理器。
- 绝对布局(null布局):
(1)绝对布局就是硬性指定组件在容器中的位置和大小。
(2)使用c.setLayout(null)方法取消布局管理器。再使用setBounds()方法设置每个组件的大小和坐标。 - 流布局(FlowLayout):
(1)从左到右,默认居中对齐。
(2)c.setLayout(new FlowLayout(1,10,10));
第一个参数是对齐方式,后面两个是水平和竖直间距;0:左对齐。1:居中对齐。2:右对齐。
package java_2_08;import javax.swing.*;
import java.awt.*;public class Demo1 extends JFrame
{public Demo1(){setBounds(200,200,300,300);//设置窗体坐标,大小setDefaultCloseOperation(EXIT_ON_CLOSE);//窗体关闭方式Container c = getContentPane();c.setLayout(new FlowLayout(1,10,10));//0:左对齐。1:居中对齐。2:右对齐。10:水平和竖直间距for(int i=0;i<10;i++){c.add(new JButton("按钮"+i));}setVisible(true);}public static void main(String[] args){Demo1 d = new Demo1();}
}
- 边界布局(BorderLayout):
(1)窗体默认的布局方式,它将窗体分为东、南、西、北、中,五个区域。
(2)添加组件时要指定区域,否则会默认添加到中间并拉伸。
(3)同一个区域的组件会相互覆盖。
(4)c.setLayout(new BorderLayout());
设置为边界布局
(5)c.add(b1,BorderLayout.EAST);
第一个参数是组件,第二个是添加部位。
成员变量 | 含义 |
---|---|
BorderLayout.NORTH | 置于顶端 |
BorderLayout.SOUTH | 置于底端 |
BorderLayout.EAST | 置于右端 |
BorderLayout.WEST | 置于置于左端 |
BorderLayout.CENTER | 从中间开始填充,直到和其他组件相接 |
- 网格布局(GridLayout):
(1)语法:c.setLayout(new GridLayout(int rows,int columns,int horizaGap,int vertGap));
(2)rows:行数。columns:列数。horizaGap:水平间距。vertGap:竖直间距。 - 网格组布局管理器(GridBagLayout):
属性 | 说明 |
---|---|
gridx、gridy | 组件所在的位置 |
gridwidth、gridheight | 组件所占用的行数和列数 |
anchor | 组件所在方位 |
fill | 组件填充方式 |
insets | 组件与单元格边缘的最小距离 |
ipadx、iPady | 组件的首选大小 |
weightx、weighty | 一个单元格的最大宽高 |
package java_2_08;import java.awt.*;import javax.swing.*;public class Demo2
{JFrame f = new JFrame();//主窗体Container c;//主容器void creatFrame(){c=f.getContentPane();c.setLayout(new GridBagLayout());//获取容器f.setSize(800, 600);//大小f.setLocationRelativeTo(null);//使窗体居中显示f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}void init(){GridBagConstraints g1 = new GridBagConstraints();g1.gridx=1;//组件的行列索引g1.gridy=1;g1.gridheight=1;g1.gridwidth=1;g1.insets=new Insets(19,5,5,10);g1.weightx=10;g1.weighty=10;c.add(new JButton("none"),g1);GridBagConstraints g2 = new GridBagConstraints();g2.gridx=4;g2.gridy=4;g2.gridheight=2;g2.gridwidth=2;//组件的长和宽g2.fill=GridBagConstraints.HORIZONTAL;//填充属性c.add(new JButton("HORIZONTAL"),g2);GridBagConstraints g3 = new GridBagConstraints();g3.gridx=6;g3.gridy=6;g3.gridheight=2;g3.gridwidth=2;g3.fill=GridBagConstraints.VERTICAL;c.add(new JButton("VERTICAL"),g3);GridBagConstraints g4 = new GridBagConstraints();g4.gridx=8;g4.gridy=8;g4.gridheight=2;g4.gridwidth=2;g4.fill=GridBagConstraints.BOTH;c.add(new JButton("BOTH"),g4);}
// void init2()
// {// GridBagConstraints g1 = new GridBagConstraints();
// g1.gridx=1;//组件的行列索引
// g1.gridy=1;
// g1.gridheight=2;
// g1.gridwidth=2;
// g1.anchor=GridBagConstraints.NORTH;
// c.add(new JButton("."),g1);
//
// }void creatButton(){for(int i=0;i<10;i++){GridBagConstraints g1 = new GridBagConstraints();g1.gridx=i;//组件的行列索引g1.gridy=0;c.add(new JButton("组件"+i),g1);GridBagConstraints g2 = new GridBagConstraints();g2.gridx=0;//组件的行列索引g2.gridy=i;c.add(new JButton("组件"+i),g2);}}public static void main(String[] args) {Demo2 d = new Demo2();d.creatFrame();d.creatButton();d.init();d.f.setVisible(true);}}
输出:
4.4 面板
- 面板也是一个Swing容器,它可以作为容器容纳其他组件,但它必须被添加到其他容器中。常用面板包括:JPenal面板和JScrollPane面板。面板只能放在窗体中使用。
- 容器之间互不干扰
- JPanel面板:
package java_2_08;import java.awt.*;import javax.swing.*;public class Demo3 extends JFrame
{public Demo3(){setBounds(200,200,500,300);setDefaultCloseOperation(EXIT_ON_CLOSE);Container c = getContentPane();c.setLayout(new GridLayout(2,2,10,10));JPanel p1 = new JPanel();p1.setLayout(new GridLayout(1,3,10,10));//给面板添加布局JPanel p2 = new JPanel(new BorderLayout());//给面板添加边界布局JPanel p3 = new JPanel(new GridLayout(1,2,10,10));JPanel p4 = new JPanel(new GridLayout(2,1,10,10));/** 给面板添加边框*/p1.setBorder(BorderFactory.createTitledBorder("面板一"));//添加标题边框p2.setBorder(BorderFactory.createTitledBorder("面板二"));//添加标题边框p3.setBorder(BorderFactory.createTitledBorder("面板三"));//添加标题边框p4.setBorder(BorderFactory.createTitledBorder("面板四"));//添加标题边框、/** 在面板中添加组件*/p1.add(new JButton("p1"));//在面板中添加按钮p1.add(new JButton("p1"));//在面板中添加按钮p1.add(new JButton("p1"));//在面板中添加按钮p1.add(new JButton("p1"));//在面板中添加按钮p2.add(new JButton("p1"),BorderLayout.CENTER);//在面板2中添加按钮,在中间p2.add(new JButton("p1"),BorderLayout.EAST);p2.add(new JButton("p1"),BorderLayout.WEST);p2.add(new JButton("p1"),BorderLayout.SOUTH);p2.add(new JButton("p1"),BorderLayout.NORTH);p3.add(new JButton("p3"));p3.add(new JButton("p3"));p4.add(new JButton("p4"));p4.add(new JButton("p4"));p4.setBackground(Color.yellow);c.add(p1);c.add(p2);c.add(p3);c.add(p4);setVisible(true);}public static void main(String[] args) {Demo3 d = new Demo3();}
}
输出效果:
- JScrollPane面板(滚动面板):
(1)JScrollPane面板是一个带滚动条的面板,它也是一个容器,但是它只能放一个组件,并且不能使用布局管理器,如果需要在JScrollPane面板上放置多个组件,需要将多个组件放置在JPanel面板上,再降JPanel面板作为一个整体添加到JScrollPane面板上。
(2)
package java_2_08;import java.awt.*;import javax.swing.*;public class Demo4 extends JFrame
{public Demo4(){setBounds(200,200,500,300);Container c = getContentPane();JTextArea a = new JTextArea(100,100);//文本编辑域JScrollPane sp = new JScrollPane(a);//创建滚动面板,给文本区域添加滚动条c.add(sp);//给容器添加滚动面板setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);}public static void main(String[] args) {Demo4 d = new Demo4();}
}
输出效果:
4.5 按钮组件
- 提交按钮组件:
package java_2_08;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;import javax.swing.*;
public class Demo5 extends JFrame
{public Demo5(){setBounds(200,200,500,400);setDefaultCloseOperation(EXIT_ON_CLOSE);Container c =getContentPane();c.setLayout(new GridLayout(3,2,5,5));//网格布局,三行两列,水平间距竖直间距JButton btn[] = new JButton[6];//创建按钮组for (int i=0;i<btn.length;i++){btn[i]=new JButton();//实例化按钮c.add(btn[i]);//将按钮加入容器}btn[0].setText("不可用");//设置按钮文本btn[0].setEnabled(false);//设置组件不可用;btn[1].setText("有背景色");btn[1].setBackground(Color.yellow);//设置按钮颜色btn[2].setText("无边框");btn[2].setBorderPainted(false);//不显示边框btn[3].setText("有边框");btn[3].setBorder(BorderFactory.createLineBorder(Color.red));//设置线边框URL url = Demo.class.getResource("2.png");//获取图片地址Icon icon = new ImageIcon(url);//获取相应路径下的图片文件btn[4].setIcon(icon);//给按钮设置图片btn[4].setToolTipText("图片按钮");//鼠标悬停提示btn[5].setText("可点击");btn[5].addActionListener(new ActionListener() {//添加事件监听public void actionPerformed(ActionEvent e) //监听触发方法{JOptionPane.showMessageDialog(Demo5.this, "这是一个对话框");//弹出一个小对话框}});setVisible(true);}public static void main(String[] args){Demo5 d = new Demo5();}}
输出效果:
- 单选按钮组件(JRadioButton):
(1)在默认情况下,单选按钮显示一个圆形图标,并且通常在该图标旁放置一些说明文字。
package java_2_08;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;import javax.swing.*;
public class Demo5 extends JFrame
{public Demo5(){setBounds(200,200,500,400);setDefaultCloseOperation(EXIT_ON_CLOSE);Container c =getContentPane();c.setLayout(new FlowLayout());//设置窗体布局,流布局JRadioButton left = new JRadioButton("向左走");//创建按钮JRadioButton right = new JRadioButton("向右走");ButtonGroup group = new ButtonGroup();//按钮组group.add(left);//将单选按钮放在按钮组中,group.add(right);//当一个按钮选中后,会自动关闭另外一个按钮left.setSelected(true);//默认选中left按钮JButton btn = new JButton("打印");btn.addActionListener(new ActionListener() {//设置事件监听public void actionPerformed(ActionEvent e) {System.out.println(left.getText()+"按钮的选中方法"+left.isSelected());System.out.println(right.getText()+"按钮的选中方法"+right.isSelected());group.clearSelection();//清空按钮组选项}});c.add(left);c.add(right);c.add(btn);setVisible(true);}public static void main(String[] args){Demo5 d = new Demo5();}}
输出效果:
- 多选框(JCheckBox):
package java_2_08;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;import javax.swing.*;
public class Demo5 extends JFrame
{public Demo5(){setBounds(200,200,500,400);//创建窗体setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗体关闭方式Container c =getContentPane();//将窗体转换成一个容器c.setLayout(new BorderLayout());//设置窗体布局,为边界布局JPanel p1 = new JPanel();//创建面板P1p1.setLayout(new FlowLayout());//设置面板p1布局方式JPanel p2 = new JPanel();//创建面板P2JTextArea a = new JTextArea(7,15);//文本编辑域JScrollPane sp = new JScrollPane(a);//创建滚动面板,给文本区域添加滚动条p2.setLayout(new FlowLayout());//设置面板p2布局方式p2.add(sp);//在面板p2中添加文本编辑区JPanel p3 = new JPanel();//创建面板P3JTextArea a3 = new JTextArea(7,10);//文本编辑域JScrollPane sp3 = new JScrollPane(a3);//创建滚动面板,给文本区域添加滚动条p3.setLayout(new FlowLayout());//设置面板p3布局方式JLabel jl3 = new JLabel("交流区");//设置标签jl3.setFont(new Font("楷体",Font.BOLD,15));//Font有三个参数jl3.setForeground(Color.black);//更改字体颜色,可以更改标签前景色jl3.setHorizontalAlignment(SwingConstants.CENTER);//是标签上的文字居中p3.add(jl3);//在面板3中添加标签p3.add(sp3);//在面板3中添加文本编辑区JPanel p4 = new JPanel();//创建面板P4JTextArea a4 = new JTextArea(7,10);//文本编辑域JScrollPane sp4 = new JScrollPane(a4);//创建滚动面板,给文本区域添加滚动条p4.setLayout(new FlowLayout());//设置面板p4布局方式JLabel jl4 = new JLabel("交流区");jl4.setFont(new Font("楷体",Font.BOLD,15));//Font有三个参数jl4.setForeground(Color.black);//更改字体颜色,可以更改标签前景色jl4.setHorizontalAlignment(SwingConstants.CENTER);//是标签上的文字居中p4.add(jl4);p4.add(sp4);JCheckBox c1 = new JCheckBox();//设置多选按钮JCheckBox c2 = new JCheckBox();JCheckBox c3 = new JCheckBox();URL url1 = Demo5.class.getResource("4.png");//获取图片地址Icon icon1 = new ImageIcon(url1);//获取相应路径下的图片文件c1.setIcon(icon1);//给按钮设置图片c1.setToolTipText("打野英雄,李白");//鼠标悬停提示URL url2 = Demo5.class.getResource("5.png");//获取图片地址Icon icon2 = new ImageIcon(url2);//获取相应路径下的图片文件c2.setIcon(icon2);//给按钮设置图片c2.setToolTipText("射手一姐,孙尚香");//鼠标悬停提示URL url3 = Demo5.class.getResource("6.png");//获取图片地址Icon icon3 = new ImageIcon(url3);//获取相应路径下的图片文件c3.setIcon(icon3);//给按钮设置图片c3.setToolTipText("偷野王子,韩信");//鼠标悬停提示p1.add(c1);//在面板p1中添加多选按钮p1.add(c2);p1.add(c3);c1.addActionListener(new ActionListener() {//给选项1按钮设置事件监听public void actionPerformed(ActionEvent e) //事件触发:{a.append("我方选择打野英雄,李白\n");}});c2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {a.append("我方选择射手英雄,孙尚香\n");}});c3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {a.append("我方选择打野英雄,韩信\n");}});
// c1.setSelected(true);//默认选中c.add(p1,BorderLayout.SOUTH);//将面板添加到窗体中c.add(p2,BorderLayout.NORTH);c.add(p3,BorderLayout.WEST);c.add(p4,BorderLayout.EAST);setVisible(true);}public static void main(String[] args){Demo5 d = new Demo5();}}
输出效果:
4.6 列表组件
- Swing提供两种列表组件,分别是下拉列表框和列表框。
(1)下拉列表框(JCombBox)
package java_2_09;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Demo extends JFrame
{public Demo(){setBounds(200,200,500,450);//设置窗体setDefaultCloseOperation(EXIT_ON_CLOSE);Container c = getContentPane();c.setLayout(null);//容器的布局方式为绝对布局//在下拉列表添加数据----第一种方式
// JComboBox<String> com = new JComboBox<>();
// com.addItem("身份证");//添加数据
// com.addItem("学生证");
// com.addItem("工作证");
// com.setBounds(100,100,80,21);//下拉列表在坐标,长和宽 //在下拉列表添加数据----第二种方式
// String items[] = {"身份证","学生证","工作证"};//需要添加的数据
// JComboBox<String> com = new JComboBox<>(items);//使用字符串数组添加元素
// com.setBounds(100,100,80,21);//下拉列表在坐标,长和宽//在下拉列表添加数据----第三种方式JComboBox<String> com = new JComboBox<>(); //实例化下拉列表对象String items[] = {"身份证","学生证","工作证"};ComboBoxModel cm = new DefaultComboBoxModel<>(items);//创建下拉列表模型,com.setModel(cm);//向列表中添加模型 com.setBounds(100,100,80,21);//下拉列表在坐标,长和宽com.setEditable(true);//下拉列表是否可以编辑JButton btn = new JButton("打印");btn.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {System.out.println("选中索引:"+com.getSelectedIndex());//获取选中索引System.out.println("选中的值:"+com.getSelectedItem());//获取选中的值}});btn.setBounds(100,60,70,30);c.add(btn);c.add(com);setVisible(true);//使窗体可见}public static void main(String[] args) {Demo d = new Demo(); }
}
(2)列表框(Jlist)
package java_2_09;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Demo extends JFrame
{public Demo(){setBounds(200,200,500,450);//设置窗体setDefaultCloseOperation(EXIT_ON_CLOSE);Container c = getContentPane();c.setLayout(null);//容器的布局方式为绝对布局//方法一String items[] = {"元素1","元素2","元素3","元素4","元素5","元素6"};
// JList<String> jl = new JList<>(items);//方法二:使用模型的优点:可以随时添加元素DefaultListModel<String> model = new DefaultListModel<>();//列表框数据模型for(String s1:items){model.addElement(s1);//向数据模型添加元素}JList<String> jl = new JList<>(items);model.addElement("身份证");//随时给数据模型添加元素/** SINGLE_SELECTION:单选模式* MULTIPLE_INTERVAL_SELECTION:随便选择,不限定模式* SINGLE_INTERVAL_SELECTION:只能选择连续相邻的*/jl.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);//现在模式jl.setModel(model);JScrollPane p1 = new JScrollPane(jl);//添加滚动条面板p1.setBounds(10, 10, 100, 100);//不需要给列表框坐标和大小,直接给滚动面板。c.add(p1);JButton btn = new JButton("确认");btn.setBounds(150,60,70,30);btn.addActionListener(new ActionListener() {//添加事件监听public void actionPerformed(ActionEvent arg0) {//获取列表框中选定的所有元素java.util.List<String> va = jl.getSelectedValuesList();for(String s1:va){System.out.println(s1);}System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");}});c.add(btn);setVisible(true);//使窗体可见}public static void main(String[] args) {Demo d = new Demo();}
}
输出效果:
4.7 文本组件
(1)文本框组件(JTextField):用来显式或编辑一个单行文本
package java_2_09;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Demo extends JFrame
{public Demo(){setBounds(200,200,500,450);//设置窗体setDefaultCloseOperation(EXIT_ON_CLOSE);Container c = getContentPane();c.setLayout(new FlowLayout());//容器的布局方式为JTextField jt = new JTextField();//创建一个文本框jt.setText("初始文本");//设置初始文本jt.setFont(new Font("黑体",Font.PLAIN,20));//设置字体格式,第二个是字体样式,然后字体大小jt.setColumns(30);//设置文本框长度c.add(jt);JButton btn = new JButton("确认");btn.addActionListener(new ActionListener() {//添加事监听public void actionPerformed(ActionEvent e) {System.out.println("文本框的值:"+jt.getText());jt.setText("");//清空文本框jt.requestFocus();//获取光标}});c.add(btn);setVisible(true);//使窗体可见}public static void main(String[] args) {Demo d = new Demo();}
}
(2)密码框组件(JPasswordField):
package java_2_09;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Demo extends JFrame
{public Demo(){setBounds(200,200,500,450);//设置窗体setDefaultCloseOperation(EXIT_ON_CLOSE);Container c = getContentPane();c.setLayout(new FlowLayout());//容器的布局方式为JPasswordField jp = new JPasswordField();jp.setEchoChar('*');jp.setColumns(20);//密码框宽度jp.setFont(new Font("Arial",Font.BOLD,20));//设置字体格式,第二个是字体样式-加粗,然后字体大小jp.addActionListener(new ActionListener() {//给密码框添加一个动作监听public void actionPerformed(ActionEvent e)//回车监听{char ch[] = jp.getPassword();//获取密码的字符数组String s1 = new String(ch);//将字符数组改为字符串System.out.println(s1);//在控制台输出密码字符串}});c.add(jp);setVisible(true);//使窗体可见}public static void main(String[] args) {Demo d = new Demo();}}
(3)文本域组件(JTextArea):接受多行文字输入
package java_2_09;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Demo extends JFrame
{public Demo(){setBounds(200,200,400,350);//设置窗体setTitle("自动换行文本域");setDefaultCloseOperation(EXIT_ON_CLOSE);Container c = getContentPane();c.setLayout(new FlowLayout());//容器的布局方式为JTextArea jt = new JTextArea();jt.setText("这是一个文本域,");jt.setFont(new Font("楷体",Font.PLAIN,20));//字体格式jt.setRows(5);//设定文本域可以有多少行jt.setColumns(20);//设定框,列数jt.append("添加内容");//添加内容jt.insert("(插入)", 2);JScrollPane js = new JScrollPane(jt);//给文本添加滚动条jt.setLineWrap(true);//是否可以自动换行c.add(js);setVisible(true);//使窗体可见}public static void main(String[] args) {Demo d = new Demo();·}
}
4.8 常用事件监听器
(1)监听事件简介:
- 监听(Listener):盯着事件,如果事件发生,则立即被监听到。
- 事件(Event):鼠标事件,窗体事件,键盘事件等。
(2)动作事件监听(ActionEvent):
JLabel jl = new JLabel("点击组件");JButton btn = new JButton("确认");btn.addActionListener(new ActionListener(){//添加事监听/** ActionEvent:动作事件的类,获得事件是由哪个组件触发* */public void actionPerformed(ActionEvent e) {jl.setText("按钮被点击");}});
事件 | 事件源 | 监听接口 | 方法 |
---|---|---|---|
ActionEvent | JButton、JList、JTextField | ActionListener | addActionListener()、removeActionListener() |
(3)焦点事件监听(FocusEvent):
- 组件.addFocusListener(); FocusEvent 焦点事件
package java_2_09;import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;public class Demo extends JFrame
{public Demo(){setBounds(200,200,400,350);//设置窗体setTitle("自动换行文本域");setDefaultCloseOperation(EXIT_ON_CLOSE);Container c = getContentPane();c.setLayout(new FlowLayout());//容器的布局方式为JButton btn = new JButton("确认");JLabel jl = new JLabel("初始状态");//标签JTextField jt = new JTextField();//文本框jt.setColumns(20);//文本框宽度//就不需要用内部类jt.addFocusListener(new MyFocusListener());//使用我们创建好的自定义事件监听JLabel jl2 = new JLabel("标签2初始状态");//标签2JTextField jt2 = new JTextField();//文本框jt2.setColumns(20);//文本框宽度//使用内部类来添加监听jt2.addFocusListener(new FocusListener() {public void focusGained(FocusEvent e) //获得焦点{// TODO 自动生成的方法存根jl2.setText("获得焦点");}public void focusLost(FocusEvent e)//失去焦点 {// TODO 自动生成的方法存根jl2.setText("失去焦点");}});c.add(jt);c.add(jl);c.add(jt2);c.add(jl2);setVisible(true);//使窗体可见}//使用自定义类比内部类方便。class MyFocusListener implements FocusListener//创建内部类来实现接口FocusListener{//自定义焦点事件监听public void focusGained(FocusEvent e){JTextField tmp=(JTextField)e.getSource();//获取触发焦点的事件tmp.setBorder(BorderFactory.createLineBorder(Color.green));//给获取焦点的文本框一个边框}public void focusLost(FocusEvent e) {JTextField tmp=(JTextField)e.getSource();//获取触发焦点的事件tmp.setBorder(BorderFactory.createLineBorder(Color.red));//给失去焦点的文本框一个边框}}public static void main(String[] args) {Demo d = new Demo();}}
4.9 Swing应用
package java_qq;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;public class User extends JDialog
{public User(JFrame jf,JTextField jt1,JPasswordField jp1){super(jf,"用户登录",true);//调用父类构造方法。setSize(600,400);//设置对话框窗体坐标,大小。setResizable(false);//设置窗体是否可以改变大小,也不能最大化Container c = getContentPane();//获取窗体容器c.setLayout(null);JLabel jl1 = new JLabel("账号:");//创建一个JLabel标签jl1.setBounds(140,50,70,50);JLabel jl2 = new JLabel("密码:");//创建一个JLabel标签jl2.setBounds(140,130,70,50);jl2.setFont(new Font("楷体",Font.BOLD,20));//Font有三个参数jl1.setFont(new Font("楷体",Font.BOLD,20));//Font有三个参数setLocationRelativeTo(null);JTextField jt = new JTextField();//创建一个文本框jt.addFocusListener(new MyFocusListener());//使用我们创建好的自定义事件监听jt.setFont(new Font("黑体",Font.PLAIN,20));//设置字体格式,第二个是字体样式,然后字体大小jt.setBounds(210, 65, 180, 25);JPasswordField jp = new JPasswordField();jp.addFocusListener(new MyFocusListener());//使用我们创建好的自定义事件监听jp.setEchoChar('*');jp.setFont(new Font("Arial",Font.BOLD,20));//设置字体格式,第二个是字体样式-加粗,然后字体大小jp.setBounds(210, 145, 180, 25);JButton jb = new JButton("登录");jb.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0){String s3=jt1.getText();String s4=jp1.getText();if (jt.getText().trim().length() == 0|| new String(jp.getPassword()).trim().length() == 0) {JOptionPane.showMessageDialog(null, "用户名密码不允许为空");return;}if (jt.getText().trim().equals(s3)&& new String(jp.getPassword()).trim().equals(s4)) {JOptionPane.showMessageDialog(null, "登录成功");} else {JOptionPane.showMessageDialog(null, "用户名或密码错误");}}});jb.setBounds(260, 240, 60, 30);JCheckBox c1 = new JCheckBox("自动登录");//设置多选按钮JCheckBox c2 = new JCheckBox("记住密码");c1.setToolTipText("下次自动登录,方便快捷");//鼠标悬停提示c2.setToolTipText("保存密码,用于下次自动登录");//鼠标悬停提示c1.setBounds(200, 300, 100, 30);c2.setBounds(320, 300, 100, 30);jl1.setHorizontalAlignment(SwingConstants.CENTER);//是标签上的文字居中c.add(jl1);c.add(jl2);c.add(jt);c.add(jp);c.add(jb);c.add(c1);c.add(c2);}class MyFocusListener implements FocusListener//创建内部类来实现接口FocusListener{//自定义焦点事件监听public void focusGained(FocusEvent e){JTextField tmp=(JTextField)e.getSource();//获取触发焦点的事件tmp.setBorder(BorderFactory.createLineBorder(Color.green));//给获取焦点的文本框一个边框}public void focusLost(FocusEvent e) {JTextField tmp=(JTextField)e.getSource();//获取触发焦点的事件tmp.setBorder(BorderFactory.createLineBorder(Color.black));//给失去焦点的文本框一个边框}}}
package java_qq;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Zhuce extends JDialog
{public Zhuce(JFrame jf, JTextField jt,JPasswordField jp){super(jf,"用户注册",true);//调用父类构造方法setSize(600,400);//设置对话框窗体坐标,大小。setResizable(false);//设置窗体是否可以改变大小,也不能最大化Container c = getContentPane();//获取窗体容器c.setLayout(null);JLabel jl1 = new JLabel("新建账号:");//创建一个JLabel标签jl1.setBounds(140,50,140,50);JLabel jl2 = new JLabel("设置密码:");//创建一个JLabel标签jl2.setBounds(160,130,140,50);jl2.setFont(new Font("楷体",Font.BOLD,20));//Font有三个参数jl1.setFont(new Font("楷体",Font.BOLD,20));//Font有三个参数setLocationRelativeTo(null);jt.setFont(new Font("黑体",Font.PLAIN,20));//设置字体格式,第二个是字体样式,然后字体大小jt.setBounds(280, 65, 180, 25);jp.setEchoChar('*');jp.setFont(new Font("Arial",Font.BOLD,20));//设置字体格式,第二个是字体样式-加粗,然后字体大小jp.setBounds(280, 145, 180, 25);JButton jb = new JButton("注册");jb.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0){if (jt.getText().trim().length() == 0|| new String(jp.getPassword()).trim().length() == 0) {JOptionPane.showMessageDialog(null, "用户名密码不允许为空");return;}else {JOptionPane.showMessageDialog(null, "注册成功");}}});jb.setBounds(260, 240, 60, 30);JCheckBox c1 = new JCheckBox("自动登录");//设置多选按钮JCheckBox c2 = new JCheckBox("记住密码");c1.setToolTipText("下次自动登录,方便快捷");//鼠标悬停提示c2.setToolTipText("保存密码,用于下次自动登录");//鼠标悬停提示c1.setBounds(200, 300, 100, 30);c2.setBounds(320, 300, 100, 30);jl1.setHorizontalAlignment(SwingConstants.CENTER);//是标签上的文字居中c.add(jl1);c.add(jl2);c.add(jt);c.add(jp);c.add(jb);}}
package java_qq;import javax.swing.*;import java_qq.User.MyFocusListener;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.net.URL;public class Demo
{JFrame jf = new JFrame();String s1;//获得字体格式String s2;//获得字体大小String s3;//注册账号String s4;//设置密码String s5;//账号String s6;//密码JTextField jt = new JTextField();//创建一个文本框JPasswordField jp = new JPasswordField();public void Creatbk(){//主窗体jf.setTitle("邮件");jf.setSize(1200,900);//大小jf.setResizable(false);//设置窗体是否可以改变大小,也不能最大化jf.setLocationRelativeTo(null);//使窗体居中显示Container c =jf.getContentPane();c.setLayout(null);//使用绝对布局//面板一;放置三个按钮URL url1 = Demo.class.getResource("发送.png");//发送图标Icon icon1 = new ImageIcon(url1);URL url2 = Demo.class.getResource("保存.png");//保存图标Icon icon2 = new ImageIcon(url2);//获取相应路径下的图片文件URL url3 = Demo.class.getResource("切换用户.png");//保存图标Icon icon3 = new ImageIcon(url3);//获取相应路径下的图片文件URL url5 = Demo.class.getResource("注册.png");//发送图标Icon icon5 = new ImageIcon(url5);JButton btn1 = new JButton();//发送图标btn1.setIcon(icon1);//给发送按钮添加图标btn1.addActionListener(new MyActionListener1());//按钮执行效果btn1.setBounds(10, 10, 50, 50);btn1.setToolTipText("写完邮件后,点此键发送");//鼠标悬停提示JButton btn2 = new JButton();//发送按钮btn2.setIcon(icon2);btn2.addActionListener(new MyActionListener2());btn2.setBounds(70, 10, 50, 50);btn2.setToolTipText("邮件未写完,有事离开时,点此键保存");//鼠标悬停提示JButton btn3 = new JButton();//切换用户按钮btn3.setIcon(icon3);btn3.addActionListener(new MyActionListener3());btn3.setBounds(130, 10, 50, 50);btn3.setToolTipText("点此键登录或切换用户");//鼠标悬停提示JButton btn5 = new JButton();//切换用户按钮btn5.setIcon(icon5);btn5.addActionListener(new MyActionListener4());btn5.setBounds(190, 10, 50, 50);btn5.setToolTipText("点此键注册用户");//鼠标悬停提示JPanel p1 = new JPanel();//使用模板1,放置三个按钮p1.setLayout(null);//给面板添加布局p1.setBounds(10, 5, 900, 75);p1.setBorder(BorderFactory.createTitledBorder(""));p1.add(btn1);p1.add(btn2);p1.add(btn3);p1.add(btn5);c.add(p1);//面板二:放置发件人,收件人,和主题JLabel fjr = new JLabel("发件人:");//发件人标签fjr.setForeground(Color.blue);//更改字体颜色,可以更改标签前景色fjr.setFont(new Font("楷体",Font.BOLD,15));//Font有三个参数fjr.setBounds(30, 12, 70, 30);JLabel sjr = new JLabel("收件人:");sjr.setForeground(Color.blue);//更改字体颜色,可以更改标签前景色sjr.setBounds(30, 47, 70, 30);sjr.setFont(new Font("楷体",Font.BOLD,15));//Font有三个参数JLabel title = new JLabel("主 题:");title.setForeground(Color.black);//更改字体颜色,可以更改标签前景色title.setFont(new Font("楷体",Font.BOLD,15));//Font有三个参数title.setBounds(30, 80, 70, 30);JTextField jt1 = new JTextField();//创建一个文本框----发件人jt1.addFocusListener(new MyFocusListener());//使用我们创建好的自定义事件监听jt1.setFont(new Font("黑体",Font.PLAIN,20));//设置字体格式,第二个是字体样式,然后字体大小jt1.setBounds(110, 15, 180, 25);JTextField jt2 = new JTextField();//创建一个文本框------收件人jt2.addFocusListener(new MyFocusListener());//使用我们创建好的自定义事件监听jt2.setFont(new Font("黑体",Font.PLAIN,20));//设置字体格式,第二个是字体样式,然后字体大小jt2.setBounds(110, 50, 180, 25); JTextField jt01 = new JTextField();//创建一个文本框----主题jt01.addFocusListener(new MyFocusListener());//使用我们创建好的自定义事件监听jt01.setFont(new Font("楷体",Font.PLAIN,20));//设置字体格式,第二个是字体样式,然后字体大小jt01.setBounds(110, 85, 580, 25);JPanel p2 = new JPanel();//使用模板2,放置发件人,收件人,和主题p2.setLayout(null);//给面板添加布局p2.setBounds(10,85, 900, 130);p2.setBorder(BorderFactory.createTitledBorder(""));p2.add(fjr);p2.add(sjr);p2.add(title);p2.add(jt1);p2.add(jt2);p2.add(jt01);c.add(p2);JLabel nr = new JLabel("内容:");nr.setForeground(Color.green);//更改字体颜色,可以更改标签前景色nr.setBounds(20, 500, 70, 30);nr.setFont(new Font("楷体",Font.BOLD,15));//Font有三个参数JComboBox<String> com = new JComboBox<>(); //实例化下拉列表对象String items[] = {"楷体","宋体","黑体"};ComboBoxModel cm = new DefaultComboBoxModel<>(items);//创建下拉列表模型,com.setModel(cm);//向列表中添加模型 com.setBounds(110,250,70,30);//下拉列表在坐标,长和宽com.setToolTipText("字体格式");c.add(com);JComboBox<String> com2 = new JComboBox<>(); //实例化下拉列表对象String items2[] = {"10","20","30"};ComboBoxModel cm2 = new DefaultComboBoxModel<>(items2);//创建下拉列表模型,com2.setModel(cm2);//向列表中添加模型 com2.setBounds(200,250,70,30);//下拉列表在坐标,长和宽com2.setToolTipText("字体大小");c.add(com2);JButton btn4 = new JButton("应用");
// btn4.addActionListener(new MyActionListener4());btn4.setBounds(290, 250, 60, 30);JTextArea a = new JTextArea(800,500);//文本编辑域a.setLineWrap(true);//是否可以自动换行JScrollPane sp = new JScrollPane(a);//创建滚动面板,给文本区域添加滚动条sp.setBounds(110, 300, 800, 500);c.add(sp);//给容器添加滚动面板a.setFont(new Font("微软雅黑",Font.PLAIN,20));//字体格式btn4.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {s1 = (String) com.getSelectedItem();//获取选中的值s2 = (String) com2.getSelectedItem();//获取选中的值\if(s2.equals("10"))a.setFont(new Font(s1,Font.PLAIN,10));//字体格式else if (s2.equals("20"))a.setFont(new Font(s1,Font.PLAIN,20));//字体格式else if(s2.equals("30"))a.setFont(new Font(s1,Font.PLAIN,30));//字体格式}});JRadioButton jj = new JRadioButton("紧急发送");//创建按钮jj.setBounds(680, 260, 100, 30);JRadioButton pt = new JRadioButton("普通发送");pt.setBounds(800, 260, 100, 30);ButtonGroup group = new ButtonGroup();//按钮组group.add(jj);//将单选按钮放在按钮组中,group.add(pt);//当一个按钮选中后,会自动关闭另外一个按钮pt.setSelected(true);//默认选中普通发送按钮JCheckBox c1 = new JCheckBox("普通邮件");//设置多选按钮JCheckBox c2 = new JCheckBox("绝密邮件");JCheckBox c3 = new JCheckBox("阅读回执");c1.setToolTipText("普通邮件,用于日常联系");//鼠标悬停提示c2.setToolTipText("绝密邮件,用于绝密信息");//鼠标悬停提示c3.setToolTipText("阅读后需要回复");//鼠标悬停提示c1.setBounds(540, 220, 100, 30);c2.setBounds(680, 220, 100, 30);c3.setBounds(800,220, 100,30);c.add(c1);c.add(c2);c.add(c3);c.add(jj);c.add(pt);c.add(btn4);c.add(nr);JTextArea a1 = new JTextArea(190,190);//文本编辑域a1.setText("xxx:\n");a1.append("xxx:\n");JScrollPane sp1 = new JScrollPane(a1);//创建滚动面板,给文本区域添加滚动条sp1.setBounds(10, 20, 190, 190);JPanel p3 = new JPanel();//使用面板2,放联系人框p3.setLayout(null);//给面板添加布局p3.setBounds(950, 100, 210, 220);p3.setBorder(BorderFactory.createTitledBorder("联系人"));p3.add(sp1);c.add(p3);jf.setDefaultCloseOperation(WindowConstants. EXIT_ON_CLOSE);jf.setVisible(true);}class MyActionListener1 implements ActionListener{public void actionPerformed(ActionEvent e) {if(jt.getText().equals("")){JOptionPane.showMessageDialog(null, "请先登录");return;}JOptionPane.showMessageDialog(null, "发送成功");}}class MyActionListener2 implements ActionListener{public void actionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(null, "保存成功");}}class MyActionListener3 implements ActionListener{public void actionPerformed(ActionEvent e) {if(jt.getText().equals("")){JOptionPane.showMessageDialog(null, "请先注册");return;}User s = new User(jf,jt,jp);s.setVisible(true);}}class MyActionListener4 implements ActionListener{public void actionPerformed(ActionEvent e) {Zhuce s = new Zhuce(jf,jt,jp);s.setVisible(true);}}class MyFocusListener implements FocusListener//创建内部类来实现接口FocusListener{//自定义焦点事件监听public void focusGained(FocusEvent e){JTextField tmp=(JTextField)e.getSource();//获取触发焦点的事件tmp.setBorder(BorderFactory.createLineBorder(Color.green));//给获取焦点的文本框一个边框}public void focusLost(FocusEvent e) {JTextField tmp=(JTextField)e.getSource();//获取触发焦点的事件tmp.setBorder(BorderFactory.createLineBorder(Color.black));//给失去焦点的文本框一个边框}}public static void main(String[] args) {Demo d = new Demo();d.Creatbk();}}
效果展示:
Java笔记(二)(寒假)相关推荐
- Java笔记二十二——设计模式
使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性,降低代码的耦合度. 设计模式基于以下几个原则: 里氏替换原则 --如果调用一个父类的方法可以成功,那么替换成子类调用也应该完全可以运行 ...
- 那年学过的Java笔记二SE面向对象
面向对象 面向对象编程 1 什么是对象? 万物皆对象. 2 什么是面向对象? 面向对象就是指以特征/属性和行为的观点去分析现实世界中事物的方式.3 什么是面向对象编程? 面向对象编程就是指先以面向对象 ...
- Java笔记(二)运算符——逻辑与逻辑或 / 按位与按位或 等( || 和 |)
1 赋值运算符 2 算数运算符 2.1 + - * / % 2.2 自增自减 运算符:++ - - 3 关系运算符 4 逻辑运算符 && || !& | 5 位运算符 & ...
- Java笔记二十四——Spring开发
Spring是一个支持快速开发Java EE应用程序的框架.它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备. 在Spring Frame ...
- Java学习笔记二:数据类型
Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...
- Java语言基础(Java自我进阶笔记二)
Java语言基础(Java自我进阶笔记二) 一. 什么是Java 的主类结构? 1. #mermaid-svg-xWTL2A8kDyyRPexH .label{font-family:'trebuch ...
- java面试笔记二:java的面向对象
java面试笔记二:面向对象 面向对象和面向过程的区别 过程就是函数,就是写方法,就是方法的一种实现. 对象就是将函数,属性的一种封装.用人们思考习惯的方式思考问题. 匿名对象 即:创建对象时没有指定 ...
- 10.4-全栈Java笔记:常用流详解(二)
上节我们讲到「Java中常用流:文件字节流和字节数组流」,本节我们继续走起~ 缓冲流 BufferedInputStream和BufferedOutputStream这两个流是处理流,通过内部缓存数 ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- 趣谈网络协议笔记-二(第十三讲)
趣谈网络协议笔记-二(第十三讲) 套接字Socket:Talk is cheap, show me the code 前言 这只是笔记,是为了整理刘超大神的极客时间专栏的只是而存在的! 经常会在网络上 ...
最新文章
- Redis安装与调试
- SQL------Hint
- [No0000D0] 让你效率“猛增十倍”,沉浸工作法到底是什么?
- html switch开关实现隐藏,css3实现switch开关效果
- Android之ADB常用命令
- FTP 两种传输模式 Binary 和 ASCII 的区别
- leetcode 746. 使用最小花费爬楼梯(dp)
- 基于C++中常见内存错误的总结
- JS中new的实现原理及重写
- php fopen 清空文件内容,如何在c语言中清空文件里的内容?
- 计算机系统操作工中级工试卷,计算机系统操作工中级理论试题及答案.doc
- 静态,类,实例方法,字典
- python怎么在gui中显示图片_Python 3-如何从Web检索图像并使用TKINTER在GUI中显示?...
- 电源大师课笔记 2.8
- 雷达存在感应器技术,实时感知控制应用,雷达人体探测方案
- Android之ViewStub的简单使用
- 酷柚易汛进销存开源版对外接口
- latex怎么看论文字数_如何确定latex文档字数
- 计算机键盘没有fn,键盘Fn键失灵怎么解决?键盘Fn键失灵的修复方法
- ❤ ❤html canvas面向对象的彩色小球❤ ❤