Java GUI编程6---布局管理器 曾经终败给现在 2022-05-22 01:26 164阅读 0赞 在上面了解了窗体JFrame,以及JLabel,JButton这两个组件后,我们可以发现,如果不对窗体进行版面设计,则一个组件会直接充满真个窗体,所以在Java中专门提供了布局管理器来管理组件,通过布局管理器可以使用不同方式的排列组件。每当需要重新调整屏幕大小或重新绘制平布上任一项时,都要用到布局管理器。在Swing中使用的所有布局管理器都也可以实现LayoutManager接口,在Swing中主要使用以下**五种常见的布局管理**器:`FlowLayout,BorderLayou,GridLayout,CardLayout,绝对定位`。 ### FlowLayout ### FlowLayout属于流式布局管理器,使用此种布局方式会是所有的组件像流水一样依次进行排列,FlowLayout类的常用方法及常量如下表所示 <table> <thead> <tr> <th>序号</th> <th>常量</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>public static final int CENTER</td> <td>居中对齐</td> </tr> <tr> <td>2</td> <td>public static final int LEADING</td> <td>与容器的开始端对齐方式一样</td> </tr> <tr> <td>3</td> <td>public static final int LEFT</td> <td>左对齐</td> </tr> <tr> <td>4</td> <td>public static final int RIGHT</td> <td>右对齐</td> </tr> <tr> <td>5</td> <td>public static final int TRAILING</td> <td>与容器的结束端对齐方式一样</td> </tr> </tbody> </table> <table> <thead> <tr> <th>序号</th> <th>构造方法</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>6</td> <td>public FlowLayout()</td> <td>构造一个新的FlowLayout,居中对齐,构造的水平和垂直间距是5个单位</td> </tr> <tr> <td>7</td> <td>public FlowLayout(int align)</td> <td>构造一个FlowLayout,并指定对齐方式</td> </tr> <tr> <td>8</td> <td>public FlowLayout(int align,int hgap,int vgap)</td> <td>构造一个FlowLayout,并制定对齐方式水平间距,垂直间距</td> </tr> </tbody> </table> #### 实例:窗体设置流式布局管理器FlowLayout #### import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JButton; public class FlowLayoutDemo01 { public static void main(String args[]) { JFrame frame = new JFrame("FlowLayout--流式布局管理器"); //居中对齐,水平间距3,垂直间距3 frame.setLayout(new FlowLayout(FlowLayout.CENTER, 3, 3)); //把引用写在循环外,这样值创建一个引用 JButton but = null; for (int i = 0; i < 9; i++) { // JButton but= new JButton("按钮-" + i);//这种写法会创建多个引用but,占内存 but = new JButton("按钮 " + i); frame.add(but);//把按钮添加到布局管理器中 } frame.setSize(400, 200); frame.setVisible(true); } } 运行结果: ![流式布局管理器][70] 我们把窗口宽度拉大,可以看到所有的组件(这里是按钮)都像是接龙一样,一个跟在一个后面排成一行,这就是流式布局管理器的特点。如下图所示: ![一个组件跟着一个组件,像是接龙一样][70 1] ## BorderLayout ## BorderLayout将一个窗体的版面划分为`东,西,南,北,中`五个区域,可以直接将需要的组件放到这五个区域中。BorderLayout的常用方法及常量如下表所示。 <table> <thead> <tr> <th>序号</th> <th>常量</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>public static final String EAST</td> <td>将组件设置在东区域</td> </tr> <tr> <td>2</td> <td>public static final String WEST</td> <td>将组件设置在西区域</td> </tr> <tr> <td>3</td> <td>public static final String SOUTH</td> <td>将组件设置在南区域</td> </tr> <tr> <td>4</td> <td>public static final String NORTH</td> <td>将组件设置在北区域</td> </tr> <tr> <td>5</td> <td>public static final String CENTER</td> <td>将组件设置在中区域</td> </tr> <tr> <td>6</td> <td>public BorderLayout()</td> <td>构造没有间距的布局管理器</td> </tr> <tr> <td>7</td> <td>public BorderLayout(int hgap,int vgap)</td> <td>构造有水平间距,和垂直间距的布局管理器</td> </tr> </tbody> </table> **实例:窗体设置BorderLayout** import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JButton; public class BorderLayoutDemo01 { public static void main(String args[]) { JFrame frame = new JFrame("BorderLayou布局管理器"); //设置水平间距为5,垂直间距为2的布局管理器 frame.setLayout(new BorderLayout(5, 2)); frame.add(new JButton("东(EAST)"), BorderLayout.EAST); frame.add(new JButton("西(WEST)"), BorderLayout.WEST); frame.add(new JButton("南(SOUTH)"), BorderLayout.SOUTH); frame.add(new JButton("北(NORTH)"), BorderLayout.NORTH); frame.add(new JButton("中(CENTER)"), BorderLayout.CENTER); frame.setSize(400, 200); frame.setVisible(true); } } 运行结果: ![BorderLayout实例][BorderLayout] ## 3.GridLayout ## GridLayout布局管理器是以表格形式来进行布局管理的,在使用GridLayout布局管理器是必须设置显示的行数和列数,常用的方法如下表所示。 <table> <thead> <tr> <th>序号</th> <th>方法</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>public GridLayout(int rows,int cols)</td> <td>创建指定行和列的布局管理器</td> </tr> <tr> <td>2</td> <td>public GridLayout(int rows,int cols,int hgap,int vgap)</td> <td>创建指定行和列的布局管理器,并指定水平间距hgap,垂直间距vgap</td> </tr> </tbody> </table> **实例: 窗体设置GridLayout** import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JButton; public class GridLayoutDemo01 { public static void main(String args[]) { JFrame frame = new JFrame("表格布局管理器:GridLayout"); // 3行5列,水平间距为5,垂直间距为2 frame.setLayout(new GridLayout(3, 5, 5, 2)); JButton but = null; for (int i = 0; i < 13; i++) { but = new JButton("按钮 " + i); frame.add(but); } /* * frame.pack()做了这样一件事 frame.setSize(f.getPreferredSize()); * frame的大小会被设置为最佳大小,也就是prefrredSize */ frame.pack();// 设置窗体的最佳大小 frame.setVisible(true); } } 运行结果: ![表格布局管理器:GraidLayout][GraidLayout] 在我们电脑中计算器是使用GridLayout的典型例子: ![GridLayout的典型例子][GridLayout] ## CardLayout ## GardLayout就是将一组 组件彼此重叠的进行布局,就像一张张卡片一样,这样每次只会展现出一个界面。CardLayout类的常用方法如下表所示。 <table> <thead> <tr> <th>序号</th> <th>方法</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>public CardLayout()</td> <td>构造CardLayout对象,各个组件之前的间距为0</td> </tr> <tr> <td>2</td> <td>public CardLayout(int hgap,int vgap)</td> <td>构造CardLayout对象,各个组件之前的水平间距为hgap,垂直间距为vgap</td> </tr> <tr> <td>3</td> <td>public void next(Container parent)</td> <td>转到下一张卡片</td> </tr> <tr> <td>4</td> <td>public void previous(Container parent)</td> <td>转到上一张卡片</td> </tr> <tr> <td>5</td> <td>public void first(Container parent)</td> <td>转到第一张卡片</td> </tr> <tr> <td>6</td> <td>public void last(Container parent)</td> <td>转到最后一张卡片</td> </tr> <tr> <td>7</td> <td>public void show(Container parent,String name)</td> <td>显示指定具有指定组件名称的卡片</td> </tr> </tbody> </table> 实例:设置CardLayout import java.awt.CardLayout; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JLabel; public class CardLayoutDemo01 { public static void main(String args[]) { JFrame frame = new JFrame("卡片布局管理器"); //初始化布局管理器 CardLayout card = new CardLayout(); //窗体使用卡片布局管理器 frame.setLayout(card); //获取当前窗体的容器 Container con = frame.getContentPane(); //添加标签到容器中 con.add(new JLabel("标签 1", JLabel.CENTER), "first"); con.add(new JLabel("标签 2", JLabel.CENTER), "second"); con.add(new JLabel("标签 3", JLabel.CENTER), "thrid"); con.add(new JLabel("标签 4", JLabel.CENTER), "fourth"); con.add(new JLabel("标签 5", JLabel.CENTER), "fifth"); //按最佳大小显示窗体 frame.setSize(300, 100); frame.setVisible(true); // 显示卡变布局管理器中,名称为"fourth"的卡片 card.show(con, "fourth"); while(true) { try { // 睡眠3秒 Thread.sleep(1000*5); } catch (InterruptedException e){} card.next(con);// 切换到下一个卡片中 } } } 运行结果: 显示第4张卡片,然后显示第5张卡片,接着显示第1张卡片,第2张卡片,一直这样循环下去:就不贴图了。 ![70 2][] ![70 3][] ![70 4][]其他图片等… ## 5.绝对定位 ## 如果不想在窗体中指定布局管理器,也可以通过设置绝对坐标的方式完成。在Component中提供了setBounds()方法,可以定位一个组件的坐标,使用x,y坐标表示。 次方法的定义如下 public void setBounds(int x,int y,int width,int height) 在每一组件中都存在setBounds方法,通过该方法可以设置每一个组件的具体位置。 实例:使用绝对定位排版 import javax.swing.JFrame; import java.awt.Color; import javax.swing.JButton; import javax.swing.JLabel; public class AbsoluteLayoutDemo01 { public static void main(String args[]) { JFrame frame = new JFrame("设置绝对定位"); frame.setLayout(null); JLabel label = new JLabel("标签"); JButton button1 = new JButton("按钮1"); JButton button2 = new JButton("按钮2"); frame.setSize(400, 200); // setBounds(int x,int y,int width,int height) //设置标签的位置坐标(200,50),宽度50,高度100 label.setBounds(200, 50, 50, 100); // 设置标签背景颜色 label.setOpaque(true);// label.setBackground(Color.PINK); button1.setBounds(10, 30, 80, 40); button1.setBackground(Color.yellow); button2.setBounds(100, 30, 80, 40); button2.setBackground(Color.YELLOW); frame.add(label); frame.add(button1); frame.add(button2); frame.setVisible(true); } } 运行结果: ![使用绝对定位进行窗体布局][70 5] 使用绝对定位的好处就是,无论窗体大小如何改变,组件的位置时固定不动的。而前面的各种排版,当窗体形状改变时,组件的大小也会跟着改变。 改变窗体大小: ![使用绝对定位改变窗体大小组件不动][70 6] [70]: /images/20220522/35a4e0827cde408e84716b6e3e4062c3.png [70 1]: /images/20220522/d97ebd7628be45c3b2a9df6832321726.png [BorderLayout]: /images/20220522/f050c21e09ca43a28a38fa717d9ff1ae.png [GraidLayout]: /images/20220522/f8847aa61e3c4fe6b04a4ade057c8f19.png [GridLayout]: /images/20220522/72261afcbf9841fa93c115951b4027e8.png [70 2]: https://img-blog.csdn.net/2018061215200776?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 3]: https://img-blog.csdn.net/20180612152032532?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIxODA4OTYx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 4]: /images/20220522/0ce1cd34ac634d6ca41fd159742e5db1.png [70 5]: /images/20220522/22df9a1c73ce4060999e93d505f6210d.png [70 6]: /images/20220522/c7b43d809a014464ada3bb1789de1ba7.png
相关 在Java GUI编程中,布局管理器问题 在Java GUI编程中,布局管理器是负责控件在容器中的排列方式的关键组件。以下是一些常见的布局管理器问题和解决方法: 1. **空空间问题**:某些布局可能无法充分利用所有 妖狐艹你老母/ 2024年09月16日 02:39/ 0 赞/ 11 阅读
相关 基于Java的GUI编程:布局管理器示例 在Java GUI编程中,布局管理器(Layout Managers)用于定义组件如何在窗口中分布。以下是一个使用Java Swing库中的布局管理器创建简单GUI的例子。 àì夳堔傛蜴生んèń/ 2024年09月10日 21:54/ 0 赞/ 11 阅读
相关 GUI三种布局管理器(java) 1.流式布局 public class TextFlowLayout { public static void main(Strin 朱雀/ 2023年01月14日 14:57/ 0 赞/ 158 阅读
相关 GUI:AWT之布局管理器 布局管理器 1. 流式布局 2. 东西南北中 3. 表格布局 流式布局 示例代码: import java.awt.; //1.流式布局 绝地灬酷狼/ 2022年11月10日 10:45/ 0 赞/ 169 阅读
相关 Java GUI编程6---布局管理器 在上面了解了窗体JFrame,以及JLabel,JButton这两个组件后,我们可以发现,如果不对窗体进行版面设计,则一个组件会直接充满真个窗体,所以在Java中专门提供了布局 曾经终败给现在/ 2022年05月22日 01:26/ 0 赞/ 165 阅读
相关 GUI之布局管理器(二) 上篇我们已经介绍了FlowLayout 、BordLayout、CardLayout、GridLayout等四种布局管理器,本篇我们继续补充其它几种布局管理器。 > 五、Gr 「爱情、让人受尽委屈。」/ 2022年05月15日 08:50/ 0 赞/ 192 阅读
相关 GUI之布局管理器(一) 在图形用户界面设计(GUI)过程中,我们经常会用到布局管理器,那么常用的布局管理器有哪些呢?它们又具有什么特征呢? > 一、FlowLayout(流式布局) 1、特点: 爱被打了一巴掌/ 2022年05月15日 08:37/ 0 赞/ 416 阅读
相关 Java图形界面(GUI)之布局管理器 一个友好的读者界面是一款软件成功的关键因素之一。布局管理器就是用来管理读者的界面。摆放的效果直接影响到界面是否美观。布局管理器通过布局管理类来对各种读者组件进行管理。 使用 小灰灰/ 2022年05月09日 03:38/ 0 赞/ 320 阅读
相关 GUI——布局管理器 GUI——布局管理器 1.GUI之布局管理器 布局管理器 java语言中,提供了布局管理器类的对象可以管理 管理Component在Containe 朴灿烈づ我的快乐病毒、/ 2022年04月06日 10:46/ 0 赞/ 264 阅读
还没有评论,来说两句吧...