Java GUI 容器与布局

简介: Java GUI 容器与布局

GUI 图型界面的实现。

使用的主要包:import javax.swing.*  与  import java.awt.*

容器:是用来容纳其他组件的特殊组件。

1  顶层容器:JFrame  JApplet  JDialog  JWindow

2  中间容器:JPanel  JScrollPane  JSplitPane  JDesktopPane  JToolBar

3  特殊容器:JInternalFrame  JLayeredPane  JRootPane  在GUI中起特殊作用的中间层

注意:只有顶层容器可以独立的显示出来,其他容器需要放在顶层容器中才能显示出来。一个容器可以通过调用add()方法为该容器添加组件。为此Java引入了布局管理器(LayoutManager),来确定组件按照布局管理器的格式来布局。

创建 GUI 步骤

1  创建顶层容器。

2  指定容器的布局管理器。

3  用add()方法添加各种创建好的组件。

方法:

1  setTitle(String  title) : 设置窗体标题也可在创建对象时作为参数命名。

2  setLayout(new  布局管理器类型): 创建布局管理器。

3  add(组件名称):添加组件。

4  setBounds(int x , int y , int width , int height) : 设置窗体的显示:x , y 显示的位置,width , height 窗体的大小。

5  setVisable(Boolean b):设置窗体是否显示。

6  setDefaultCloseOperation(int operation) :

 a: “0”或JFrame.DO_NOTHING_ON_CLOSE:不执行任何操作。

 b: “1”或JFrame.HIDE_ON_CLOSE:隐藏该窗体。此时没有关闭程序,只是将程序界面隐藏

 c: “2”或JFrame.DISPOSE_ON_CLOSE:隐藏并释放该窗体。但继续运行应用程序,释放了窗体中占用的资源。

 d: “3”或JFrame.EXIT_ON_CLOSE: 使用 System exit 方法退出应用程序。

例:

import java.awt.*;
import javax.swing.*;
public class Test{
    public static void main(String[] args) throws Exception{
        JFrame frame = new JFrame("My name is JFrame");//创建对象,并命名与setTitle方法相同
        frame.setLayout(new BorderLayout());//设置布局格式
        JButton button = new JButton();//创建按钮对象
        frame.add(button);//添加按钮对象
        frame.setBounds(300,200,400,200);//出现的位置与大小
        frame.setVisible(true);//是否可见
        frame.setDefaultCloseOperation(3);//退出的方式 与JFrame.EXIT_ON_CLOSE 相同
    }
}

中间容器:面板 JPanel  JScrollPane  JSplitPane

1  如果不使用面板,则只有一种布局管理器,无法实现分区与分块。

2  一些布局格式只能放有限个组件,无法满足需求通过面板可以增加组件量。

3  可以引入带滚动条(JScrollPane)和可分割(JSplitPane)的面板。

例 JPanel

import java.awt.*;
import javax.swing.*;
public class Test{
    public static void main(String[] args) throws Exception{
        //顶层容器的设计
        JFrame frame = new JFrame("使用JPanel");
        frame.setLayout(new BorderLayout());
        frame.setBounds(500,200,400,200);
        frame.setDefaultCloseOperation(3);
        //中间容器的上层对象设计
        JPanel topPanel = new JPanel();
        frame.add(topPanel,BorderLayout.NORTH);
        JLabel show = new JLabel("请输入姓名");//创建提示标签
        JTextField input = new JTextField();//创建输入框
        input.setEditable(true);//输入框设置为可编辑
        input.setHorizontalAlignment(SwingConstants.LEFT);//输入框格式设计
        input.setColumns(20);//输入框的列数设置
        JButton button = new JButton("提交");//创建提交按钮
        topPanel.add(show);
        topPanel.add(input);
        topPanel.add(button);
        //中间容器的下层对象设计
        JPanel bottomPanel = new JPanel();
        frame.add(bottomPanel,BorderLayout.CENTER);
        JLabel show2 = new JLabel("显示所有输入姓名:");//创建提式标签
        JTextArea output = new JTextArea();//创建输出框
        output.setRows(5);//输出框行数设置
        output.setColumns(32);//输出框列数设置
        output.setEditable(false);//输出框设置为禁止编辑
        bottomPanel.add(show2);
        bottomPanel.add(output);
        //最后设置能否可见
        frame.setVisible(true);
    }
}

效果图  image.png

注意:最后在写setVisible否则组件无法一开始就显示出来。

JScrollPane提供4个常用方法:

1  setViewportView( Component view ): 设置在滚动面板中的显示的组件对象。

2  setWheelScrollingEnabled(boolean arge):设置滚动面板的滚动条是否支持鼠标的滚动轮。

3  setHorizontalScrollBarPolicy(int policy):设置水平滚动条的显示策略。

4  setVerticalScrollBarPolicy(int policy):设置垂直滚动条的显示策略。

JSplitPane提供4个常用方法:

1  setOrientation(int orientation):用于设置面板分割方式即水平分割参数(HORIZNTAL_SPLIT)垂直分割(VERTICAL_SPLIT)。

2  setDividerLocation(double proportionalLocatio):用于设置面板的分割比例,即左右或上下的区域占比。

3  setLeftComponent(Component comp):为面板左侧(或上侧)添加组件。

4  setRightComponent(Component comp):为面板右侧(或下侧)添加组件。

布局: java.awt.*

1  使用布局管理器,则其对应的各组件的大小位置已经被布局管理器所管理,用户无法设置这些属性。

2  如果用户想自己控制组件的大小和位置,可取消布局管理器,即调用 setLayout(null) 将布局管理器设置为空。

布局管理器:

1  若不使用 setLayout(null) 则 setBounds(int x , int y , int width , int height) ,可以设置组件在容器中的位置,大小。

import javax.swing.*;
import java.awt.*;
public class Test{
    public static void main(String[] args) {
        JFrame frame = new JFrame("未使用布局管理器");
        frame.setDefaultCloseOperation(3);
        frame.setLayout(null);//不适用布局管理器
        //创建用户标签并设置其起始位置与大小
        JLabel label = new JLabel("用户名:");
        label.setBounds(40,20,80,30);
        //创建用户名输入框,并设置起始位置与大小
        JTextField textField = new JTextField();
        textField.setEditable(true);//能否输入
        textField.setHorizontalAlignment(SwingConstants.LEFT);//左对齐输入
        textField.setColumns(20);//20列
        textField.setBounds(100,20,120,30);
        //创建登录按钮,并设置起始位置与大小
        JButton button = new JButton("登录");
        button.setBounds(130,60,60,30);
        //添加到容器
        frame.add(label);
        frame.add(textField);
        frame.add(button);
        //设置容器的大小并显示
        frame.setBounds(400,200,300,160);
        frame.setVisible(true);
    }
}

效果图:

image.png

2  边界布局管理器 :BorderLayout

JFrame默认的布局管理器,将容器划分为5个部分:容器顶层(NORTH),容器底层(SOUTH),容器中心(CENTER),容器左侧(WEST),容器右侧(EAST)。可通过add方法控制其位置 : frame.add(northLabel , BorderLayout.NORTH);  来控制其位置。                       此外还有setHgap(int hgap) 与setVgap(int vgap)来设置,各区域水平与垂直距离,以像素为位。

import javax.swing.*;
import java.awt.*;
public class Test{
    public static void main(String[] args) {
        JFrame frame = new JFrame("使用边界布局管理器");
        frame.setDefaultCloseOperation(3);
        frame.setLayout(new BorderLayout());//使用边界布局管理器
        //创建用户标签并设置其起始位置与大小
        JLabel label = new JLabel("用户名:");
        label.setBounds(40,20,80,30);//不在起作用
        //创建用户名输入框,并设置起始位置与大小
        JTextField textField = new JTextField();
        textField.setEditable(true);//能否输入
        textField.setHorizontalAlignment(SwingConstants.LEFT);//左对齐输入
        textField.setColumns(20);//20列
        textField.setBounds(100,20,120,30);//不在起作用
        //创建登录按钮,并设置起始位置与大小
        JButton button = new JButton("登录");
        button.setBounds(130,60,60,30);//不在起作用
        //添加到容器
        frame.add(label,BorderLayout.NORTH);//容器顶层
        frame.add(textField,BorderLayout.CENTER);//容器中心
        frame.add(button,BorderLayout.SOUTH);//容器底层
        //设置容器的大小并显示
        frame.setBounds(400,200,300,160);
        frame.setVisible(true);
    }
}

效果图:

image.png

 

3  顺序布局 : FlowLayout

JPanel默认的布局管理器,布局策略:在一行上排列组件,当该行没有足够的空间时,则换行显示,当容器的大小改变时,组件将自动重排。该类默认居中显示,但可通过setAlignment(int aling)方法来设置对其方式,即参数:(LEFT) 靠左显示,(RIGHT) 靠有显示,(CENTER)默认居中显示。同样还有setHgap(int hgap) 与setVgap(int vgap)来设置,各区域水平与垂直距离。

import javax.swing.*;
import java.awt.*;
public class Test{
    public static void main(String[] args) {
        JFrame frame = new JFrame("使用顺序布局管理器");
        frame.setDefaultCloseOperation(3);
        frame.setLayout(new FlowLayout());//使用顺序布局管理器
        //创建用户标签并设置其起始位置与大小
        JLabel label = new JLabel("用户名:");
        label.setBounds(40,20,80,30);//不在起作用
        //创建用户名输入框,并设置起始位置与大小
        JTextField textField = new JTextField();
        textField.setEditable(true);//能否输入
        textField.setHorizontalAlignment(SwingConstants.LEFT);//左对齐输入
        textField.setColumns(20);//20列
        textField.setBounds(100,20,120,30);//不在起作用
        //创建登录按钮,并设置起始位置与大小
        JButton button = new JButton("登录");
        button.setBounds(130,60,60,30);//不在起作用
        //添加到容器
        frame.add(label);
        frame.add(textField);
        frame.add(button);
        //设置容器的大小并显示
        frame.setBounds(400,200,300,160);
        frame.setVisible(true);
    }
}

效果图:

image.png

 

4  网格布局:GridLayout

使容器中的各组件呈M行×N列的网格状分布。各组件的排列方式为:从上到下,从左到右。设置网格布局行数和列数时,行数或者列数可以有一个为零。构造方法:GridLayout(int rows, int clos) a  若 (rows > 0 , cols = 0);容器将先按行排列组件,当组件数>rows时自动增加一列;                  b  若 (rows = 0 , cols > 0);容器将先按列排列组件,当组件数>cols时自动增加一行;                    c  若 (rows > 0 , clos > 0);容器将先按行排列组件,当组件数>rows时自动增加一列;                  同样还有setHgap(int hgap) 与setVgap(int vgap)来设置,各区域水平与垂直距离。  

import javax.swing.*;
import java.awt.*;
public class Test{
    public static void main(String[] args) {
        JFrame frame = new JFrame("使用网格布局管理器");
        frame.setDefaultCloseOperation(3);
        frame.setLayout(new GridLayout(2,2));//使用网格布局管理器
        //创建用户标签并设置其起始位置与大小
        JLabel label = new JLabel("用户名:");
        label.setBounds(40,20,80,30);//不在起作用
        //创建用户名输入框,并设置起始位置与大小
        JTextField textField = new JTextField();
        textField.setEditable(true);//能否输入
        textField.setHorizontalAlignment(SwingConstants.LEFT);//左对齐输入
        textField.setColumns(20);//20列
        textField.setBounds(100,20,120,30);//不在起作用
        //创建登录按钮,并设置起始位置与大小
        JButton button = new JButton("登录");
        button.setBounds(130,60,60,30);//不在起作用
        //添加到容器
        frame.add(label);
        frame.add(textField);
        frame.add(button);
        //设置容器的大小并显示
        frame.setBounds(400,200,300,160);
        frame.setVisible(true);
    }
}

效果图:

image.png

5  卡片布局CardLayout

布局策略:将容器分为若干层,将个组件按层放入,每次只能看到一层,在调用add()方法添加组件时,除了提供组件对象外,第二个参数要为组件指定一个字符串名称。若要查看某一个组件,可调用show(frame.getContentPane() , String name)方法查看。还提供了next ,  previous , first , last用于控制查看的次序。通常会将面板按照卡片布局插入。


目录
相关文章
|
2月前
|
Java 虚拟化 容器
(Java)Java里JFrame窗体的基本操作(容器布局篇-1)
容器 容器,我的理解是可以包容其他东西的玩意。它可以是一个盒子,可以是一个虚拟化的物品,可只要能包裹住其他存在质体的东西,那么都可以称作是容器。例如:JPanel组件和JScollPane组件两者都是容器也是组件。 既然有容器,那么容器中的布局就必不可少了。不然不规矩的摆放物品,人类看不习惯,我也看不习惯 ???? 本篇内容,将说明java JFrame窗体里容器中几类布局。 说明:所有在JFrame窗体里的容器布局都会使用setLayout()方法,采用的布局参数都将放进这个方法里 绝对布局 调用窗体容器
118 1
|
9月前
|
前端开发 API 开发者
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
803 75
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
|
6月前
|
设计模式 开发者 UED
123. [HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 基础篇
在现代移动应用和平板应用中,侧边栏导航已经成为一种常见且实用的UI设计模式。HarmonyOS NEXT提供了专门的`SideBarContainer`组件来实现这一功能,它能够轻松创建可显示和隐藏的侧边栏布局,非常适合新闻阅读、电子商务、文件管理等应用场景。
182 3
123. [HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 基础篇
|
6月前
|
UED 容器
124.[HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 进阶篇
在基础篇中,我们学习了如何使用HarmonyOS NEXT的`SideBarContainer`组件创建新闻阅读应用的基本侧边栏布局。本篇教程将深入探讨如何为新闻阅读应用添加更多交互功能和状态管理,提升用户体验。
139 1
124.[HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 进阶篇
|
5月前
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
126 0
|
6月前
|
存储 缓存 安全
Java 集合容器常见面试题及详细解析
本文全面解析Java集合框架,涵盖基础概念、常见接口与类的特点及区别、底层数据结构、线程安全等内容。通过实例讲解List(如ArrayList、LinkedList)、Set(如HashSet、TreeSet)、Map(如HashMap、TreeMap)等核心组件,帮助读者深入理解集合容器的使用场景与性能优化。适合准备面试或提升开发技能的开发者阅读。
120 0
|
6月前
|
缓存 Java API
Java 集合容器实操技巧与案例详解
本教程基于Java 8+新特性和现代开发实践,深入讲解Java集合容器的实操技巧。通过具体场景演示Stream API数据处理、ConcurrentHashMap并发控制、LinkedHashMap实现LRU缓存、TreeSet自定义排序等高级特性。同时涵盖computeIfAbsent优化操作、EnumMap专用集合使用、集合统计与运算(交集、并集、差集)等内容。代码示例丰富,助力掌握高效编程方法。[点击获取完整代码](https://pan.quark.cn/s/14fcf913bae6)。
89 0
|
6月前
|
UED 容器
10.HarmonyOS Next布局进阶:嵌套Flex容器与空间分配策略
在HarmonyOS Next的ArkUI框架中,Flex布局是构建用户界面的核心技术之一。通过嵌套使用Flex容器,我们可以创建复杂而灵活的界面结构,满足各种应用场景的需求。本教程将深入探讨如何在HarmonyOS Next中使用嵌套Flex容器实现复杂布局,以及如何合理分配和控制空间。
188 0
|
10月前
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
191 2
Java容器及其常用方法汇总
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?