Java day11

第11章 在用户界面上排列组件

  • 11.1 基本的界面布局
    • 11.1.1 布置界面
    • 11.1.2 顺序布局
    • 11.1.3 方框布局
    • 11.1.4 网格布局
    • 11.1.5 边框布局
  • 11.2 使用多个布局管理器
  • 11.3 卡片布局
    • 11.3.1 在应用程序中使用卡片布局
    • 11.3.2 单元格内边距和面板内边距

11.1 基本的界面布局

11.1.1 布置界面

面板的默认布局管理器是FlowLayout类。这个类按组件加入到容器的顺序从左向右依次排列。第一行排满后,则从第二行开始,继续按从左到右的顺序排列。
通用的布局管理器:

  • FlowLayout
  • GridLayout
  • BorderLayout
  • CardLayout

创建布局管理器后,要将其用作容器的布局管理器,可调用方法setLayout()。 将组件加入到容器前,必须设置容器的布局管理器。如果没有指定布局管理器,将使用容器的默认布局:对于面板,为FlowLayout;对于框架,为BorderLayout。

11.1.2 顺序布局

类FlowLayout是最简单的布局管理器,位于java.awt中。它排列组件的方式与排列英语单词的方式相同,从左到右排列,到达行尾后,进入下一行开头。

默认情况下,如果调用构造函数FlowLayout()没有提供任何参数,每行的组件将居中排列。要让组件右对齐或左对齐,可将类变量FlowLayout.LEFT或FlowLayout.RIGHT作为唯一的参数传递给构造函数

FlowLayout rightly = new FlowLayout(FlowLayout.RIGHT)

这个管理器使用默认的水平间距(5像素)和垂直间距(5像素)。

  1. 您可以在调用构造函数FlowLayout(int,int,int)时,提供其他的参数来修改水平间距和垂直间距;
  2. 可以调用方法setVgap(int)和setHgap(int),并指定所需的水平间距和垂直间距

在这里插入图片描述

11.1.3 方框布局

方框布局(box layout)管理器将组件从左到右或从上到下排列,它是由javax.swing包中的BoxLayout类表示的,对顺序布局进行了改进——不管容器的大小如何变化,组件总是排列成一行或一列。

JPanel optionPane=new JPane();
BoxLayout box =new BOXLayout(optionPane,BoxLayout,Y_AXIS);
// X_AXIS表示按从左到右的顺序水平排列;Y_AXIS表示按从上到下的顺序垂直排列
optionPane.setLayout(box);

在这里插入图片描述

11.1.4 网格布局

网格布局是使用类GridLayout创建的,这个类位于java.awt包中。调用构造函数GridLayout时,提供两个参数:网格的行数和列数。

GridLayout gr=new GridLayout(10,3);

setHgap()setVgap()
//设置指定组件的垂直间距和水平间距

默认情况下,网格布局组件间的垂直间距和水平间距都为0.
在这里插入图片描述

11.1.5 边框布局

边框布局是使用java.awt包中的BorderLayout类创建的,它将容器分成5个部分:北、南、东、西和中央。

BorderLayout()BorderLayout(int, int)
// 创建边框布局,第一个边框布局的组件间距为0,第二个指定了水平间距和垂直间距

setVgap()setHgap()
// 设置水平间距和垂直间距

add(Component,String)
// 第一个是要加入容器的组件,第二个指定组件加入边框布局的哪个区域。(NORTH、SOUTH、EAST、WEST和CENTER)

JButton quitButton = new JButton("quit");
add(quitButton,BorderLayout.NORTH);

在这里插入图片描述

11.2 使用多个布局管理器

为了找到合适的布局,常常需要在同一个界面中使用多个布局管理器。为此,可将多个容器加入到一个更大的容器中,并给每个小容器指定布局管理器。
小容器为面板,它是使用Java.swing包中的JPanel类创建的,面板是用于将组件组合在一起的容器。使用面板时需要注意两点:

  • 将面板加入到更大容器之前,必须将相应的组件加入到面板中
  • 面板有它自己的布局管理器

11.3 卡片布局

卡片布局管理器不同于其他布局管理器,因为它隐藏一些组件。卡片布局是一组容器或组件,每次只显示其中的一个。其中的容器称为卡片。

使用卡片布局时,最常见的方式是使用面板作为卡片。首先将组件加入到面板中,然后将面板加入到使用卡片布局的容器中。

CardLayout cc = new CardLayout();
setLayout(cc)// 将容器设置为使用卡片布局管理器

add(Component,String)
// 第一个参数指定将用作卡片的容器或组件。如果是容器,将其作为卡片加入之前,必须包含所需的组件
// 第二个参数是表示卡片名称的字符串

使用卡片布局的容器首次显示时,显示的是加入到容器中的第一张卡片。要显示其他卡片,可调用show方法,该方法接受两个参数:

  • 用于放置所有卡片的容器
  • 卡片的名称
cc.show(this,"Fact Card");

关键字this指的是包含该语句的对象,Fact Card是要显示卡片的名称。

11.3.1 在应用程序中使用卡片布局

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class SurveyWizard extends JPanel implements ActionListener {

    int currentCard = 0;
    CardLayout cards = new CardLayout();
    SurveyPanel[] ask = new SurveyPanel[3];

    public SurveyWizard() {
        super();
        setSize(240, 140);
        setLayout(cards);
        // set up survey
        String question1 = "What is your gender?";
        String[] resp1 = {"female", "male", "not telling"};
        ask[0] = new SurveyPanel(question1, resp1, 2);
        String question2 = "What is your age?";
        String[] resp2 = {"Under 25", "25-34", "34-54", "Over 54"};
        ask[1] = new SurveyPanel(question2, resp2, 1);
        String qusetion3 = "How often do you exercise each week?";
        String[] resp3 = {"Never", "1-3 times", "More than 3"};
        ask[2] = new SurveyPanel(qusetion3, resp3, 1);
        ask[2].setFinalQuestion(true);
        addListenners();

    }

    private void addListenners(){
        for(int i=0;i<ask.length;i++){
            ask[i].nextButton.addActionListener(this);
            ask[i].finalButton.addActionListener(this);
            add(ask[i],"Card "+i);
        }
    }


    @Override
    public void actionPerformed(ActionEvent evt) {
        currentCard++;
        if (currentCard >= ask.length) {
            System.exit(0);
        }
        cards.show(this, "Card " + currentCard);
    }
}

class SurveyPanel extends JPanel {
    JLabel question;
    JRadioButton[] response;
    JButton nextButton = new JButton("Next");
    JButton finalButton = new JButton("Finish");

    SurveyPanel(String ques, String[] resp, int def) {
        super();
        setSize(160, 110);
        question = new JLabel(ques);
        response = new JRadioButton[resp.length];
        JPanel sub1 = new JPanel();
        ButtonGroup group = new ButtonGroup();
        JLabel quesLabel = new JLabel(ques);
        sub1.add(quesLabel);
        JPanel sub2 = new JPanel();
        for (int i = 0; i < resp.length; i++) {
            if (def == i) {
                response[i] = new JRadioButton(resp[i], true);
            } else {
                response[i] = new JRadioButton(resp[i], false);
            }
            group.add(response[i]);
            sub2.add(response[i]);
        }
        JPanel sub3 = new JPanel();
        nextButton.setEnabled(true);
        sub3.add(nextButton);
        finalButton.setEnabled(false);
        sub3.add(finalButton);
        GridLayout grid = new GridLayout(3, 1);
        setLayout(grid);
        add(sub1);
        add(sub2);
        add(sub3);
    }

    void setFinalQuestion(boolean finalQuestion) {
        if (finalQuestion) {
            nextButton.setEnabled(false);
            finalButton.setEnabled(true);
        }
    }
}

import java.awt.*;
import javax.swing.*;

public class SurveyFrame extends JFrame {
    public SurveyFrame() {
        super("Survey");
        setSize(290, 140);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLookAndFeel();
        SurveyWizard wiz = new SurveyWizard();
        add(wiz);
        setVisible(true);
    }

    private static void setLookAndFeel() {
        try {
            UIManager.setLookAndFeel(
                    "javax.swing.plaf.nimbus.NimbusLookAndFeel"
            );
        } catch (Exception exc) {
            System.err.println(exc);
        }
    }

    public static void main(String[] arguments) {
        SurveyFrame.setLookAndFeel();
        SurveyFrame surv = new SurveyFrame();
    }
}

在这里插入图片描述

11.3.2 单元格内边距和面板内边距

下面语句创建一个Insets对象,指定上、下内边距为20像素,左右边距为13像素

Insets whitespace = new Insets(20,13,20,13);
// 在容器中可以覆盖getInsets()方法,返回Insets对象指定内边距
public Insets getInsets(){
	return new Insets(10,30,10,30);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/12640.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

社科院与杜兰大学中外合作办学金融管理硕士项目——比起过往,前路更值得期待

当结束一天工作陷入沉思时&#xff0c;你有没有特别遗憾的事情呢&#xff0c;人生有太多的不确定性&#xff0c;比起过往&#xff0c;未知的人生更值得我们期待。与其懊恼没完成的遗憾&#xff0c;不如珍惜当下&#xff0c;努力创造未来。人生没有太晚的开始&#xff0c;在职读…

macOS设置环境变量和别名

因为我的mac所用shell是bash&#xff0c;所以本文中涉及的环境变量和别名配置均在~/.zshrc文件中,且在每次配置完成后&#xff0c;需要执行source ~/.zshrc命令使配置文件生效 环境变量 通过配置环境变量&#xff0c;我们可以将某个路径暴露到全局&#xff0c;这样可以在全局…

【C语言学习3——基本的C语言语法知识2】

C语言学习3——基本的C语言语法知识 标识符关键词什么是字面常量&#xff1f;printf函数printf函数更多用法 #include命令 标识符 在前面的代码中&#xff0c;由我们自己命名&#xff0c;用于指代某一个实体的名称&#xff0c;例如:add&#xff0c;result&#xff0c;函数的参…

android studio ImageView和ImageButton和Button

1.ImageView 1.1代码显示 ImageView img findViewById(R.id.img); img.setImageResource(R.drawable.apple); 1.2XML <ImageViewandroid:layout_width"match_parent"android:layout_height"match_parent"android:id"id/img"android:src&qu…

连接云服务器

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

实现开机动画和自定义Toolbar的高级写法

需求是自定义一个Toolbar和全屏展示一个第一次激活App的开机动画 1自定义Toolbar的使用 1仍然是先将工程的theme.xml中设置成NoActionBar <resources xmlns:tools"http://schemas.android.com/tools"><!-- Base application theme. --><style name&…

Spring原理学习(五):一篇讲清楚动态代理(jdk和cglib)的使用、原理和源码

目录 一、jdk动态代理的基本使用 二、cglib动态代理的基本使用 2.1 方法一&#xff1a;method.invoke() 方法反射调用 2.2 方法二&#xff08;spring使用的这个方法&#xff09;&#xff1a; methodProxy.invoke() 2.3 方法三&#xff1a;methodProxy.invokeSuper() 三、…

ChatGPT API接口使用+fine tune微调+prompt介绍

目录 1 接口调用1.1 生成key1.2 接口功能1.2.1 图片生成 (image generation)1.2.2 对话(chat)1.2.3 中文纠错 (Chinese Spelling Correct)1.2.4 关键词提取 &#xff08;keyword extract)1.2.5 抽取文本向量 (Embedding)1.2.6 微调 (fine tune) 2 如何写好prompt2.1分类任务2.2…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的拉普拉斯算法增强&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回…

【C++】从string开始了解STL

文章目录 1.初识STL1.什么是STL2.STL的版本3.STL的六大组件 2.string1.string类模板2.string类的构造函数3.string内部数据访问4.string的遍历5.string类的迭代器6.string的Capacity相关接口7.string的修改相关接口8.其他接口 1.初识STL 1.什么是STL STL(standard template l…

openpnp - 顶部相机 - 辅助光(环形灯)的电路原理图

文章目录 openpnp - 顶部相机 - 辅助光(环形灯)的电路原理图概述END openpnp - 顶部相机 - 辅助光(环形灯)的电路原理图 概述 同学帮我做的简易灯板设计不太合理, 发热量极大. 想看看商用的环形灯电路啥样的, 如果有可能, 自己做块灯板, 塞进商用环形灯外壳中. 拆解了一个环形…

从TOP25榜单,看半导体之变

据SIA报告显示&#xff0c;2022年全球半导体销售额创历史新高达到5740亿美元。尽管2022年下半年&#xff0c;半导体市场出现了周期性的低迷&#xff0c;但其全年的销售额相较2021年增长了3.3%。 近日&#xff0c;市调机构Gartner发布了全球以及中国大陆TOP25名半导体厂商的排名…

【软考数据库】第二章 程序语言基础知识

目录 2.1 程序设计语言的基本概念2.2 程序设计语言的基本成分2.3 编译程序基本原理 前言&#xff1a; 笔记来自《文老师软考数据库》教材精讲&#xff0c;精讲视频在b站&#xff0c;某宝都可以找到&#xff0c;个人感觉通俗易懂。 2.1 程序设计语言的基本概念 程序设计语言是…

《3-链表》

链表 引言&#xff1a; 存储数组需要内存空间连续&#xff0c;当我们需要申请一个很大的数组时&#xff0c;系统不一定存在这么大的连续内存空间。 而链表则更加灵活&#xff0c;不需要内存是连续的&#xff0c;只要剩余内存空间大小够用即可 1.定义 &#xff1a; 「链表 Lin…

文本批量翻译-批量翻译文件名

批量将英文翻译成中文的软件 批量将英文翻译成中文的软件的主要用途场景主要是在需要大量翻译英文文本到中文的场景下使用&#xff0c;例如&#xff1a; 商务文件翻译&#xff1a;许多企业需要将其商务文件&#xff0c;如合同、报告、信函等翻译成中文&#xff0c;以便其中文读…

Vulnhub项目:MrRobot

靶机地址&#xff1a;Mr-Robot: 1 ~ VulnHub 渗透过程&#xff1a; 先看描述&#xff0c;有3跟keys在这个靶机中 首先确定靶机ip&#xff0c;对靶机开放的端口进行探测 访问靶机地址&#xff0c;出现了很酷炫的web界面&#xff0c;这个mr.robot,是一个美剧&#xff0c;还是挺…

e-STUDIO2010AC•2520AC安装步骤

注意!在室内室外温差比较大的情况下,设备需要在室内静置240分钟以上才可以进行安装。

智慧园区综合管理平台开发基本功能有哪些?

随着智慧城市建设与信息化发展&#xff0c;园区管理也需要更加智能便捷化&#xff0c;于是智慧园区管理系统开发应运而生。智慧园区综合管理系统就是利用物联网、大数据等技术工具&#xff0c;顺应产业园区升级发展需求&#xff0c;实现园区环境、设备、安全、基础管理、资源服…

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5

原文&#xff1a;Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的…

vue关于echarts后端返回格式取值方法

在vue中&#xff0c;接口返回如下数据&#xff1a; data: {充电桩: [0, 0, 78], 红外摄像头: [0, 0, 0], 火焰探测器: [0, 1, 0], 烟雾传感器: [0, 1, 1], 限流保护器: [0, 0, 1]}&#xff0c; 其中数组里第一个值应该放在data1&#xff0c;第二个放在data2&#xff0c;第三个…