Java核心(Swing 程序设计2-标签、图标、布局) 素颜马尾好姑娘i 2022-05-20 21:30 218阅读 0赞 ### 一、标签组件与图标 ### 在 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); } } 运行结果为: ![70][] 在例子中,由于 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对象 } } 运行结果为: ![70 1][] ### 二、常用布局管理器 ### 在 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(); } } 运行结果为 : ![70 2][] 在例子中,窗体的大小、位置以及窗体内组件的大小与位置都被进行绝对布局操作。绝对布局使用 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(); } } 运行结果为 : ![70 3][] ![70 4][]![70 5][] 如果改变整个窗体的大小,其中组件的摆放位置也会相应地发生变化,这正好验证了使用流布局管理器时组件从左到右摆放,当组件填满一行后,将自动换行,直到所有组件都摆放在容器中为止。 ##### 2.3 边界布局管理器 ##### 在默认不指定窗体布局的情况下,Swing 组件的布局模式是边界(BorderLayout)布局管理器。 边界布局管理器可以将容器划分为东、南、西、北、中 5 个区域,可以将组件加入到这 5 个区域中。容器调用 Container 类的 Add() 方法添加组件时可以设置此组件在边界布局管理器中的区域,区域的控制可以由BorderLayout 类中的成员变量来决定。 <table> 表 2.3 BorderLayout 类的主要成员变量 <tbody> <tr> <td>成员变量</td> <td>含义</td> </tr> <tr> <td>BorderLayout.NORTH</td> <td>在容器中添加组件时,组件置于顶端</td> </tr> <tr> <td><span style="font-family:Arial, Verdana, sans-serif;font-size:14px;text-align:left;background-color:rgb(247,247,247);">BorderLayout.SOUTH</span></td> <td><span style="font-family:Arial, Verdana, sans-serif;font-size:14px;text-align:left;background-color:rgb(247,247,247);">在容器中添加组件时,组件置于底端</span></td> </tr> <tr> <td><span style="font-family:Arial, Verdana, sans-serif;font-size:14px;text-align:left;background-color:rgb(247,247,247);">BorderLayout.EAST</span></td> <td><span style="font-family:Arial, Verdana, sans-serif;font-size:14px;text-align:left;background-color:rgb(247,247,247);">在容器中添加组件时,组件置于右端</span></td> </tr> <tr> <td><span style="font-family:Arial, Verdana, sans-serif;font-size:14px;text-align:left;background-color:rgb(247,247,247);">BorderLayout.WEST</span></td> <td><span style="font-family:Arial, Verdana, sans-serif;font-size:14px;text-align:left;background-color:rgb(247,247,247);">在容器中添加组件时,组件置于左端</span></td> </tr> <tr> <td><span style="font-family:Arial, Verdana, sans-serif;font-size:14px;text-align:left;background-color:rgb(247,247,247);">BorderLayout.CENTER</span></td> <td><span style="font-family:Arial, Verdana, sans-serif;font-size:14px;text-align:left;background-color:rgb(247,247,247);">在容器中添加组件时,组件置于中间开始填充,直到与其他组件边界连接</span></td> </tr> </tbody> </table> 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(); } } 运行结果为 : ![70 6][] 在本例中,将布局以及组件名称分别放置在数组中,然后设置容器使用边界布局管理器,最后在循环中将按钮添加至容器中,并设置组件布局。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(); } } 运行结果为 : ![70 7][] 如果尝试改变窗体的大小,将会发现其中的组件大小也会发生相应的改变。 ![70 8][] [70]: /images/20220521/3abb6280a3254f1eb98da29a49c2318b.png [70 1]: /images/20220521/c8c50abec37c45a2ac1df6b07ed0217b.png [70 2]: /images/20220521/ceed42a76f3c41bc830cae7c55f8d0dc.png [70 3]: https://img-blog.csdn.net/20180630000538801?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pzOTQwODE0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 4]: https://img-blog.csdn.net/20180630000546106?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pzOTQwODE0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 5]: /images/20220521/b28dd772f3984e6c803ec5a579290f60.png [70 6]: /images/20220521/fb6d819aac39405b95d6d0c6e21c9076.png [70 7]: /images/20220521/04e46479ed3848bb814614b9dced4923.png [70 8]: /images/20220521/325b3d03825740aaad56b5564666f1a0.png
还没有评论,来说两句吧...