目录
1.GUI的概念
到目前为止,我们编写的都是基于控制台的程序。
GUI(Graphical User Interface)即图形用户界面,它能够使应用程序看上去更加友好。
2.Swing的概念
Swing是纯Java组件,使得应用程序在不同的平台上运行时具有相同外观和相同的行为。
Swing中的大部分组件类位于javax.swing包中。
Swing中的组件非常丰富,支持很多功能强大的组件。
3.容器组件
Java的图形用户界面的基本组成部分是组件,组件是一个以图形化的方式显示在屏幕上并能与用户进行交互的对象。
组件不能独立地显示出来,必须将组件放在一定的容器(container)中才可以显示出来。
容器可以容纳多个组件,通过调用容器的add(Component comp)方法向容器中添加组件。
窗口(Frame)和面板(Panel)是最常用的两个容器。
1.常用容器
1.JFrame
JFrame用于在Swing程序中创建窗体;
JFrame类的构造方法:
(1)JFrame() 创建新窗体,该窗体初始为不可见。
(2)JFrame(String title) 创建新窗体,使用参数title指定标题,该窗体初始为不可见。
JFrame中常用的方法:
void setSize(int width, int height)
void setVisible(boolean b)
void setTitle(String title
void setResizable(boolean resizable)
void setLocation(int x,int y)
void setLocationRelativeTo(null);
void setDefaultCloseOperation(int operation)
void dispose()
2.JPanel
JPanel
JPanel提供面板,它是轻量级的容器。
面板中可以添加其它组件,也可以设置布局,我们一般使用面板来实现布局嵌套。
JPanel的两种构造方法:
JPanel() 创建一个空面板。
JPanel(LayoutManaer layout) 创建带有指定布局的面板。
框架(JFrame) 内部包含一个名叫Container(内容面板)的面板容器,如果要给框架中添加图形控件,通常将它们加入到这个内容面板中。
通过JFrame类中的getContentPane()方法即可获得此框架的内容面板,也可以自己创建Jpanel面板对象,把JPanel作为一个组件添加到某个容器中。
常用方法:
void setBackground(Color bg)设置面板的背景色,由参数bg指定颜色。
void setLayout(LayoutManager mgr)设置面板的布局,参数是布局管理器。
Component add(Component comp)往面板中添加一个组件。
public class Demo1Frame extends JFrame {
public static void main(String[] args) {
Demo1Frame loginFrame=new Demo1Frame();
}
public Demo1Frame() throws HeadlessException {
this.setSize(300,300);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setTitle("华为");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel jPanel=new JPanel(new BorderLayout());
this.add(jPanel);
this.setVisible(true);
}
}
4.布局管理器
swing中,提供了布局管理器类的对象可以管理。
每个Jpanel都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用Jpanel的setLayout方法改变其布局管理器对象或通过构造方法设置。
Java中的图形界面在布局管理上采用容器和布局管理相分离的方案,也就是说容器只是把组件放进来,但它不管怎样放置。至于如何放置需要用到布局管理器(Container) 。Java中有几种常用的布局管理器,分别是:FlowLayout , BorderLayout, GridLayout。
1.FlowLayout
FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排,
并在默认情况下使组件尽量居中放置。
this.setLayout(new FlowLayout());
FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。
不改变组件的大小,按组件原有尺寸显示组件,可设置不 同的组件间距,行距以及对齐方式。
构造方法:
new FlowLayout(FlowLayout.RIGHT,20,40);右对齐,组件之间水平间距20个像素,垂直间距40
个像素。
new FlowLayout(FlowLayout.LEFT);左对齐,水平和垂直间距为缺省值(5)。
new FlowLayout();使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)。
2.BorderLayout
BorderLayout布局管理器只允许在容器内放置5个组件,这5个组件的位置是由BorderLayout类中的North、South、East、West和Center5个常量来确定的,他们对应着容器中的上下左右中,用法如下:
this.add(new Button(“按钮”) ,BorderLayout.NORTH);
this.add(new Button(“按钮”) ,BorderLayout.CENTER);
组件在BorderLayout中的大小都是可以改变的。一般情况下可以让中间区域大一些,而且可以只用其中几
个区域。
BorderLayout将整个容器的布局划分成东(EAST)西(WEST)南(SOUTH)北(NORTH)中
(CENTER)五个区域,组件只能被添加到指定的区域。
如不指定组件的加入部位,则默认加入到CENTER区。
每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。
BorderLayout型布局容器尺寸缩放原则:
北、南两个区域在水平方向缩放。
东、西两个区域在垂直方向缩放。
中部可在两个方向上缩放。
3.GridLayout
GridLayout布局管理器是矩形网格,在网格中放置组件,每个网格的高度和宽度都相等,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的大小和创建网格的多少来确定的。其用法如下:
this.setLayout(new GridLayout(2 , 3)); //创建一个2行3列的网格
this.add(new Button(“按钮”));
当组件数目大于网格数时,GridLayout保持行数不变而自动增加列数。
GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。
组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。
在 GridLayout 构造方法中指定分割的行数和列数.
5.常用组件
1.标签(JLabel)
标签是容纳文本和图标的控件,通常用来在界面中标识别的控件。
构造函数:
JLabel() 创建一个空的标签
JLabel(String text) 创建一个带文本的标签
JLabel(Icon image) 创建一个带图像的标签
方法:
void setText(String text) 设置标签上的文本
String getText() 获得标签上的文本
setFont(new Font(“宋体”,Font.BOLD, 18)); 设置字体
2.单行文本(JTextField)
JTextField的构造函数:
JTextField()
JTextField(String text )
JTextField(int columns)
JTextField(String text, int columns)
方法:
void setText(String text) 设置文本框中的文本
String getText() 获得文本框中的文本
void setEditable(boolean b) 设置文本框是否可以编辑
setColumns(20); 设置列数
3.多行文本框(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
如果需要文本区自动出现滚动条,可将文本区对象放入滚动窗格(JScrollPane)中:
JScrollPane scrollPane = new JScrollPane(txtArea);
4.密码框(JPasswordField)
构造函数:
JPasswordField()
JPasswordField(String text)
JPasswordField(String text, int columns)
方法:
char[] a=JPasswordField.getPassword()
public class Demo4Frame extends JFrame {
public static void main(String[] args) {
Demo4Frame loginFrame=new Demo4Frame();
}
public Demo4Frame() throws HeadlessException {
this.setSize(300,300);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setTitle("QQ");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel jPanel=new JPanel();
JLabel jLabel=new JLabel("用户名");
JLabel jLabel1=new JLabel("密码");
jLabel.setText("账号");
jLabel.setForeground(Color.pink);
jLabel1.setForeground(Color.pink);
jLabel.getText();
jLabel.setFont(new Font("楷体",Font.BOLD,19));
jLabel1.setFont(new Font("楷体",Font.BOLD,19));
jPanel.add(jLabel);
JTextField jTextField=new JTextField(19);
jTextField.setEditable(true);
jPanel.add(jTextField);
jPanel.add(jLabel1);
JPasswordField jPasswordField=new JPasswordField("请输入密码",19);
System.out.println(new String(jPasswordField.getPassword()));
jPanel.add(jPasswordField);
this.add(jPanel);
this.setVisible(true);
}
}
5.按钮(JButton)
构造方法:
JButton (String text) 创建一个带文本的标签
JButton (Icon image) 创建一个带图像的标签
方法:
void setBackground(Color bg) 设置按钮的背景色
void setEnabled(boolean b) 设置启用(或禁用)按钮,由参数b决定
void setToolTipText(String text) 设置按钮的悬停提示信息
6.菜单组件
菜单栏组件:
构造方法:JMenuBar();
方法:add(menu); 向菜单栏添加菜单
菜单组件:
构造方法:JMenu(“菜单名称");
方法:add(menuItem); 向菜单添加菜单选项
菜单项组件:
构造方法:JMenuItem(“菜单项名称");
将菜单栏添加到窗口
setJMenuBar(menuBar)
public class Demo6Frame extends JFrame {
public static void main(String[] args) {
Demo6Frame loginFrame=new Demo6Frame();
}
public Demo6Frame() throws HeadlessException {
this.setSize(300,300);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setTitle("QQ");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar jMenuBar=new JMenuBar();
this.setJMenuBar(jMenuBar);
JMenu jMenu1=new JMenu("文件");
JMenu jMenu2=new JMenu("帮助");
jMenuBar.add(jMenu1);
jMenuBar.add(jMenu2);
JMenuItem jMenuItem1=new JMenuItem("保存");
JMenuItem jMenuItem2=new JMenuItem("删除");
JMenuItem jMenuItem3=new JMenuItem("关于我们");
jMenu1.add(jMenuItem1);
jMenu1.add(jMenuItem2);
jMenu2.add(jMenuItem3);
//添加一个事件监听器
jMenuItem3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我们是专业的");
}
});
this.setVisible(true);
}
}
6.事件处理
对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前为止,我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能,要实现相应的功能,必须进行事件处理;
用户与GUI组件进行交互就会发生事件,如:按下一个按钮、用键盘输入一个字符、点击鼠标等等;
当前我们要关注的并不是“事件是如何产生的”,而是讨论当发生事件后,我们应当“如何处理之”。
Java中,事件处理的基本思路如下:
一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件;
一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知。
添加事件监听器(此处即为匿名类)
按钮对象.addActionListener(new ActionListener() {
// 事件处理
@Override
public void actionPerformed(ActionEvent e) {
执行操作
}
});
public class Demo7Frame extends JFrame {
public static void main(String[] args) {
Demo7Frame loginFrame=new Demo7Frame();
}
public Demo7Frame() throws HeadlessException {
this.setSize(300,300);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setTitle("微信");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel jPanel=new JPanel();
JTextArea jTextArea=new JTextArea(5,20);
jPanel.add(jTextArea);
JScrollPane jScrollPane=new JScrollPane(jTextArea);
jPanel.add(jScrollPane);
JButton jButton=new JButton("登录");
jButton.setBackground(Color.blue);
jButton.setEnabled(true);
jButton.setToolTipText("点击登录");
jPanel.add(jButton);
jButton.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("按压");
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(jTextArea.getText().length()==0){
//JOptionPane.showMessageDialog(null,"请输入用户名","提示信息",JOptionPane.WARNING_MESSAGE);
int i= JOptionPane.showConfirmDialog(null,"你确定要离开吗");
System.out.println(i);
if(i==0){
JOptionPane.showMessageDialog(null,"可以离开吗");
}
return;
}
if(jTextArea.getText().length()<3||jTextArea.getText().length()>10){
JOptionPane.showMessageDialog(null,"请重新输入","提示信息",JOptionPane.WARNING_MESSAGE);
return;
}
}
});
this.add(jPanel);
this.setVisible(true);
}
}
7.对话框 (JOptionPane对话框)
1. showMessageDialog():消息对话框
主要有五种消息类型,类型不同,图标不同:
ERROR_MESSAGE 错误消息提示
INFORMATION_MESSAGE 信息提示
WARNING_MESSAGE 警告提示
QUESTION_MESSAGE 问题提示
PLAIN_MESSAGE 简洁提示
2.showConfirmDialog():确认对话框
主要有四种消息类型,类型不同,图标不同:
DEFAULT_OPTION 默认选项
YES_NO_OPTION 是/否选项
YES_NO_CANCEL_OPTION 是/否/取消选项
OK_CANCEL_OPTION 确定/取消