三布局管理器
Swing 中, 每个组件在容器中都有一个具体的位置和大小, 在容器中摆放各自组件时很难判断其具体位置和大小, 这里我们就要引入布局管理器了, 它提供了基本的布局功能, 可以有效的处理整个窗体的布局常用的布局管理器包括流布局管理器边界布局管理器网格布局管理器等
1. 绝对布局
绝对布局在上一篇的例子中已经出现过了, 是硬性指定组件在容器中的位置和大小, 可以使用绝对坐标的方式来指定组件的位置步骤如下:
(1)使用 Container.setLayout(null)方法取消布局管理器
(2)使用 Container.setBounds()方法设置每个组件的位置和大小
举一个简单的例子:
- Container container = getContentPane(); // 创建容器
- JButton jb = new JButton("按钮"); // 创建按钮
- jb.setBounds(10, 30, 100, 30); // 设置按钮位置和大小
- container.add(jb); // 将按钮添加到容器中
setBounds()方法中, 前两个参数是位置的 xy 坐标, 后两个参数是按钮的长和宽
2. 流布局管理器
流布局管理器是布局管理器中最基本的布局管理器, 使用 FlowLayout 类, 像流一样从左到右摆放组件, 直到占据了这一行的所有空间, 再向下移动一行组件在每一行的位置默认居中排列, 要更改位置可自行设置
在 FlowLayout 的有参构造方法中, alignment 设置为 0 时, 每一行的组件将被指定左对齐排列; 当 alignment 被设置为 2 时, 每一行的组件将被指定右对齐排列; 而为 1 时是默认的居中排列
下面举个例子, 创建 10 个按钮并用流布局管理器排列
- import java.awt.Container;
- import java.awt.FlowLayout;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.WindowConstants;
- public class FlowLayoutDemo extends JFrame {
- public FlowLayoutDemo() {
- Container container = this.getContentPane();
- // 设置流布局管理器, 2 是右对齐, 后两个参数分别为组件间的水平间隔和垂直间隔
- this.setLayout(new FlowLayout(2, 10, 10));
- // 循环添加按钮
- for (int i = 0; i < 10; i++) {
- container.add(new JButton("按钮" + i));
- }
- this.setSize(300, 200);
- this.setVisible(true);
- this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- }
- public static void main(String[] args) {
- new FlowLayoutDemo();
- }
- }
第一个参数为 2 是右对齐, 每个按钮间的水平垂直间隔都为 10 后两个图分别为参数为 1 居中排列和参数为 0 左对齐运行结果如下:
3. 边界布局管理器
在不指定窗体布局时, Swing 组件默认的布局管理器是边界布局管理器, 使用的是 BorderLayout 类在上篇例子中, 一个 JLabel 标签占据了整个空间, 实质上是默认使用了边界布局管理器边界布局管理器还可以容器分为东南西北中五个区域, 可以将组件加入这五个区域中
下面举一个实例
- import java.awt.BorderLayout;
- import java.awt.Container;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.WindowConstants;
- public class BorderLayoutDemo extends JFrame {
- private String[] border = {BorderLayout.CENTER, BorderLayout.NORTH,
- BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST}; // 此数组用于存放组件摆放位置
- private String[] button = {"中", "北", "南", "西", "东"}; // 此数组用于存放按钮名称
- public BorderLayoutDemo() {
- Container container = this.getContentPane();
- this.setLayout(new BorderLayout()); // 设置容器为边界布局管理器
- // 循环添加按钮
- for(int i=0; i<button.length ; i++) {
- container.add(border[i], new JButton(button[i])); // 左参数为设置布局, 右参数为创建按钮
- }
- this.setVisible(true);
- this.setSize(300, 200);
- this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- }
- public static void main(String[] args) {
- new BorderLayoutDemo();
- }
- }
运行结果如下:
4. 网格布局管理器
网格布局管理器将容器划分为网格, 组件按行按列排列, 使用 GridLayout 类在此布局管理器中, 每个组件的大小都相同, 且会填满整个网格, 改变窗体大小, 组件也会随之改变
下面看一个实例
- import java.awt.Container;
- import java.awt.GridLayout;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.WindowConstants;
- public class GirdLayoutDemo extends JFrame {
- public GirdLayoutDemo() {
- Container container = this.getContentPane();
- this.setLayout(new GridLayout(7, 3, 5, 5)); // 前两个参数为 7 行 3 列, 后两个参数为网格间的间距
- for (int i = 0; i < 20; i++) {
- container.add(new JButton("按钮" + i));
- }
- this.setVisible(true);
- this.setSize(300, 300);
- this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- }
- public static void main(String[] args) {
- new GirdLayoutDemo();
- }
- }
运行结果如下, 网格共 7 行 3 列, 网格间的横向纵向间距都为 5:
四面板
面板也是一个容器, 可作为容器容纳其他组件, 但也必须被添加到其他容器中 Swing 中常用面板有 JPanel 面板和 JScrollPane 面板
1. JPanel
JPanel 面板可以聚集一些组件来布局继承自 java.awt.Container 类
下面举个例子
- import java.awt.Container;
- import java.awt.GridLayout;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.WindowConstants;
- public class JPanelDemo extends JFrame {
- public JPanelDemo() {
- Container container = this.getContentPane();
- container.setLayout(new GridLayout(2, 1, 10, 10)); // 整个容器为 2 行 1 列
- JPanel p1 = new JPanel(new GridLayout(1, 3)); // 初始化一个面板, 设置 1 行 3 列的网格布局
- JPanel p2 = new JPanel(new GridLayout(1, 2)); // 初始化一个面板, 设置 1 行 2 列的网格布局
- JPanel p3 = new JPanel(new GridLayout(2, 1)); // 初始化一个面板, 设置 2 行 1 列的网格布局
- JPanel p4 = new JPanel(new GridLayout(3, 2)); // 初始化一个面板, 设置 3 行 2 列的网格布局
- p1.add(new JButton("1")); // 在 JPanel 面板中添加按钮
- p1.add(new JButton("1")); // 在 JPanel 面板中添加按钮
- p1.add(new JButton("1")); // 在 JPanel 面板中添加按钮
- p2.add(new JButton("2")); // 在 JPanel 面板中添加按钮
- p2.add(new JButton("2")); // 在 JPanel 面板中添加按钮
- p3.add(new JButton("3")); // 在 JPanel 面板中添加按钮
- p3.add(new JButton("3")); // 在 JPanel 面板中添加按钮
- p4.add(new JButton("4")); // 在 JPanel 面板中添加按钮
- p4.add(new JButton("4")); // 在 JPanel 面板中添加按钮
- p4.add(new JButton("4")); // 在 JPanel 面板中添加按钮
- p4.add(new JButton("4")); // 在 JPanel 面板中添加按钮
- p4.add(new JButton("4")); // 在 JPanel 面板中添加按钮
- p4.add(new JButton("4")); // 在 JPanel 面板中添加按钮
- container.add(p1); // 在容器中添加面板
- container.add(p2); // 在容器中添加面板
- container.add(p3); // 在容器中添加面板
- container.add(p4); // 在容器中添加面板
- this.setVisible(true);
- this.setSize(500, 350);
- this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- }
- public static void main(String[] args) {
- new JPanelDemo();
- }
- }
运行结果如下, 可自行对比代码与结果理解 JPanel 其中, 容器的 GridLayout 布局设置了横纵都为 10 的间距, JPanel 的 GridLayout 布局没有设置网格间距
2. JScrollPane
若遇到一个较小的容器窗体中显示一个较大部分内容的情况, 可用 JScrollPane 面板这是一个带滚动条的面板, 就像平时浏览网页, 经常遇到的滚动条一样
如果需要在 JScrollPane 面板中放置多个组件, 需将这多个组件放置在 JPanel 面板上, 然后将 JPanel 面板作为一个整体组件添加在 JScrollPane 面板上
下面看一个例子
- import java.awt.Container;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
- import javax.swing.ScrollPaneConstants;
- import javax.swing.WindowConstants;
- public class JScrollPaneDemo extends JFrame {
- public JScrollPaneDemo() {
- Container container = this.getContentPane();
- JTextArea tArea = new JTextArea(20, 50); // 创建文本区域组件
- tArea.setText("http://www.cnblogs.com/adamjwh/");
- JScrollPane sp = new JScrollPane(tArea);
- container.add(sp);
- this.setVisible(true);
- this.setSize(300, 150);
- this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- }
- public static void main(String[] args) {
- new JScrollPaneDemo();
- }
- }
其中 JTextArea 是创建一个文本区域组件, 大小为 20*50,setText()方法是给该文本区域填值这里在 new 一个 JScrollPane 时, 就将文本区域组件添加到其上运行结果如下:
如果要控制滚动条是否出现等, 可查看 API 直接使用相应方法
五按钮组件
1. 提交按钮组件(JButton)
JButton 在之前的例子中已经出现多次, 是较为常用的组件, 用于触发特定动作可以在按钮上显示文本标签, 还可以显示图标, 如下:
- JButton jb = new JButton();
- jb.setIcon(icon); // 设置图标
- jb.setToolTipText("图片按钮"); // 设置按钮提示
2. 单选按钮组件(JRadioButton)
默认情况下, 单选按钮显示一个圆形图标, 通常在其旁放置一些说明性文字当用户选中某个单选按钮后, 按钮组中其它按钮将被自动取消, 这时就需要按钮组 (ButtonGroup) 来将同组按钮放在一起, 该按钮组中的按钮只能选择一个, 而不在此按钮中的按钮不受影响语法格式如下:
- JRadioButton jr1 = new JRadioButton();
- JRadioButton jr1 = new JRadioButton();
- JRadioButton jr1 = new JRadioButton();
- ButtonGroup group = new ButtonGroup();
- group.add(jr1);
- group.add(jr2);
- group.add(jr3);
3. 复选框组件(JCheckBox)
复选框是一个方块图标, 外加一段描述性文字, 与单选按钮的区别就是可以多选每一个复选框都提供选中与不选中两种状态语法格式如下:
JCheckBox jrb = new JCheckBox();
六列表组件
1. 下拉列表(JComboBox)
下拉列表框使用 JComboBox 类对象来表示, 如下方代码:
- JComboBox status = new JComboBox();
- status.addItem(null);
- status.addItem("正在上映");
- status.addItem("即将上映");
- status.addItem("下架");
显示的样式如下:
2. 列表框(JList)
列表框只是在窗体上占据固定的大小, 如果要使列表框具有滚动效果, 可以将列表框放入滚动面板中
使用数组初始化列表框的参数如下
- String[] contents = {"1", "2", "3"};
- JList jl = new JList(contents);
将 Vector 类型的数据作为初始化 JList 的参数如下
- Vector contents = new Vector();
- JList jl = new JList(contents);
- contents.add("1");
- contents.add("2");
- contents.add("3");
七文本组件
1. 文本框(JTextField)
文本框用来显示或编辑一个单行文本, 语法格式如下:
- JTextField jt = new JTextField("aaa"); // 创建一个文本框, 值为 aaa
- JTextField jt2 = new JTextField("aaa", 20); // 创建一个长度为 20 的文本框, 值为 aaa
- jt.setText(""); // 将文本框置空
其余构造方法可参考 API
2. 密码框(JPasswordField)
密码框与文本框的定义与用法类似, 但会使用户输入的字符串以某种符号进行加密如下方代码:
- JPasswordField jp = new JPasswordField();
- jp.setEchoChar('#'); // 设置回显符号
3. 文本域(JTextArea)
文本域组件在上面的代码中已经出现了, 如下方代码所示:
- JTextArea tArea = new JTextArea(20, 50); // 创建文本区域组件
- tArea.setText("http://www.cnblogs.com/adamjwh/");
以上就是 Swing 的全部内容了, 没有太过深入的内容, 在校做 Java 课设的话会用到这部分知识, 而在外工作的很少有使用 Swing 的, 所以就介绍个大概的知识至于 Swing 的高级组件, JTabel 高级布局管理器监听事件等就不再介绍了, 想了解的朋友可自行查阅资料
进阶篇到这里就写完了, 如果后面有时间可能会再写个高级篇之类的, 写一些线程 JDBC 等 Java 都写完了的话可能会再开一篇有关 Javaweb 的内容, 或者写一些基于 Java 的小游戏制作
来源: https://www.cnblogs.com/adamjwh/p/8399670.html