目录
- GUI编程
- 1. GUI概念
- 2. 容器组件
- 常用容器
- JFrame
- JPanel
- 3. 常用组件
- JButton(按钮)
- JTextField(文本框)
- Label(标签)
- JTextArea(文本域)
- JPasswordField(密码框)
- JMenuBar(菜单栏)
- JMenu(菜单)
- JMenuItem(菜单项)
- 4. 布局管理器
- FlowLayout
- BorderLayout
- GridLayout
- 5. 事件处理
- 6. 对话框
GUI编程
1. GUI概念
GUI(Graphical User Interface)即图形用户界面 , 用图形的方式,来显示计算机操作的界面,这样更方便更直观 较于在Java之前的篇章中,脱离了控制台,能够进行用户交互,使程序看上去更加友好
相关包:
- java.awt : 需要调用本地系统方法实现功能,属于重量级组件
- java.swing : 在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级组件
GUI继承体系
2. 容器组件
概述
Java的图形用户界面的基本组成部分是组件(Component),组件是一个以图形化的方式 显示在屏幕上并能与用户进行交互的对象
组件不能独立地显示出来,必须将组件放在一定的容器(container)中才 可以显示出来。 容器可以容纳多个组件,通过调用容器的add(Component comp)方法 向容器中添加组件。
Frame和Panel是最常用的容器
常用容器
JFrame
JFrame是Java中的一个类,它是一个容器,允许程序员把其他组件(Swing 的三个基本构造块:标签、按钮和文本字段)添加到它里面,把它们组织起来,并把它们呈现给用户。
JFrame的构造方法
构造方法 | 说明 |
| 构造一个无标题的不可见的新窗口 |
| 构造一个标题为 title 的不可见的新窗口 |
JFrame的常用方法
方法 | 说明 |
void remove(Component comp) | 从该容器中移除指定组件 |
void setDefaultCloseOperation(int operation) | 设置用户在此窗体上发起 “close” 时默认执行的操作 |
void setSize(int width, int height) | 设置窗口大小 |
void setLocation(int x,int y) | 设置窗口的位置 |
void setLocationRelativeTo(Component c) | 设置窗口相对参数组件的位置,为null居于屏幕中央 |
void setVisible(boolean b) | 设置窗口是否可见,默认不可见 |
void setResizable(boolean b) | 设置窗口是否可调整大小,默认可调整 |
void setBounds(int x, int y, int width, int height) | 设置左上角坐标及窗口大小 |
void setTitle(String title) | 设置窗口标题 |
void setIconImage(Image image) | 设置窗口标题图片 |
void dispose( | 释放窗 |
package java_gui.framedemo1;
import javax.swing.*;
public class FrameDemo1 extends JFrame {
public static void main(String[] args) {
FrameDemo1 frameDemo1 = new FrameDemo1();
frameDemo1.setFrame();
}
//设置窗口
public void setFrame(){
/*
窗体基本特征
*/
this.setSize(400,200);
this.setTitle("窗口标题");
this.setResizable(false);//设置窗口是否可拖拽
//this.setLocation(400, 100);//
this.setIconImage(new ImageIcon("p5.jpg").getImage());//这是标题图片
this.setLocationRelativeTo(null);//设置窗口居中
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//this.setBounds(100, 100, 400, 400);
this.setVisible(true);//设置窗体可见,放在所有设置下方
}
}
运行结果:
JPanel
JPanel提供面板,是轻量级的容器
面板中可以添加其他组件,也可以设置布局,我们一般使用面板来实现布局嵌套
JPanel的构造方法
构造方法 | 说明 |
| 创建一个新面板 |
| 创建一个指定布局的面板 |
package java_gui.framedemo1;
import javax.swing.*;
import java.awt.*;
public class FrameDemo2 extends JFrame{
public static void main(String[] args) {
FrameDemo2 frameDemo2 = new FrameDemo2();
frameDemo2.setFrame();
}
//设置窗口
public void setFrame(){
/*
窗体基本特征
*/
this.setSize(400,200);
this.setTitle("窗口标题");
this.setResizable(false);//设置窗口是否可拖拽
//this.setLocation(400, 200);//
this.setIconImage(new ImageIcon("p5.jpg").getImage());//这是标题图片
this.setLocationRelativeTo(null);//设置窗口居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//this.setBounds(100, 100, 400, 400);
//将面板加到窗口中
this.add(setPanel(new JPanel()));//this表示窗口
this.setVisible(true);//设置窗体可见,放在所有设置下方
}
//设置面板
public JPanel setPanel(JPanel jPanel){
/*
创建面板
*/
jPanel = new JPanel();
jPanel.setBackground(Color.green);//设置背景色
return jPanel;//返回创建的面板
}
}
运行结果:
3. 常用组件
JButton(按钮)
构造方法
构造方法 | 说明 |
JButton() | 创建一个按钮 |
JButton(String text) | 创建一个带文本的按钮 |
JButton(Icon icon) | 创建一个带图标的按钮 |
JButton(String text, Icon icon) | 创建一个带文本和图标的按钮 |
JButton jButton1=new JButton("确定");
JButton jButton2=new JButton("取消");
jPanel.add(jButton1);
jPanel.add(jButton2);
方法:
方法 | 说明 |
void setText(String text) | 设置按钮上的文本 |
String getText() | 获得按钮上的文本 |
void setBackground(Color bg) | 设置按钮的背景色 |
Color getBackground() | 获得按钮的背景色 |
void setEnabled(boolean b) | 设置是否启用按钮 |
void setVisible(boolean b) | 设置按钮是否为可见 |
void setToolTipText(String text) | 设置按钮的悬停提示信息 |
//按钮背景色
jButton1.setBackground(Color.GRAY);
//悬停提示
jButton2.setToolTipText("此按钮已禁用");
//按钮禁用
jButton2.setEnabled(false);
JTextField(文本框)
构造方法:
构造方法 | 说明 |
JTextField() | 创建新文本框 |
JTextField(String text ) | 创建新文本框,用指定文本参数初始化 |
JTextField(int columns) | 创建指定列数的新文本框 |
JTextField(String text, int columns) | 创建新文本框,用指定文本和列初始化 |
JTextField jTextField = new JTextField(10);
JTextField jTextField1 = new JTextField("Password",10);
方法:
方法 | 说明 |
void setText(String text) | 设置文本框中的文本 |
String getText() | 获得文本框中的文本 |
void setEditable(boolean b) | 设置文本框是否可以编辑 |
void setVisible(boolean b) | 设置文本框是否为可见 |
setColumns(int columns) | 设置列宽 |
Label(标签)
标签是容纳文本和图标的控件,通常用来在界面中标识别的控件。
构造方法
构造方法 | 说明 |
JLabel() | 创建一个空的标签 |
JLabel(String text) | 创建一个带文本的标签 |
JLabel(Icon image) | 创建一个带图像的标签 |
JLabel acc = new JLabel("账户:");
JLabel pwd = new JLabel("密码:");
JTextField jTextField = new JTextField(10);
JTextField jTextField1 = new JTextField("Password",10);
//组件添加到面板中
jPanel.add(acc);
jPanel.add(jTextField);
jPanel.add(pwd);
jPanel.add(jTextField1);
方法:
方法 | 说明 |
void setText(String text) | 设置标签上的文本 |
String getText() | 获得标签上的文本 |
void setIcon(Icon icon) | 设置标签的图标 |
Icon getIcon() | 获得标签的图标 |
void setVisible(boolean b) | 设置标签是否为可见 |
setFont(Font font) | 设置字体;Font(String name, int style, int size):构造一个指定字体,样式,大小的字体 |
JLabel jLabel = new JLabel("哆啦A梦");
jLabel.setIcon(new ImageIcon("E:\\lanlei\\java笔记\\GUI\\img\\哆啦A梦.png"));
jPanel.add(jLabel);
JTextArea(文本域)
构造方法
构造方法 | 说明 |
JTextArea() | 创建一个空的文本域 |
JTextArea(String text) | 用指定文本初始化文本域 |
JTextArea(int rows, int columns) | 创建一个指定行数和列数的空文本域 |
JTextArea(String text,int rows, int columns) | 创建一个指定行数和列数的的文本域,并用指定文本初始化 |
方法:
方法 | 说明 |
void setText(String text) | 设置文本域中的文本 |
String getText() | 获得文本域中的文本 |
void setFont(Font font) | 设置文本域中文本的字体 |
void setLineWrap(boolean wrap) | 是否自动换行,默认false |
void setWrapStyleWord(boolean word) | 是否以单词边界换行,默认false |
//文本域
JTextArea jTextArea = new JTextArea(8,30);
jPanel.add(jTextArea);
当前文本域添加文本时,超过初始化行数后会自动扩增行数
若需要文本区自动出现滚动条,可将文本区对象放入滚动窗格(JScrollPane)中:
//文本域
JTextArea jTextArea = new JTextArea(8,30);
//滚动面板
JScrollPane jScrollPane = new JScrollPane(jTextArea);
//滚动面板添加到面板中
jPanel.add(jScrollPane);
JPasswordField(密码框)
构造方法
构造方法 | 说明 |
JPasswordField() | 创建一个密码框 |
JPasswordField(String text) | 创建一个密码框,以指定文本初始化 |
JPasswordField(String text, int columns) | 创建一个密码框,以指定文本和列数初始化 |
//密码框
JPasswordField pwd = new JPasswordField(15);
jPanel.add(pwd);
默认效果输入字符回显圆点
方法:
方法 | 说明 |
char[] getPassword() | 返回密码框中的文本 |
char getEchoChar() | 返回用于回显的字符 |
void setEchoChar(char c) | 设置密码框的回显字符 |
JPasswordField pwd = new JPasswordField(15);
//设置回显字符
pwd.setEchoChar('密');
jPanel.add(pwd);
JMenuBar(菜单栏)
构造方法
构造方法 | 说明 |
| 创建一个新的菜单栏 |
//菜单栏
JMenuBar jMenuBar = new JMenuBar();
//添加菜单栏到窗口
this.setJMenuBar(jMenuBar);
注意:添加菜单栏的方法为 setJMenuBar(MenuBar m)
而不是 add()
没有添加菜单,无效果
方法:
方法 | 说明 |
| 将指定菜单加到菜单栏末尾 |
JMenu(菜单)
构造方法
构造方法 | 说明 |
| 构造一个没有文本的新的菜单 |
| 构造一个新菜单 ,其中提供的字符串作为其文本 |
| 构造一个新菜单,其中提供的字符串作为其文本 |
方法:
方法 | 说明 |
| 在菜单末尾加一个新的分隔符 |
| 将指定组件添加到菜单末尾 |
| 将指定的组件添加到菜单指定的位置 |
| 将菜单项添加到此菜单的末尾 |
| 创建一个带有指定文本的新菜单项,并将其附加到此菜单的末尾 |
| 从此菜单中删除组件 c |
| 从此菜单中删除指定索引处的菜单项 |
| 从此菜单中删除指定的菜单项 |
| 从此菜单中删除所有菜单项 |
//新建菜单
JMenu jMenu = new JMenu("File");
JMenu jMenu1 = new JMenu("Help");
//将菜单添加到菜单栏中
jMenuBar.add(jMenu);
jMenuBar.add(jMenu1);
JMenuItem(菜单项)
构造方法
构造方法 | 说明 |
| 创建一个没有设置文本或图标的菜单项 |
| 用指定的图标创建一个 菜单项 |
| 用指定的文本创建一个 菜单项 |
| 用指定的文本和图标创建一个菜单项 |
方法:
方法 | 说明 |
| 启用或禁用菜单项 |
| 以指定文本和图标初始化菜单项 |
JMenuItem item1 = new JMenuItem("设置");
JMenuItem item2 = new JMenuItem("保存");
JMenuItem item3 = new JMenuItem("另存为");
JMenuItem item4 = new JMenuItem("关于");
jMenu.add(item1);
//分隔符
jMenu.addSeparator();
jMenu.add(item2);
jMenu.add(item3);
jMenu1.add(item4);
4. 布局管理器
Java中的图形界面在布局管理上采用容器和布局管理相分离的方案,也 就是说容器只是把组件放进来,但它不管怎样放置。至于如何放置需要 用到布局管理器(Container) 。Java中有几种常用的布局管理器,分 别是:FlowLayout , BorderLayout, GridLayout。
FlowLayout
java.awt.FlowLayout 流式布局
FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排, 并在默认情况下使组件尽量居中放置
FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。 不改变组件的大小,按组件原有尺寸显示组件,可设置不 同的组件间距,行距以及对齐方式。
构造方法
构造方法 | 说明 |
| 构造一个 中心对齐,默认5个单位水平/垂直间隙 新流式布局管理器 |
| 构造一个 指定对齐方式,5个单位水平/垂直间隙 新流式布局管理器, |
| 构造一个 指定对齐方式和指定水平/垂直间隙 新流式布局管理器 |
实例:
package java_gui.layoutdemo;
import javax.swing.*;
import java.awt.*;
public class FrameDemo3 extends JFrame {
public static void main(String[] args) {
FrameDemo3 frameDemo3 = new FrameDemo3();
frameDemo3.setFrame();
}
//设置窗口
public void setFrame(){
/*
窗体基本特征
*/
//this.setSize(500,500);
this.setTitle("窗口1");
this.setResizable(false);//设置窗口是否可拖拽
//this.setLocation(400, 100);//
this.setIconImage(new ImageIcon("p5.jpg").getImage());//这是标题图片
this.setLocationRelativeTo(null);//设置窗口居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(100, 100, 400, 400);
//将面板加到窗口中
this.add(setPanel(new JPanel()));//this表示窗口
this.setVisible(true);//设置窗体可见,放在所有设置下方
}
//设置面板
public JPanel setPanel(JPanel jPanel){
/*
创建面板
*/
//布局方式--流式布局
jPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));//向左对齐
jPanel.setBackground(Color.green);//设置背景色
//创建按钮
for (int i = 0; i < 15; i++) {
JButton jButton = new JButton("按钮"+i);
jPanel.add(jButton);//将按钮加到面板中
}
//jPanel.remove(jButton2);//从面板中移除指定的组件
//jPanel.removeAll();//从面板中移除全部组件
return jPanel;//返回创建的面板
}
}
BorderLayout
java.awt.BorderLayout 边界布局
BorderLayout布局管理器只允许在容器内放置5个组件,这5个组件的位置是由BorderLayout类中的 North、South、East、West和Center5个常量来确定的,他们对应着容器中的上下左右中
组件在BorderLayout中的大小都是可以改变的。一般情况下可以让中间区域大一些,而且可以只用其中几 个区域。
- BorderLayout将整个容器的布局划分成东(EAST)西(WEST)南(SOUTH)北(NORTH)中 (CENTER)五个区域,组件只能被添加到指定的区域。
- 如不指定组件的加入部位,则默认加入到CENTER区。
- 每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。
- BorderLayout型布局容器尺寸缩放原则:
- 北、南两个区域在水平方向缩放。
- 东、西两个区域在垂直方向缩放。
- 中部可在两个方向上缩放。
构造方法
构造方法 | 说明 |
| 构造新的边界布局,组件之间无间隙 |
| 构造具有组件之间指定间隙的边界布局 |
实例
我们改变上面代码的setPanel()方法
public JPanel setPanel(JPanel jPanel){
/*
边界布局
BorderLayout()
new JPanel(new BorderLayout(BorderLayout.NORTH))
*/
//指定水平与垂直间隙的边界管理器
jPanel = new JPanel(new BorderLayout(10,10));
Random random = new Random();
JButton[] jButtons = new JButton[5];
//创建按钮
for (int i = 0; i < 5; i++) {
jButtons[i]= new JButton("按钮"+(i+1));
jButtons[i].setFont(new Font("宋体", Font.BOLD,20));
jButtons[i].setBackground(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)) );
}
jPanel.add(jButtons[0],BorderLayout.NORTH);//将按钮加到面板中
jPanel.add(jButtons[1],BorderLayout.SOUTH);//将按钮加到面板中
jPanel.add(jButtons[2],BorderLayout.WEST);//将按钮加到面板中
jPanel.add(jButtons[3],BorderLayout.EAST);//将按钮加到面板中
jPanel.add(jButtons[4],BorderLayout.CENTER);//将按钮加到面板中
return jPanel;//返回创建的面板
}
GridLayout
java.awt.GridLayout 网格布局
- GridLayout布局管理器是矩形网格,在网格中放置组件,每个网格的高度和宽 度都相等,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的 大小和创建网格的多少来确定的
- 当组件数目大于网格数时,GridLayout保持行数不变而自动增加列数
- GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。 组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。
- 在 GridLayout 构造方法中指定分割的行数和列数
构造方法 | 说明 |
| 创建具有指定行数和列数的网格布局 |
| 创建具有指定行数和列数的网格布局,并指定水平/垂直间隙 |
实例
修改setPanel方法
public JPanel setPanel(JPanel jPanel){
//网格布局
//从第一行第一列开始添加组价,一行占满时,从第二行开始
//组件数量超出网格容量,自动扩展一列
jPanel = new JPanel(new GridLayout(3,3));//三行三列网格
jPanel.setBackground(Color.green);//设置背景色
//创建按钮
for (int i = 0; i < 9; i++) {
JButton jButton = new JButton("按钮"+(i+1));
jPanel.add(jButton);//将按钮加到面板中
}
return jPanel;//返回创建的面板
}
创建了9个按钮,按照3行3列的网格分布
这次我们创建10个按钮,按照3行3列
可以看到变为了3行4列的网格,当组件数量大于网格容量时,会自动扩增一列
5. 事件处理
对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前 为止,我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任 何实际的功能,要实现相应的功能,必须进行事件处理;
用户与GUI组件进行交互就会发生事件,事件就是一个对象的状态发生了变化
如:按下一个按钮、用键盘输 入一个字符、点击鼠标等等;
Java中事件处理的思路:
- 一个事件源产生一个事件(事件对象),并把它送到监听器,监听器一直等待接收事件,一旦被接收,监听器将处理事件
- 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知
注册事件监听器
语法:
组件对象.addMouseListener()/addKeyListener()…
package java_gui.listenerdemo;
import java_gui.framedemo1.FrameDemo2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
public class MouseKeyDemo extends JFrame{
public static void main(String[] args) {
MouseKeyDemo mouseKeyDemo = new MouseKeyDemo();
mouseKeyDemo.setFrame();
}
//设置窗口
public void setFrame(){
/*
窗体基本特征
*/
this.setSize(400,200);
this.setTitle("窗口1");
this.setResizable(false);//设置窗口是否可拖拽
//this.setLocation(400, 100);//
this.setIconImage(new ImageIcon("p5.jpg").getImage());//这是标题图片
this.setLocationRelativeTo(null);//设置窗口居中
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//this.setBounds(100, 100, 400, 200);
//将面板加到窗口中
this.add(setPanel(new JPanel()));//this表示窗口
this.setVisible(true);//设置窗体可见,放在所有设置下方
}
//设置面板
public JPanel setPanel(JPanel jPanel){
/*
创建面板
*/
Random random = new Random();
jPanel = new JPanel();
jPanel.setBackground(Color.red);//设置背景色
JButton jButton1 = new JButton("变色");
JButton jButton2 = new JButton("清空");
JButton jButton3 = new JButton("移入移出");
//文本域
JTextArea jTextArea = new JTextArea(5,29);
//给文本域添加滚动条
JScrollPane scrollPane = new JScrollPane(jTextArea);
//加入面板
jPanel.add(scrollPane);
jPanel.add(jButton1);
jPanel.add(jButton2);
jPanel.add(jButton3);
//为按钮添加鼠标事件监听器
jButton3.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
jTextArea.setText("鼠标点击");
}
@Override
public void mousePressed(MouseEvent e) {
jTextArea.setText("鼠标按下");
}
@Override
public void mouseReleased(MouseEvent e) {
jTextArea.setText("鼠标释放");
}
@Override
public void mouseEntered(MouseEvent e) {
jTextArea.setText("鼠标移入");
}
@Override
public void mouseExited(MouseEvent e) {
jTextArea.setText("鼠标移出");
}
});
JPanel finalJPanel = jPanel;
jButton1.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
finalJPanel.setBackground(new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255)));//设置背景色
}
});
jButton2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
jTextArea.setText(null);
}
});
//文本框添加键盘事件监听器
jTextArea.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
jTextArea.setText("键盘敲击: "+e.getKeyCode());
}
@Override
public void keyPressed(KeyEvent e) {
jTextArea.setText("键盘按下: "+e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e) {
jTextArea.setText("键盘释放: "+e.getKeyCode());
}
});
return jPanel;//返回创建的面板
}
}
运行结果:
点击变色按钮
鼠标放到移入移出按钮
在文本域中使用键盘
清空
6. 对话框
JOptionPane 对话框
showMessageDialog():消息对话框 主要有五种消息类型,类型不同,图标不同
- ERROR_MESSAGE 错误消息提示
- INFORMATION_MESSAGE 信息提示
- WARNING_MESSAGE 警告提示
- QUESTION_MESSAGE 问题提示
- PLAIN_MESSAGE 简洁提示 (没有图标)
使用方法:
public static void showMessageDialog(Component parentComponent, object message,String title,int messageType)
//示例
JOptionPane.showMessageDialog(null, "错误", "错误提示", JOptionPane.ERROR_MESSAGE);
参数
(1)parentComponent 用于确定显示消息对话框的父窗口,并在这个父窗口的中间显示;
(2)message 用于在对话框中显示提示信息;
(3)title 用于设置对话框的标题栏内容;
(4)messageType 指定要显示的消息类型
showConfirmDialog():确认对话框 主要有四种消息类型,类型不同,图标不同
- DEFAULT_OPTION 默认选项
- YES_NO_OPTION 是/否选项
- YES_NO_CANCEL_OPTION 是/否/取消选项
- OK_CANCEL_OPTION 确定/取消
使用方法
public static int showConfirmDialog(Component parentComponent, Object message,String title, int optionType,int messageType))
参数
(1)parentComponent 用于确定显示消息对话框的父窗口,并在这个父窗口的中间显示;
(2)message 用于在对话框中显示提示信息;
(3)title 用于设置对话框的标题栏内容;
(4)messageType 指定要显示的消息类型