GUI的概念
Swing概述
容器组件
布局管理器
常用组件
事件处理
对话框
内部类
GUI的概念:
到目前为止,我们编写的都是基于控制台输入的程序,操作使用非常不直
观;
GUI(Graphical User Interface)即图形用户界面,是指采用图形方
式显示的用户界面,与早期计算机使用的命令行界面相比,图形界面对
于用户来说在视觉上更易于接受。
swing概述:
swing 是一个为Java设计的GUI工具包javax.swing,该包中包括了图形用户界面
的各种组件支持。
一个 Java 的图形界面,由各种不同类型的“元素”组成,这些“元素”被称为
组件(Component)。
swing中的组件可以分为两大类:容器(如窗口,对话框,面板)和功能组件(如按钮,输
入框,菜单等).
它们的区别主要是在概念上的。因为每个容器也都是组件。
容器是一种可以包含组件的特殊组件
this.setTitle("欢迎登录");//标题
this.setSize(400,400);//设置宽高
//this.setLocation(200,400);//自定义位置
this.setLocationRelativeTo(null);//水平垂直居中
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//关闭窗口时退出程序
this.setResizable(false);//设置禁止拖拽调整大小
容器组件:
设置字体:
jLabel1.setFont(new Font("楷体",Font.BOLD,22));//设置字体
jLabel1.setForeground(new Color(33,11,222));//颜色
jLabel2.setFont(new Font("楷体",Font.BOLD,22));//设置字体
jLabel2.setForeground(new Color(33,11,222));//颜色
jLabel3.setFont(new Font("楷体",Font.BOLD,30));//设置字体
jLabel3.setForeground(new Color(33,11,222));//颜色
添加面板:
//添加一个面板
JPanel jPanel = new JPanel(new BorderLayout());//边界布局
添加按钮:
JButton jButton=new JButton("发送");
添加多行文本框:
JTextArea jTextArea1=new JTextArea(30,30);
添加单行文本:
JTextField jTextField=new JTextField(10);
添加多行文本框带滚动条:
JScrollPane jScrollPane=new JScrollPane(jTextArea);
创建一个空的标签:
JLabel jLabel1 = new JLabel("账号");
密码框:
JPasswordField jPasswordField = new JPasswordField(22);
事件处理:
对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前
为止,我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任
何实际的功能,要实现相应的功能,必须进行事件处理;
用户与GUI组件进行交互就会发生事件,如:按下一个按钮、用键盘输
入一个字符、点击鼠标等等;
当前我们要关注的并不是“事件是如何产生的” ,而是讨论当发生事件
后,我们应当“如何处理” 。
添加事件监听器(此处即为匿名类)
jButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
/* a.点击登录按钮时,要求账号和密码必须输入,否则提示账号密码不能为空
b.结合正则表达式验证账号密码只能由数字,字母组成,不满足提示*/
if(jTextField.getText().length()==0||jPasswordField.getPassword().length==0){
JOptionPane.showConfirmDialog(null,"账号密码都不能为空","操作提示",JOptionPane.WARNING_MESSAGE);
}
String s=jTextField.getText();
boolean a=s.matches("\\w*");//任意多的数字,字母
char[]chars=jPasswordField.getPassword();
String ss=new String(chars);
boolean aa=ss.matches("\\w*");//任意多的数字,字母
if(a==false||aa==false){
JOptionPane.showConfirmDialog(null,"账号密码只能由数字,字母组成","操作提示",JOptionPane.WARNING_MESSAGE);
}
System.out.println(jTextField.getText());//获得文本输入
System.out.println(jPasswordField.getPassword());
new Chat();
dispose();
}
});
JOptionPane
对话框
showMessageDialog()
:消息对话框
主要有五种消息类型,类型不同,图标不同:
ERROR_MESSAGE
错误消息提示
INFORMATION_MESSAGE
信息提示
WARNING_MESSAGE
警告提示
QUESTION_MESSAGE
问题提示
PLAIN_MESSAGE
简洁提示
showConfirmDialog()
:确认对话框
主要有四种消息类型,类型不同,图标不同:
DEFAULT_OPTION
默认选项
YES_NO_OPTION
是
/
否选项
YES_NO_CANCEL_OPTION
是
/
否
/
取消选项
OK_CANCEL_OPTION
确定
/
取消
什么是内部类
把类定义在另一个类的内部,该类就被称为内部类。
如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类
(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。
内部类
——
就是位于外部类成员位置的类
特点:可以使用外部类中所有的成员变量和成员方法(包括
private
的)
class Outer {
private int age = 20;
class Inner {
public void show() {
System.out.println(age);
}
}
}
内部类的特点
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立
的
.class
文件,但是前面冠以外部类的类名和
$
符号。
内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部
类可以自由地访问外部类的成员变量,无论是否为 private
的。
匿名内部类
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
new 接口名称/抽象类名称() {
重写抽象方法;
}
在实际开发中,我们常常遇到这样的情况:一个接口/抽象类的方法的某个实现方
式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类。此时可以
使用匿名内部类的方式,可以无需创建新的类,减少代码冗余
public interface IA {
abstract void fun1();
}
new IA() {
@Override
public void fun1() {
System.out.println("匿名类实现fun1");
}
};
内部类的意义
1.封装性
将只有在某个类中使用的功能定义在内部中,并可以使用不同访问权限修饰控制.
2.实现多继承
java是不支持多继承的,多继承有一个致命性的缺陷,
容易出现钻石继承结构