JavaGUI(但期末速成版)之容器和控件

 点击返回标题->JavaGUI期末速成版-CSDN博客


前言

依旧先声明,本篇记录的JavaGUI编程都是十分精简的,内容只取常用的、套路的、应付期末考试的。


在学习本篇之前,很有必要先弄清楚Java基于swing包下的图形化编程的层次逻辑。

在前一篇中,我们粗略明白了主窗口(JFrame类对象)和子窗口(JDialog类对象)。

在此基础上,我们进一步想往窗口中加入一些东西,比如标签、按钮、文本框等等(习惯称这些玩意叫作“组件”)。

先卖个关子——想一想,组件是直接塞在窗口里的嘛?

答案为否,我们必须借助一个名为容器的东西,先把容器嵌在窗口中,然后才可以把各种组件往容器里塞。(部分组件可以直接添加到窗口中,但是添加到窗口和添加到容器的效果是一样的,所以我认为不如直接把所有组件都添加到容器中)

打个比方助于理解吧:上一篇讲的JFrame类和JDialog类,它们实例化的对象称作窗口,窗口起到的作用好比一张桌子,各种组件就像电学组件(晶体管、电容、电阻等等),直接把电学组件放在桌子上,似乎不太对劲吧?所以需要一个电路板来容纳、承接它们。其中这个电路板,起到的就是类似于容器的作用。

因此,我们的思路是:先往窗口中嵌入容器后,再往容器中添加组件。


一,容器

(1)JPanel

对于这个类,(因为博主是为了应付期末考)我的建议是直接硬记,所有组件都是添加到容器中的,所以记住——先用JPanel类实例化一个容器对象,然后把需要的组件添加到容器中,最后根据是否需要滑动条来决定:

①不要滑动条,则直接把JPanel类对象添加到(用add方法)窗口类对象中。

②需要滑动条,就把JPanel类对象显示到(用setViewportView方法)JScrollPanel类对象中,然后把JScrollPanel类对象添加到窗口类对象中。

比如我要添加4个按钮(按钮控件在下面会讲的):

那么第一步先创建一个JPanel类对象,然后把4个创建好的按钮对象添加到JPanel类对象中。

JPanel pane = new JPanel();//实例化容器对象
//实例化4个按钮组件对象
JButton button1 = new JButton("按钮1");
JButton button2 = new JButton("按钮2");
JButton button3 = new JButton("按钮3");
JButton button4 = new JButton("按钮4");
//把4个按钮组件对象添加到容器中
pane.add(button1);
pane.add(button2);
pane.add(button3);
pane.add(button4);

接下来第二步假设我们不需要滑动条,所以直接把JPanel类对象添加到提前创建好的窗口类对象(fr)中。

fr.add(pane);

(2)JScrollPanel

这个类用来创建一个带有滑动条的面板,你看到它名字里有个Panel,可能就认为它的作用和JPanel差不多,实则不然。它的作用就是让JPanel类对象多一个进度条,多的不讲,实际情况是蒟蒻博主也无暇去学了。所以就记住这个类的几行套路代码好了!

看了下面这4行代码后你肯定觉得很难记,其实我也这么觉得。。。(但其实有编译器代码提示的话,只要理解了就不用记了)。

首先先创建一个JScrollPanel类对象,对此对象我们有两个操作:

  1. 设置水平滑动条,即示例的第2行代码。
  2. 设置垂直滑动条,即示例的第3行代码。

        (设置滑动条时,我们常用两种操作:

        ①设置为需要时才出现滑动条,即第2行代码中的参数        

        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED

        ②设置为滑动条一直存在,即第3行代码中的参数

        ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS)

(还是放张图在这里吧...虽然感觉没啥用)

然后,把提前创建好的JPanel类对象(pane)显示到(用setViewportView方法)JScrollPanel类对象中。

JScrollPane scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setViewportView(pane);

最后,承接JPanel类中讲到的,接下来第二步假设我们需要滑动条,则把JScrollPanel类对象添加到提前创建好的窗口对象(fr)中。

fr.add(scrollPane);

(3)综合运用

下面进行一个案例,添加4个按钮到GUI中,并把面板设置成水平滑动条需要时出现,垂直滑动条一直出现。

import javax.swing.*;public class Main {public static void createGUI() {JFrame fr = new JFrame("这是主窗口");//通常直接在有参构造的时候命名,省得后续用setTitle()方法命名了。fr.setSize(400, 250);//设置窗体宽高fr.setLocation(400, 300);//设置窗体坐标//下面这行代码的作用和上面两行被注释的代码的作用一模一样,不信你试试~//fr.setBounds(400, 300, 400, 250);fr.setVisible(true);//设置窗体可见,基本必写吧?fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭按钮响应事件为关闭此窗口。//创建容器和按钮,把按钮塞到容器中。JPanel pane = new JPanel();JButton button1 = new JButton("按钮1");JButton button2 = new JButton("按钮2");JButton button3 = new JButton("按钮3");JButton button4 = new JButton("按钮4");pane.add(button1);pane.add(button2);pane.add(button3);pane.add(button4);//创建滑动面板,设置水平滑动需要时出现,垂直滑动一直出现。然后让事先创建好的容器对象(pane)显示到滑动面板对象上。JScrollPane scrollPane = new JScrollPane();scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);scrollPane.setViewportView(pane);//最后把滑动面板对象(不要错误添加成容器对象pane噢~那样就变成没有滑动效果的案例了)添加到事先创建好的窗口对象(fr)上。fr.add(scrollPane);}public static void main(String[] args) {createGUI();}
}


二,常用控件

(1)文本组件

①JLabel

JLabel组件可以显示文本、图像,还可以设置标签内容的垂直和水平对齐方式。

②JTextField

重点是只能接收单行文本的输入。

③JTextArea

重点是能接收多行文本输入

(2)按钮组件

①JButton

最朴实无华的按钮组件,只要会用下面这行代码来创建按钮就行了。

JButton button = new JButtion("按钮名字");

后面两个按钮预估期末考不是重点,所以我不展开讲,以后估计也没机会再用得到了。。想要学习的就建议去查阅其它资料了。

②JCheckBox

③JRadioButton

JRadioButton组件被称为单选按钮组件,单选按钮只能选中一个,就像收音机上的电台控制按钮,当按下一个按钮,先前按下的按钮就会自动弹起。

(实际上还有一大堆组件,但根本没时间和精力去学习了/(ㄒoㄒ)/~~)

(3)综合运用

下面利用一个案例来综合知识。创建一个GUI,如下图所示:其中文本框长度为20。

import javax.swing.*;public class Main {public static void createGUI() {JFrame fr = new JFrame("这是主窗口");//通常直接在有参构造的时候命名,省得后续用setTitle()方法命名了。fr.setSize(400, 250);//设置窗体宽高fr.setLocation(400, 300);//设置窗体坐标//下面这行代码的作用和上面两行被注释的代码的作用一模一样,不信你试试~//fr.setBounds(400, 300, 400, 250);fr.setVisible(true);//设置窗体可见,基本必写吧?fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭按钮响应事件为关闭此窗口。//创建容器和Jlabel、JTextField、JButton组件,并塞到容器中。JPanel pane = new JPanel();JLabel label = new JLabel("请输入:");JTextField textField = new JTextField(20);JButton button = new JButton("发送");pane.add(label);pane.add(label);pane.add(textField);pane.add(button);//把容器放在窗口中fr.add(pane);}public static void main(String[] args) {createGUI();}
}

写完这个综合运用,好学的小伙伴(争对看到这句话的所有认~)就提前好奇了,这些按钮啊、输入框之类的,似乎看起来只是个摆设?没有具体的功能?

当然能实现具体的功能,等下篇学了事件的监听和处理之后,就能根据按钮的按下与否来响应对应的事件了(到了期末才发现要学的尊嘟好多/(ㄒoㄒ)/~~)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 TensorFlow 中启用 Eager Execution

TensorFlow 是一个端到端的开源机器学习平台,可以更轻松地构建和部署机器学习模型。TensorFlow 应用程序使用一种称为数据流图的结构。默认情况下,在 TensorFlow 1.0 版中,每个图形都必须在 TensorFlow 会话中运行,这只允许一次运…

ansible的脚本---playbook剧本

ansible的脚本---playbook剧本 playbook组成部分 1、tasks任务:包含要在目标主机上执行的操作,使用模块定义这些操作,每个任务都是一个模块的调用 2、varlables变量:存储和传递数据,变量可以自定义,可以…

linux中vim命令修改jar包中的文件内容

文章目录 概述vim命令修改配置文件 概述 首先问问为什么要直接修改jar包中的文件,而不是重新打包,在非必要的情况下,不要直接修改jar包,这样容易出事故; 当然也有一些场景不得不修改jar包,比如&#xff1a…

【Linux系统编程】进程的认识

介绍: 进程是程序执行的实体,可将其理解为程序。比如:当我们使用文本编辑器Notepad应用程序来编写一篇文章时,此时,Notepad应用程序就被加载到了内存中,并且它占用的资源(如内存、CPU等&#xf…

Vuex的学习-2

Vuex的核心概念 StateMutationAction 1.State State提供唯一的公共数据源,所有共享的数据都统一放在Store的State中进行存储。 const store new Vuex.Store({state : { count: 0 } }) 这是渲染的页面 组件访问数据的第一种方式 组件访问数据的第二种方式 // 1…

MSPM0L1306例程学习-ADC部分(4)

MSPM0L1306例程学习系列 使用的TI的官方例程,即SDK里边包含的例程代码。 可以到TI官网下载并且安装SDK: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/ MCU使用的是MSPM0L1306, 对于ADC部分,有10个例程: 今天要讲的例程是adc12_14bit…

mac电脑m1 arm架构安装虚拟机教程

1、准备一台虚拟机,安装CentOS7 常用的虚拟化软件有两种: VirtualBoxVMware 这里我们使用VirtualBox来安装虚拟机,下载地址:Downloads – Oracle VM VirtualBox 001 点击安装 002 报错:he installer has detected an…

用模型预测测试数据

Hi, I’m Shendi 2、用模型预测测试数据 在之前已经训练好了一个模型,可以通过 model.save("path") 来保存模型到硬盘,下次直接使用。 这个模型使用的 mnist 数据集训练,这个数据集包含6万训练样本和一万测试样本,28*28…

linux下的进程组与会话的区别

进程组(Process Group)和会话(Session)是Unix/Linux操作系统中的两个概念,它们之间有一些关键区别: 定义和范围:一个进程组是一组相关进程的集合,它们具有相同的进程组ID&#xff08…

【运维面试100问】(十一)淡淡I/O过程

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

华为云之ECS云产品快速入门

华为云之ECS云产品快速入门 一、ECS云服务器介绍二、本次实践目标三、创建虚拟私有云VPC1.虚拟私有云VPC介绍2.进入虚拟私有云VPC管理页面3.创建虚拟私有云4.查看创建的VPC 四、创建弹性云服务器ECS——Linux1.进入ECS购买界面2.创建弹性云服务器(Linux)——基础配置步骤3.创建…

DC-磁盘管理

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 在DC2上安装及配置软RAID 5。在安装好的DC2虚拟机中添加三块10G虚拟磁盘。组成RAID 5,磁盘分区命名为卷标H盘:Raid5。手动测试破坏一块磁盘,做RAID磁盘修复,确认RAID 5配置完毕。配置步骤 关闭虚拟机,添加3块10G磁…

【AI提示词艺术】第10期 ---希望、价值与魔法的交织:小女孩与梦幻背景的数字艺术之旅

金色猎犬被视为一种贵族犬种 金色猎犬是一种流行的犬种,通常被视为一种象征,代表着忠诚、勇气和敏锐的嗅觉。这种犬种有着悠久的历史,可以追溯到中世纪时期。 金色猎犬的外观特征是短而厚的毛发,金色的颜色,以及敏锐…

Python---TCP 网络应用程序开发流程

1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发 说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务。 2. TCP 客户端程序开发流程的介绍 步…

在GitHub找开源项目

在 GitHub 的搜索框里: 使用搜索关键词可以在 GitHub 上快速的找你需要的开源项目: 限制搜索范围 通过 in 关键词 (大小写不敏感) 限制搜索范围: 公式搜索范围in:name xxx项目名包含xxxin:description xxx项目描述包含xxxin:readme xxx项目…

C/C++ 使用 MySQL API 进行数据库操作

C/C 使用 MySQL API 进行数据库操作 一、前言 随着信息时代的到来,数据库的应用日益广泛,MySQL 作为开源的关系型数据库管理系统,被广大开发者所喜爱。在 C/C 程序中,我们可以通过 MySQL 提供的 API 接口来连接数据库&#xff0…

100GPTS计划-AI学术AcademicRefiner

地址 https://chat.openai.com/g/g-LcMl7q6rk-academic-refiner https://poe.com/AcademicRefiner 测试 减少相似性 增加独特性 修改http://t.csdnimg.cn/jyHwo这篇文章微调 专注于人工智能、科技、金融和医学领域的学术论文改写,秉承严格的专业和学术标准。 …

Windows 如何在局域网中建立NTP服务器实现时间同步(设置一台设备作为主机,其他设备作为从机来同步时间)

首先简单了解一下什么是NTP 网络时间协议(NTP)是一种用于同步计算机网络上各设备时间的协议。NTP时间同步在许多项目和应用中都是关键的,特别是那些对时间同步精度有要求的场景。比如需要使用NTP时间同步的情况有:金融交易系统、科学研究实验、工业自动…

Unity 创建/删除/启用/禁用组件的惯用方法

1、创建组件&#xff1a; Unity 创建组件可以通过编辑器中的"Add Component"创建&#xff0c;或者代码动态创建&#xff1a;GameObject.AddComponent<T>()&#xff0c;如&#xff1a; ameObject.AddComponent<Rigidbody>(); 2、删除组件&#xff1a; …

WPF组合控件TreeView+DataGrid之TreeView封装

&#xff08;关注博主后&#xff0c;在“粉丝专栏”&#xff0c;可免费阅读此文&#xff09; wpf的功能非常强大&#xff0c;很多控件都是原生的&#xff0c;但是要使用TreeViewDataGrid的组合&#xff0c;就需要我们自己去封装实现。 我们需要的效果如图所示&#x…