Java-GUI编程

Java_GUI

Posted by mr_king on November 29, 2020

Java-GUI编程

Swing

简介

Swing 是新一代的图形界面工具。使用 Swing 来开发图形界面比 AWT 更加优秀,因为 Swing 是一种轻量级组件,它采用纯 Java 实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平台支持比较出色。除此之外,Swing 提供了比 AWT 更多的图形界面组件,因此可以开发出美观的图形界面程序。

Swing类库结构

Swing 组件都采用 MVC(Model-View-Controller,即模型-视图-控制器)的设计,实现 GUI 组件的显示逻辑和数据逻辑的分离,从而允许程序员自定义 Render 来改变 GUI 组件的显示外观,以提供更多的灵活性。

DgK7uT.png

Swing包

Swing 类库由许多包组成,通过这些包中的类相互协作来完成 GUI 设计。其中,javax.swing 包是 Swing 提供的最大包,它包含将近 100 个类和 25 个接口。几乎所有 Swing 组件都在该包中。表 1 列出了常用的 Swing 包。

包名称 描述
javax.swing 提供一组“轻量级”组件,尽量让这些组件在所有平台上的工作方式都相同
javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口
javax.swing.event 提供 Swing 组件触发的事件
javax.swing.filechooser 提供 JFileChooser 组件使用的类和接口
javax.swing.table 提供用于处理 javax.swing.JTable 的类和接口
javax.swing.text 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类
javax.swing.tree 提供处理 javax.swingJTree 的类和接口

Swing 容器

创建图形用户界面程序的第一步是创建一个容器类以容纳其他组件,常见的窗口就是一种容器。容器本身也是一种组件,它的作用就是用来组织、管理和显示其他组件。

Swing 中容器可以分为两类:顶层容器和中间容器。

顶层容器是进行图形编程的基础,一切图形化的东西都必须包括在顶层容器中。顶层容器是任何图形界面程序都要涉及的主窗口,是显示并承载组件的容器组件。在 Swing 中有三种可以使用的顶层容器,分别是 JFrame、JDialog 和 JApplet。

  1. JFrame:用于框架窗口的类,此窗口带有边框、标题、关闭和最小化窗口的图标。带 GUI 的应用程序至少使用一个框架窗口。
  2. JDialog:用于对话框的类。
  3. JApplet:用于使用 Swing 组件的 Java Applet 类。

中间容器是容器组件的一种,也可以承载其他组件,但中间容器不能独立显示,必须依附于其他的顶层容器。常见的中间容器有 JPanel、JScrollPane、JTabbedPane 和 JToolBar。

  • JPanel:表示一个普通面板,是最灵活、最常用的中间容器。
  • JScrollPane:与 JPanel 类似,但它可在大的组件或可扩展组件周围提供滚动条。
  • JTabbedPane:表示选项卡面板,可以包含多个组件,但一次只显示一个组件,用户可在组件之间方便地切换。
  • JToolBar:表示工具栏,按行或列排列一组组件(通常是按钮)。

DgGas1.png

JFrame窗口

JFrame 用来设计类似于 Windows 系统中窗口形式的界面。JFrame 是 Swing 组件的顶层容器,该类继承了 AWT 的 Frame 类,支持 Swing 体系结构的高级 GUI 属性。

JFrame 类的常用构造方法如下所示。

  • JFrame():构造一个初始时不可见的新窗体。
  • JFrame(String title):创建一个具有 title 指定标题的不可见新窗体。

当创建一个 JFrame 类的实例化对象后,其他组件并不能够直接放到容器上面,需要将组件添加至内容窗格,而不是直接添加至 JFrame 对象。示例代码如下:

frame.getContentPane().add(b);

D2BbFA.png

JFrame 类中的常用方法

方法名称 概述
getContentPane() 返回此窗体的 contentPane 对象
getDefaultCloseOperation() 返回用户在此窗体上单击“关闭”按钮时执行的操作
setContentPane(Container contentPane) 设置 contentPane 属性
setDefaultCloseOperation(int operation) 设置用户在此窗体上单击“关闭”按钮时默认执行的操作
setDefaultLookAndFeelDecorated (booleandefaultLookAndFeelDecorated) 设置 JFrame 窗口使用的 Windows 外观(如边框、关闭窗口的 小部件、标题等)
setIconImage(Image image) 设置要作为此窗口图标显不的图像
setJMenuBar( JMenuBar menubar) 设置此窗体的菜单栏
setLayout(LayoutManager manager) 设置 LayoutManager 属性

Java 第一个 GUI 程序

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.*;
public class JFrameDemo extends JFrame
{
    public JFrameDemo()
    {
        setTitle("Java 第一个 GUI 程序");    //设置显示窗口标题
        setSize(400,200);    //设置窗口显示尺寸
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //置窗口是否可以关闭
        JLabel jl=new JLabel("这是使用JFrame类创建的窗口");    //创建一个标签
        Container c=getContentPane();    //获取当前窗口的内容窗格
        c.add(jl);    //将标签组件添加到内容窗格上
        setVisible(true);    //设置窗口是否可见
    }
    public static void main(String[] agrs)
    {
        new JFrameDemo();    //创建一个实例化对象
    }
}

上述代码创建的 JFrameDemo 类继承了 JFrame 类,因此 JFrameDemo 类可以直接使用 JFrame 类的方法。setTitle() 方法用来设置窗口标题,setDefaultCloseOperation() 方法用来设置响应方式,即当单击“关闭”按钮时退出该程序。

JPanel 面板

JPanel 是一种中间层容器,它能容纳组件并将组件组合在一起,但它本身必须添加到其他容器中使用。JPanel 类的构造方法如下。

  • JPanel():使用默认的布局管理器创建新面板,默认的布局管理器为 FlowLayout。
  • JPanel(LayoutManagerLayout layout):创建指定布局管理器的 JPanel 对象。

JPanel 类的常用方法

方法名及返回值类型 说明
Component add(Component comp) 将指定的组件追加到此容器的尾部
void remove(Component comp) 从容器中移除指定的组件
void setFont(Font f) 设置容器的字体
void setLayout(LayoutManager mgr) 设置容器的布局管理器
void setBackground(Color c) 设置组件的背景色

边框布局管理器

BorderLayout(边框布局管理器)是 Window、JFrame 和 JDialog 的默认布局管理器。边框布局管理器将窗口分为 5 个区域:North、South、East、West 和 Center。其中,North 表示北,将占据面板的上方;Soufe 表示南,将占据面板的下方;East表示东,将占据面板的右侧;West 表示西,将占据面板的左侧;中间区域 Center 是在东、南、西、北都填满后剩下的区域,如图 1 所示。

D2Wn00.png

BorderLayout 布局管理器的构造方法如下所示。

  • BorderLayout():创建一个 Border 布局,组件之间没有间隙。
  • BorderLayout(int hgap,int vgap):创建一个 Border 布局,其中 hgap 表示组件之间的横向间隔;vgap 表示组件之间的纵向间隔,单位是像素。

流式布局

FlowLayout(流式布局管理器)是 JPanel 和 JApplet 的默认布局管理器。FlowLayout 会将组件按照从上到下、从左到右的放置规律逐行进行定位。与其他布局管理器不同的是,FlowLayout 布局管理器不限制它所管理组件的大小,而是允许它们有自己的最佳大小。

FlowLayout 布局管理器的构造方法如下。

  • FlowLayout():创建一个布局管理器,使用默认的居中对齐方式和默认 5 像素的水平和垂直间隔。
  • FlowLayout(int align):创建一个布局管理器,使用默认 5 像素的水平和垂直间隔。其中,align 表示组件的对齐方式,对齐的值必须是 FlowLayoutLEFT、FlowLayout.RIGHT 和 FlowLayout.CENTER,指定组件在这一行的位置是居左对齐、居右对齐或居中对齐。
  • FlowLayout(int align, int hgap,int vgap):创建一个布局管理器,其中 align 表示组件的对齐方式;hgap 表示组件之间的横向间隔;vgap 表示组件之间的纵向间隔,单位是像素。
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.*;
public class FlowLayoutDemo
{
    public static void main(String[] agrs)
    {
        JFrame jFrame=new JFrame("Java第四个GUI程序");    //创建Frame窗口
        JPanel jPanel=new JPanel();    //创建面板
        JButton btn1=new JButton("1");    //创建按钮
        JButton btn2=new JButton("2");
        JButton btn3=new JButton("3");
        JButton btn4=new JButton("4");
        JButton btn5=new JButton("5");
        JButton btn6=new JButton("6");
        JButton btn7=new JButton("7");
        JButton btn8=new JButton("8");
        JButton btn9=new JButton("9");
        jPanel.add(btn1);    //面板中添加按钮
        jPanel.add(btn2);
        jPanel.add(btn3);
        jPanel.add(btn4);
        jPanel.add(btn5);
        jPanel.add(btn6);
        jPanel.add(btn7);
        jPanel.add(btn8);
        jPanel.add(btn9);
        //向JPanel添加FlowLayout布局管理器,将组件间的横向和纵向间隙都设置为20像素
        jPanel.setLayout(new FlowLayout(FlowLayout.LEADING,20,20));
        jPanel.setBackground(Color.gray);    //设置背景色
        jFrame.add(jPanel);    //添加面板到容器
        jFrame.setBounds(300,200,300,150);    //设置容器的大小
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

卡片布局管理器

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.awt.*;
public class CardLayoutDemo
{   
    public static void main(String[] agrs)
    {
        JFrame frame=new JFrame("Java第五个程序");    //创建Frame窗口
        JPanel p1=new JPanel();    //面板1
        JPanel p2=new JPanel();    //面板2
        JPanel cards=new JPanel(new CardLayout());    //卡片式布局的面板
        p1.add(new JButton("登录按钮"));
        p1.add(new JButton("注册按钮"));
        p1.add(new JButton("找回密码按钮"));
        p2.add(new JTextField("用户名文本框",20));
        p2.add(new JTextField("密码文本框",20));
        p2.add(new JTextField("验证码文本框",20));
        cards.add(p1,"card1");    //向卡片式布局面板中添加面板1
        cards.add(p2,"card2");    //向卡片式布局面板中添加面板2
        CardLayout cl=(CardLayout)(cards.getLayout());
        cl.show(cards,"card1");    //调用show()方法显示面板2
        frame.add(cards);
        frame.setBounds(300,200,400,200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

JLable:标签组件

JLabel 的常用方法

方法名称 说明
void setText(Stxing text) 定义 JLabel 将要显示的单行文本
void setIcon(Icon image) 定义 JLabel 将要显示的图标
void setIconTextGap(int iconTextGap) 如果 JLabel 同时显示图标和文本,则此属性定义它们之间的间隔
void setHorizontalTextPosition(int textPosition) 设置 JLabel 的文本相对其图像的水平位置
void setHorizontalAlignment(int alignment) 设置标签内容沿 X 轴的对齐方式
int getText() 返回 JLabel 所显示的文本字符串
Icon getIcon() 返回 JLabel 显示的图形图像
Component getLabelFor() 获得将 JLabel 添加到的组件
int getIconTextGap() 返回此标签中显示的文本和图标之间的间隔量
int getHorizontalTextPosition() 返回 JLabel 的文本相对其图像的水平位置
int getHorizontalAlignment() 返回 JLabel 沿 X 轴的对齐方式

JButton:按钮组件

按钮是图形界面上常见的元素,在前面已经多次使用过它。在 Swing 中按钮是 JButton 类的对象,JButton 类的常用构造方法如下。

  • JButton():创建一个无标签文本、无图标的按钮。
  • JButton(Icon icon):创建一个无标签文本、有图标的按钮。
  • JButton(String text):创建一个有标签文本、无图标的按钮。
  • JButton(String text,Icon icon):创建一个有标签文本、有图标的按钮。

JButton 类的常用方法

方法名称 说明
addActionListener(ActionListener listener) 为按担组件注册 ActionListener 监听
void setIcon(Icon icon) 设置按钮的默认图标
void setText(String text) 设置按鈕的文本
void setMargin(Insets m) 设置按钮边框和标签之间的空白
void setMnemonic(int nmemonic) 设置按钮的键盘快捷键,所设置的快捷键在实际操作时需要结合 Alt 键进行实现
void setPressedIcon(Icon icon) 设置按下按钮时的图标
void setSelectedIcon(Icon icon) 设置选择按鈕时的图标
void setRolloveiicon(Icon icon) 设置鼠标移动到按扭区域时的图标
void setDisabledIcon(Icon icon) 设置按钮无效状态下的图标
void setVerticalAlignment(int alig) 设置图标和文本的垂直对齐方式
void setHorizontalAlignment(int alig) 设置图标和文本的水平对齐方式
void setEnable(boolean flag) 启用或禁用按扭
void setVerticalTextPosition(int textPosition) 设置文本相对于图标的垂直位置
void setHorizontalTextPosition(int textPosition) 设置文本相对于图标的水平位置