Java核心(Swing 程序设计2-标签、图标、布局)

一、标签组件与图标

    在 Swing 中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。在应用程序的用户界面中,一个简短的文本标签可以使用户知道这些组件的目的,所以标签在 Swing 中是比较常用的组件。

    1.1 标签的使用

    标签由 JLabel 类定义,它的父类为 JComponent 类。

    标签可以显示一行只读文本、一个图像或带图标的文本,它并不能产生任何类型的事件,只是简单地显示文本和图片,但是可以使用标签的特性指定标签上文本的对齐方式。

    JLabel 类提供了多种构造方法,可以创建多种标签,如显示只有文本的标签、只有图标的标签或包含文本与图标的标签。JLabel 类常用的及格构造方法:

    ( 1 ) :public JLabel()  :创建一个不带图标和文本的 JLabel 对象。

    ( 2 ) :public JLabel(Icon icon) :创建一个带图标的 JLabel 对象。

    ( 3 ) :public JLabel(Icon icon,int aligment) :创建一个带图标的 JLabel 对象,并设置图标水平对齐方式。

    ( 4 ) :public JLabel(String text,Icon icon,int aligment) :创建一个带文本、带图标的 JLabel 对象,并设置标签内容的水平对齐方式。

    1.2 图标的使用

    Swing 中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。U币可以用 Java 支持的图片文件类型进行创建,也可以使用 java.awt.Graphics 类提供的功能方法来创建。

    1.2.1 创建图标

    在 Swing 中通过 Icon 接口来创建图标,可以在创建时给定图标的大小、颜色等特性。如果使用 Icon 接口,必须实现 Icon 接口中的 3  个方法:

    ( 1 ) :public int getIconHeight();

    ( 2 ) :public int getIconWidth();

    ( 3 ) :public void paintIcon(Component arg(),Graphics arg1,int arg2,int arg3)。

    getIconWidth() 与 getIconHeight() 方法用于获取图标的宽与长,paintIcon() 方法用于实现在指定坐标位置画图。

    eg 1.2.1 在项目中创建实现 Icon 接口的 DrawIcon 类,该类实现自定义的图标类。

package com.SwingDemo;

import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;

import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class DrawIcon implements Icon{        //实现 Icon 接口

    private int width;        //声明图标的宽
    private int height;        //声明图标的长
	
    public DrawIcon(int width,int height) {        //定义构造方法
        this.width=width;
        this.height=height;
    }
	
    @Override
    public int getIconHeight() {
        return this.height;
    }

    @Override
    public int getIconWidth() {
        return this.width;
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        g.fillOval(x, y, width, height);        //绘制一个圆形
    }
	
    public static void main(String[] args) {
        DrawIcon icon = new DrawIcon(15,15);
        //创建一个标签,并设置标签上的文字在标签正中间
        JLabel jLabel = new JLabel("测试", icon, SwingConstants.CENTER);
        JFrame jFrame = new JFrame();        //创建一个 JFrame 窗口
        Container container = jFrame.getContentPane();
        container.add(jLabel);
        jFrame.setSize(100,100);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

    运行结果为:


    在例子中,由于 DrawIcon 类继承了 Icon 接口,所以在该类中必须实现 Icon 接口中定义的所有方法,其中在实现 paintIcon() 方法中使用 Graphics 类中的方法绘制一个圆形的图标,其余实现接口的方法为返回图标的长与宽。在 DrawIcon 类的构造方法中农设置了图标的长与宽,这样如果需要在窗体使用图标,就可以使用如下代码创建图标:

DrawIcon icon = new DrawIcon(15, 15);

    1.2.2  使用图片图标

    Swing 中的图标除了可以绘制之外,还可以使用某个特定的图片创建。Swing 利用 javax.swing.ImageIcon 类根据现有图片创建图标,ImageIcon 类实现了 Icon 接口,同时 Java 支持多种图片格式。

    ImageIcon 类常用的构造方法如下:

    ( 1 ) :public ImageIcon() :该构造方法创建一个通用的 ImageIcon 对象,当真正想要设置图片时在使用 ImageIcon 对象调用 setImage(Image image) 方法来操作。

    ( 2 ) :public ImageIcon(Image image) :可以直接从图片源创建图标。

    ( 3 ) :public ImageIcon(Image image,String description) :除了可以从图片源创建图标之外,还可以为这个图标添加简短的描述,但这个描述不会在图标上显示,可以使用 getDescripttion() 方法获取这个描述。

    ( 4 ) :public ImageIcon(URL url) :该构造方法利用位于计算机网络上的图像文件创建图标。

    eg 1.2.2 在项目中创建继承 JFrame 类的 MyImageIcon 类,在类中创建 ImageIcon 类的实例对象,该对象使用现有图片创建图标对象,并应用到组件上。

package com.SwingDemo;

import java.awt.Container;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class MyImageIcon extends JFrame {

    public MyImageIcon() {
        Container container = getContentPane();
        // 创建一个标签
        JLabel jLabel = new JLabel("这是一个JFrame窗体", JLabel.CENTER);
        // 获取图片所在的URL
        URL url = MyImageIcon.class.getResource("imageButton.jpg");
        Icon icon = new ImageIcon(url);         // 实例化Icon对象
        jLabel.setIcon(icon);         // 为标签设置图片
        // 设置文字放置在标签中间
        jLabel.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel.setOpaque(true);         // 设置标签为不透明状态
        container.add(jLabel);         // 将标签添加到容器中
        setSize(250, 100);         // 设置窗体大小
        setVisible(true);         // 使窗体可见
        // 设置窗体关闭模式
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
	
    public static void main(String args[]) {
        new MyImageIcon();         // 实例化MyImageIcon对象
    }
}

    运行结果为:


二、常用布局管理器

    在 Swing 中,每个组件在容器中都有一个具体的位置和大小,而在容器中摆放各种组件时很难判断其具体位置和大小。布局管理器提供了 Swing 组件安排、展示在容器中的方法及基本的布局功能。使用布局管理器较程序员直接在容器中控制 Swing 组件的位置和大小方便得多,可以有效地处理整个窗体的布局。Swing 提供的常用布局管理器包括流布局管理器、边界布局管理器和网格布局管理器。

    2.1 绝对布局

    在 Swing 中,除了使用布局管理器之外还可以使用绝对布局。绝对布局,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。

    是用绝对布局的步骤如下:

    ( 1 ) :使用 Container.setLayout(null)  方法取消布局管理器。

    ( 2 ) :使用 Container.setBounds()  方法设置每个组件的大小与位置。

    eg 2.1 在项目中创建继承 JFrame 窗体组件的 AbsolutePosition 类,设置布局管理器为 null ,即使用绝对定位的布局方法,创建两个按钮组件,将按钮分别定位在不同的窗体位置上。

package com.SwingDemo;

import java.awt.*;
import javax.swing.*;

public class AbsolutePosition extends JFrame {
    public AbsolutePosition() {
        setTitle("本窗体使用绝对布局");        //设置该窗体的标题
        setLayout(null);        //使该窗体取消布局管理器设置
        setBounds(0, 0, 200, 150);        //绝对定位窗体的位置与大小
        Container container = getContentPane();        //创建容器对象
        JButton jButton1 = new JButton("按钮1");        //创建按钮1
        JButton jButton2 = new JButton("按钮2");        //创建按钮2
        jButton1.setBounds(10, 30, 80, 30);        //设置按钮的位置与大小
        jButton2.setBounds(60, 70, 100, 20);        //设置按钮的位置与大小
        container.add(jButton1);        //将按钮1添加到容器中
        container.add(jButton2);        //将按钮2添加到容器中
        setVisible(true);        //使窗体可见
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        //设置窗体关闭方式
    }
	
    public static void main(String[] args) {
        new AbsolutePosition();
    }
}

    运行结果为 :

Java核心(Swing 程序设计2-标签、图标、布局)_第1张图片

    在例子中,窗体的大小、位置以及窗体内组件的大小与位置都被进行绝对布局操作。绝对布局使用 setBounds(x, y, width, height) 方法进行设置,如果使窗体对象调用 setBounds() 方法,它的参数 x 与 y 分别代表这个窗体在整个屏幕上出现的位置, weidth 与 height 则代表这个窗体的宽与长;如果使窗体内的组件调用 setBounds() 方法,参数 x 与 y 则代表这个组件在整个窗体摆放的位置,width 与 height 则代表这个窗体的大小。

    ps  :在使用绝对布局之前需要调用 setLayout(null) 方法告知编译器,这个不再使用布局管理器。

    2.2  流布局管理器

    流( FlowLayout )布局管理器是最基本的布局管理器,在整个容器中的布局正如其名,像“ 流 ”一样从左到右摆放组件,直到占据了这一行的所有空间,然后再向下移动一行。默认情况下,组件在每一行都是居中排列的,但是通过设置也可以更改组件在每一行上的排列位置。

    FlowLayout  类中具有以下常用的构造方法 :

    ( 1 ) :public FlowLayout() 。

    ( 2 ) :public FlowLayout(int alignment) 。

    ( 3 ) :public FlowLayout(int alignment , int horizGap , int vertGap) 。

    构造方法的 alignment 参数表示使用流布局管理器后组件在一行的具体摆放位置。它可以被赋予以下 3 个值之一 :

    ( 1 ) :FlowLayout.LEFT = 0 。

    ( 2 ) :FlowLayout.CENTER = 1 。

    ( 3 ) :FlowLayout.RIGHT = 2 。

    上述 3 个值分别代表容器使用流布局管理器后组件在每一行中的摆放位置。例如 :将 alignment 设置为 0 时,每一行的组件将被指定按照左对齐排列;而将 alignment 设置为 2 时,每一行的组件将被指定为按照右对齐排列。

    在 public FlowLayout(int alignment , int horizGap , int vertGap)  构造方法中还存在 horizGap  与 vertGap 两个参数,这两个参数分别以像素为单位指定组件之间的水平间隔与垂直间隔。

    eg 2.2  在项目中创建 FlowLayoutPosition 类,该类继承 JFrame 类称为窗体组件。设置该窗体的布局管理器为 FlowLayout 布局管理器的实例对象。

package com.SwingDemo;

import java.awt.*;
import javax.swing.*;

public class FlowLayoutPosition extends JFrame {
    public FlowLayoutPosition() {
        setTitle("本窗体使用流布局管理器");        // 设置窗体标题
        Container container = getContentPane();        // 创建容器对象
        // 设置窗体使用流布局管理器,使组件右对齐,并且设置组件之间的水平间隔与垂直间隔
        setLayout(new FlowLayout(2, 10, 10));
        for (int i = 0; i < 10; i++) {        // 在容器中循环添加 10 个按钮
            container.add(new JButton("button" + i));
        }
        setSize(300, 200);
        setVisible(true);        // 使窗体可见
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);        // 设置窗体关闭方式
    }

    public static void main(String[] args) {
        new FlowLayoutPosition();
    }
}

    运行结果为 :

Java核心(Swing 程序设计2-标签、图标、布局)_第2张图片 Java核心(Swing 程序设计2-标签、图标、布局)_第3张图片Java核心(Swing 程序设计2-标签、图标、布局)_第4张图片

    如果改变整个窗体的大小,其中组件的摆放位置也会相应地发生变化,这正好验证了使用流布局管理器时组件从左到右摆放,当组件填满一行后,将自动换行,直到所有组件都摆放在容器中为止。

    2.3 边界布局管理器

    在默认不指定窗体布局的情况下,Swing 组件的布局模式是边界(BorderLayout)布局管理器。

    边界布局管理器可以将容器划分为东、南、西、北、中 5 个区域,可以将组件加入到这 5 个区域中。容器调用 Container 类的 Add()  方法添加组件时可以设置此组件在边界布局管理器中的区域,区域的控制可以由BorderLayout 类中的成员变量来决定。

表 2.3 BorderLayout 类的主要成员变量
成员变量 含义
BorderLayout.NORTH 在容器中添加组件时,组件置于顶端
BorderLayout.SOUTH 在容器中添加组件时,组件置于底端
BorderLayout.EAST 在容器中添加组件时,组件置于右端
BorderLayout.WEST 在容器中添加组件时,组件置于左端
BorderLayout.CENTER 在容器中添加组件时,组件置于中间开始填充,直到与其他组件边界连接

    eg 2.3 在项目中创建 BorderLayoutPosition 类,该类继承 JFrame 类成为窗体组件,设置该窗体的布局管理器使用 BorederLayout 类的实例对象。

package com.SwingDemo;

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class BorderLayoutPositon extends JFrame {
    // 定义组件摆放位置的数组
    String[] border = { BorderLayout.CENTER, BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST };
    String[] buttonName = { "center button", "north button", "south button", "west button", "east button" };
    public BorderLayoutPositon() {
        setTitle("这个窗体使用边界布局管理器");
        Container container = getContentPane();        // 定义一个容器
        setLayout(new BorderLayout());        // 设置容器为边界布局管理器
        for (int i = 0; i < border.length; i++) {
            // 在容器中添加按钮,并设置按钮布局
            container.add(border[i], new JButton(buttonName[i]));
        }
        setSize(350, 200);        // 设置窗体大小
        setVisible(true);        // 设置窗体可见
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);        // 设置窗体关闭方式
    }

    public static void main(String[] args) {
        new BorderLayoutPositon();
    }
}

    运行结果为 :

Java核心(Swing 程序设计2-标签、图标、布局)_第5张图片

    在本例中,将布局以及组件名称分别放置在数组中,然后设置容器使用边界布局管理器,最后在循环中将按钮添加至容器中,并设置组件布局。add() 方法提供在容器中添加组件的功能,并同时设置组件的摆放位置。

    2.4  网格布局管理器

    网格(GridLayout)布局管理器将容器划分为网格,所以组件可以按行和列进行排列。在网格布局管理器中,每一个组件的大小都相同,并且网格中空格的个数由网格的行数和列数决定,如一个两行两列的网格能产生 4 个大小相等的网格。组件从网格的左上角开始,按照从左到右。从上到下的顺序加入到网格中,而且每一个组件都会填满整个网格,改变窗体的大小,组件的大小也会随之改变。

    网格布局管理器主要以下两个常用的构造方法。

    ( 1 ) : public GridLayout(int rows , int columns) 。

    ( 2 ) :public GridLayout(int rows , int columns , int horizGap , int vertGap)

    rows 与 columns 参数代表网格的行数与列数,这两个参数只有一个参数可以为 0 ,代表一行或一列可以排列任意多个组件;参数 horizGap 与 vertGap 指定网格之间的间距,其中 horizGap 参数指定网格之间的水平间距,vertGap 参数指定网格之间的垂直间距。

    eg 2.4 在项目中创建 GridLayoutPosition 类,该类继承 JFrame 类称为窗体组件,设置该窗体使用  GridLayout 布局管理器。 

package com.SwingDemo;

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class GridLayoutPositon extends JFrame {
    public GridLayoutPositon() {
        Container container = getContentPane();
        // 设置容器中使用网格布局管理器,设置 7 行 3 列的网格
        setLayout(new GridLayout(7, 3, 5, 5));
        for (int i = 0; i < 20; i++) {
            container.add(new JButton("button" + i));        // 循环添加按钮
        }
        setTitle("这是一个使用网格布局管理器的窗体");
        setSize(300, 300);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new GridLayoutPositon();
    }
}

运行结果为 :

Java核心(Swing 程序设计2-标签、图标、布局)_第6张图片  

    如果尝试改变窗体的大小,将会发现其中的组件大小也会发生相应的改变。

Java核心(Swing 程序设计2-标签、图标、布局)_第7张图片

        



你可能感兴趣的:(Java)