Java GUI 容器与布局

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 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用于控制查看的次序。通常会将面板按照卡片布局插入。


目录
相关文章
|
4月前
|
Kubernetes Cloud Native Java
云原生之旅:从容器到微服务的演进之路Java 内存管理:垃圾收集器与性能调优
【8月更文挑战第30天】在数字化时代的浪潮中,企业如何乘风破浪?云原生技术提供了一个强有力的桨。本文将带你从容器技术的基石出发,探索微服务架构的奥秘,最终实现在云端自由翱翔的梦想。我们将一起见证代码如何转化为业务的翅膀,让你的应用在云海中高飞。
|
4月前
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
25天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
65 4
|
2月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
88 3
|
2月前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
30 0
深入理解java对象的内存布局
|
4月前
|
容器 iOS开发 Linux
震惊!Uno Platform 响应式 UI 构建秘籍大公开!从布局容器到自适应设计,带你轻松打造跨平台完美界面
【8月更文挑战第31天】Uno Platform 是一款强大的跨平台应用开发框架,支持 Web、桌面(Windows、macOS、Linux)及移动(iOS、Android)等平台,仅需单一代码库。本文分享了四个构建响应式用户界面的最佳实践:利用布局容器(如 Grid)适配不同屏幕尺寸;采用自适应布局调整 UI;使用媒体查询定制样式;遵循响应式设计原则确保 UI 元素自适应调整。通过这些方法,开发者可以为用户提供一致且优秀的多设备体验。
183 0
|
4月前
|
Java 测试技术 数据库
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
33 0
|
4月前
|
存储 安全 Java
【Java 第四篇章】流程控制、容器
本文档详细介绍了Java中的流程控制、集合类型、数组声明及容器的声明与遍历等内容。在流程控制部分,包括了if、if...else、if...else if...else、switch等语句的使用方法,并提供了具体示例。接着,文档对比分析了Java中单列集合(如HashSet、LinkedHashSet、TreeSet等)与双列集合(如HashMap、LinkedHashMap、Hashtable等)的特点及底层实现原理。此外,还介绍了如何声明与初始化数组,并提供了多种循环结构的使用示例。最后,通过具体的代码示例展示了不同集合类型的声明、基本操作(如添加、删除、更新、查找)以及遍历方法。
24 0
|
容器
Java---布局管理代码简单使用(解答1)
Java---布局管理代码简单使用(解答)
164 0
Java---布局管理代码简单使用(解答1)