GUI(Graphical User Interface)
图形用户界面 -à java 提供的图形用户界面
UI – 用户界面
Swing 概述
Javax.swing 包
此包中包含了java主要的图形界面的实现类
● swing 是一个为Java设计的GUI工具包javax.swing,该包中包括了图形用户界面的各种组件支持。
● 一个 Java 的图形界面,由各种不同类型的“元素”组成,这些“元素”被称为组件(Component)。
● swing中的组件可以分为两大类:容器(如窗口,对话框,面板)和功能组件(如按钮,输入框,菜单等).
● 它们的区别主要是在概念上的。因为每个容器也都是组件。
● 容器是一种可以包含组件的特殊组件。
组件
容器组件 -- 窗口,面板,对话框 –容器
JFrame
JPanel 布局 流式布局 边界布局 网格布局
对话框 消息对话框 确认对话框
功能组件 -- 按钮 输入框 菜单……
JLable 标签 放文字
JTextField 单行文本框
JTextArea 多行文本框
JScrollPane 滚动面板
JPasswordField 密码框
JButton 按钮
JMenuBar 菜单栏
JMenu 菜单
JMenuItem 菜单项
布局管理器
swing中,提供了布局管理器类的对象可以管理
● 每个Jpanel都有一个布局管理器对象, 当容器需要对某个组件进行定位或判断其大小尺寸时 ,就会调用其对应的布局管理器 , 调用Jpanel的setLayout方法改变其布局管理器对象或通过构造方法设置。
1)、FlowLayout (流式布局)
FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排,并在默认情况下使组件尽量居中放置。
JPanel jPanel = new JPanel(new FlowLayout()); JButton jButton1 = new JButton("按钮1");//创建一个按钮组件 JButton jButton2 = new JButton("按钮2"); jPanel.add(jButton1);//向面板上添加其他组件 jPanel.add(jButton2); //把面板添加到窗口上 this.add(jPanel); this.setVisible(true);//让窗口显示 放在设置的最后一行
2)BorderLayout (边界布局)
总共有5个区域,每个区域可以防止一个组件,并且占满整个区域
中间区域是必须的,其他几个区域可以根据需要使用
添加组件式,可以指定组件的位置,如果不指定,默认添加到中间区域
JPanel jPanel = new JPanel(new BorderLayout()); JButton jButton1 = new JButton("按钮1");//创建一个按钮组件 JButton jButton2 = new JButton("按钮2"); JButton jButton3 = new JButton("按钮3"); JButton jButton4 = new JButton("按钮4"); JButton jButton5 = new JButton("按钮5"); jPanel.add(jButton1,BorderLayout.NORTH);//向面板上添加其他组件 jPanel.add(jButton2,BorderLayout.SOUTH); jPanel.add(jButton3,BorderLayout.WEST); jPanel.add(jButton4,BorderLayout.EAST); jPanel.add(jButton5,BorderLayout.CENTER);
3)GridLayou (网格布局)
网格就类似一个表格,可以设置行数和列数,
每个网格中只能放一个组件,占满整个区域
从第一行开始摆放,第一行占满后,再开启第二行
JPanel jPanel = new JPanel(new GridLayout(2,3)); JButton jButton1 = new JButton("按钮1");//创建一个按钮组件 JButton jButton2 = new JButton("按钮2"); JButton jButton3 = new JButton("按钮3"); JButton jButton4 = new JButton("按钮4"); JButton jButton5 = new JButton("按钮5"); JButton jButton6 = new JButton("按钮6"); jPanel.add(jButton1); jPanel.add(jButton2); jPanel.add(jButton3); jPanel.add(jButton4); jPanel.add(jButton5); jPanel.add(jButton6);
事件处理
在java中,事件处理的基本思路如下:
一个事件源产生一个事件并把它送到监听器那里,监听器一直等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件。
例如:
• 由于我们想要处理按钮的点击事件,因此,按钮便是事件源;
• 监听器类型是ActionListener。
● 添加事件监听器(此处即为匿名类)
按钮对象.addActionListener(new ActionListener() {
// 事件处理
@Override public void actionPerformed(ActionEvent e) {
执行操作
}
});
对话框
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 确定/取消
举例:
loginButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String account = accountTextField.getText(); String password = new String(passwordField.getPassword()); System.out.println(account); System.out.println(password); if (account.length() == 0){ JOptionPane.showMessageDialog(null, "账号不能为空,请重新输入!", "系统提示!",JOptionPane.WARNING_MESSAGE); return; } if (password.length() == 0){ JOptionPane.showMessageDialog(null,"密码不能为空!"); return; } String pattern = "^\\w+$"; boolean flag = Pattern.matches(pattern,password) && Pattern.matches(pattern,account); if (!flag){ JOptionPane.showMessageDialog(null,"账号密码只能由数字、字母组成!请重新输入!"); return; } new Chat(); dispose();//关闭登录界面 } });
内部类
● 把类定义在另一个类的内部,该类就被称为内部类。
● 如果在类 Outer 的内部再定义一个类 Inner,此时类Inner 就称为内部类(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。
内部类的特点
● 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
● 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否为private的。
匿名内部类
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。
new 接口名称/抽象类名称() {
重写抽象方法;
}
在实际开发中,我们常常遇到这样的情况:一个接口/抽象类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。
内部类的意义
1.封装性
将只有在某个类中使用的功能定义在内部中,并可以使用不同访问权限修饰控制.
2.实现多继承 java是不支持多继承的,多继承有一个致命性的缺陷, 容易出现钻石继承结构。例如下图: