Java GUI
什么是GUI
GUI(Graphical User Interface)即图形用户界面,它能够使应用程序看上去更加友好;
Swing概述
Swing是纯Java组件,使得应用程序在不同的平台上运行时具有相同外观和相同的行为。 Swing中的大部分组件类位于javax.swing包中. Swing中的组件非常丰富,支持很多功能强大的组件.
容器组件
Java的图形用户界面的基本组成部分是组件,组件是一个以图形化的方式显示在屏幕上并能与用户进行交互的对象; 组件不能独立地显示出来,必须将组件放在一定的容器(container)中才可以显示出来。 容器可以容纳多个组件,通过调用容器的add(Component comp)方法向容器中添加组件。 窗口(Frame)和面板(Panel)是最常用的两个容器。
常用容器
框架(JFrame) 内部包含一个名叫Container(内容面板)的面板容器,如果要给框架中添加图形控件,通常将它们加入到这个内容面板中。 通过JFrame类中的getContentPane()方法即可获得此框架的内容面板。 也可以自己创建Jpanel面板对象,把JPanel作为一个组件添加到某个容器中.
常用方法: void setBackground(Color bg)设置面板的背景色,由参数bg指定颜色 void setLayout(LayoutManager mgr)设置面板的布局,参数是布局管理器 Component add(Component comp)往面板中添加一个组件
布局管理器
Java中的图形界面在布局管理上采用容器和布局管理相分离的方案,也就是说容器只是把组件放进来,但它不管怎样放置。至于如何放置需要用到布局管理器(Container) 。Java中有几种常用的布局管理器,分别是:FlowLayout , BorderLayout, GridLayout。
例如
FlowLayout
FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排,并在默认情况下使组件尽量居中放置。 this.setLayout(new FlowLayout()); this.add(new Button("确定")); this.add(new Button("取消")); FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。 不改变组件的大小,按组件原有尺寸显示组件,可设置不 同的组件间距,行距以及对齐方式。
构造方法 new FlowLayout(FlowLayout.RIGHT,20,40);右对齐,组件之间水平间距20个像素,垂直间距40个像素。 new FlowLayout(FlowLayout.LEFT);左对齐,水平和垂直间距为缺省值(5)。 new FlowLayout();使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)。
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型布局容器尺寸缩放原则: 北、南两个区域在水平方向缩放。 东、西两个区域在垂直方向缩放。 中部可在两个方向上缩放。
GridLayout
GridLayout布局管理器是矩形网格,在网格中放置组件,每个网格的高度和宽度都相等,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的大小和创建网格的多少来确定的。其用法如下: this.setLayout(new GridLayout(2 , 3)); //创建一个2行3列的网格 this.add(new Button(“按钮”)); 当组件数目大于网格数时,GridLayout保持行数不变而自动增加列数。 GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。 组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。 在 GridLayout 构造方法中指定分割的行数和列数.
常用组件
标签(JLable)
标签是容纳文本和图标的控件,通常用来在界面中标识别的控件。
构造函数:
JLabel() 创建一个空的标签 JLabel(String text) 创建一个带文本的标签 JLabel(Icon image) 创建一个带图像的标签
方法:
void setText(String text) 设置标签上的文本 String getText() 获得标签上的文本 setFont(new Font(“宋体”,Font.BOLD, 18)); 设置字体
单行文本(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); 设置列数
多行文本框(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); add(scrollPane );
密码框(JPasswordField)
构造函数:
JPasswordField() JPasswordField(String text) JPasswordField(String text, int columns)
方法:
char[] getPassword()
按钮(JButton)
构造方法:
JButton(String text) 创建一个带文本的标签 JButton(Icon image) 创建一个带图像的标签
方法:
void setBackground(Color bg) 设置按钮的背景色 void setEnabled(boolean b) 设置启用(或禁用)按钮,由参数b决定 void setToolTipText(String text) 设置按钮的悬停提示信息
菜单组件
菜单栏组件
构造方法:JMenuBar();
方法:add(menu);向菜单添加菜单
菜单组件:
构造方法:JMenu(“菜单名称"); 方法:add(menuItem); 向菜单添加菜单选项
菜单项组件:
构造方法:JMenuItem(“菜单项名称");
将菜单栏添加到窗口
setJMenuBar(menuBar);
事件处理
添加监听器
按钮对象.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 确定/取消
练习:
实现登录系统界面
package sssss;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class zuoye1 {
public static class Frame extends JFrame {
public Frame() {
this.setSize(520, 300);
this.setLocationRelativeTo(null);//窗口居中
this.setTitle("欢迎登录");//窗口标题
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项
this.setResizable(false);//不可调节窗口大小
JPanel jp = new JPanel(new GridLayout(3,1));
JPanel accountPanel = new JPanel();
JLabel accountLAble = new JLabel("账号");
accountLAble.setFont(new Font("楷书",Font.BOLD,15));
JTextField accountText = new JTextField(15);
accountPanel.add(accountLAble);
accountPanel.add(accountText);
JPanel passwordPAnel= new JPanel();
JLabel passwordLable = new JLabel("密码");
JPasswordField passwordField = new JPasswordField(15);
passwordPAnel.add(passwordLable);
passwordPAnel.add(passwordField);
JPanel jp3 = new JPanel();
JButton loginButton = new JButton("登录");
JButton cancleButton = new JButton("重置");
jp3.add(loginButton);
jp3.add(cancleButton);
jp.add(accountPanel);
jp.add(passwordPAnel);
jp.add(jp3);
this.add(jp);
this.setVisible(true);
//故障提醒
loginButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
try{
String account = accountText.getText();
String password = new String(passwordField.getPassword());
if (account.length()==0){
JOptionPane.showMessageDialog(null,"账号不能为空","来自系统的提示",JOptionPane.WARNING_MESSAGE);
return;
}
if (password.length()==0){
JOptionPane.showMessageDialog(null,"密码不能为空","来自系统的提示",JOptionPane.WARNING_MESSAGE);
return;
}
new bam();
dispose();
}catch (Exception e){
e.printStackTrace();
JOptionPane.showMessageDialog(null,"系统故障");
}
}
});
cancleButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
accountText.setText("");
passwordField.setText("");
}
});
}
}
public static void main(String[] args) {
Frame jFrame = new Frame();
}
}
实现结果: