Java Swing基础(层次结构,组件,布局管理)

2023-11-18

Swing基础层次结构

图形环境和图形对象

  • 坐标

    • GUI组件的左上角坐标默认为(0,0)
    • 从左上角到右下角,水平坐标x和垂直坐标y增加
    • 坐标的单位是像素
  • Graphics对象

    • 专门管理图形环境,Graphics类是一个抽象类
    • 抽象类Graphics提供了一个于平台无关的绘图接口
    • 各平台上实现的Java系统将创建Graphics类的一个子类来实现绘图功能,这个子类对程序员是透明的。
    • 在执行paint方法时,系统会传递一个指向特定平台的Graphics子类的图形对象g

一个简单的例子

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JFrame;

public class GraphicsTester extends JFrame{
    private static final long serialVersionUID = 1L;
    public GraphicsTester()
    {
        super("演示字体、颜色、绘图");
        setVisible(true);
        setSize(480,250);
    }
    public void paint(Graphics g)
    {
        super.paint(g);
        g.setFont(new Font("SansSerif",Font.BOLD,12));
        g.setColor(Color.blue);
        g.drawString("字体ScanSerif,粗体,14号,红色",250,50);    
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        GraphicsTester g = new GraphicsTester();
        g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    }
}

上面的程序需要注意三处代码

  • public class GraphicsTester extends JFrame

我们需要继承一个主窗口,才能实现swing编程

  • public void paint(Graphics g)

这里的Graphics g不用我们自己定义,是由Java自动生成的

  • g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

设置关闭窗口的默认操作

注意: paint方法会被自动调用

其他的画图函数看API文档就可以了

前面我们使用的是Graphics来绘图,其实我们可以用更强大的Graphics2D来绘图,当然,我们需要将传递进来的g向上转型为Graphics2D,因为传递过来的g就是Graphics2D的一个子类
Graphics2D g2d = (Graphics2D)g;

Swing 基础

swing:一个预定好各种组件的包,JFrame就是swing里面的一个组件

JFC与Swing

  • JFC(Java Foundation Classes)

    • 是关于GUI组件和服务的完整集合

    • 作为JAVA SE的一个有机部分,主要包含5个部分

      • AWT
      • Java2D
      • Accessibility
      • Drag & Drop
      • Swing
    • Swing

      • JFC的一部分
      • 提供按钮、窗口、表格等所有的组件
      • 纯Java组件(完全用Java写的组件)

AWT组件

  • Java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component类的子类
  • 大部分含有native code,所以随操作系统平台的不同会显示出不同的样子,而不能进行更改,是重量级的组件

Swing组件

  • 其名称都是在原来的AWT组件名称前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent类的子类
  • 架构在AWT上,是AWT的扩展而不是取代
  • 完全由Java语言编写,其外观和功能不依赖于任何由宿主平台的窗口系统所提供的代码,是轻量级组件
  • 可提供更丰富的视觉感受

在Applet和Application中应用Swing

  • Applet中应用Swing,就要将Swing组件加载到Applet容器上(通常是JApplet),这通常在init方法中完成
  • Application(本地应用程序,也就是主函数中)中应用Swing,也是要将Swing组件加载到这个Application的顶层容器(通常是JFrame)中。

也就是说,如果要使用Swing组件,就要加到容器上

容器是从哪里来的?容器又是什么?

Swing层次

在这里插入图片描述
组件的继承层次如上,大多数Swing组件都继承于JComponent

  • Component类

    • 包含paint、repaint方法,可以在屏幕上绘制组件
    • 大多数GUI组件直接或间接的扩展Component
  • Container类

    • 容纳相关组件
    • 包括add方法,用来添加组件
    • 包括setLayout方法,用来设置布局,帮助Container对象对其中的组件进行定位和设置组件大小
  • JComponent类–多数Swing组件的超类

    • 可定制的观感、即可根据需求定制组件
    • 快捷键(通过键盘直接访问GUI组件)
    • 一般的事件处理功能

Swing的组件和容器层次

  • 顶层容器
  1. 必须跟操作系统打交道,所以都是重量级组件、

  2. 每个使用Swing组件的Java程序都必须至少由一个顶层容器,别的组件都必须放在这个顶层容器上才能显示出来)

    • JFrame实现单个主窗口
    • JDialog 实现一个二级窗口
    • JApplet在浏览器窗口实现一个applet显示区域
  • 中间层容器

    容纳其他组件的

  • 原子组件

    直接与用户交互的组件

例:三层容器结构

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

public class ComponentTester {

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Swing Frame");
        Container contentPane=frame.getContentPane();
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.black, 5));
        panel.setLayout(new GridLayout(2,1));
        JLabel label = new JLabel("Label",SwingConstants.CENTER);
        JButton button = new JButton("Button");
        panel.add(label);
        panel.add(button);
        contentPane.add(panel);
        frame.pack();
        frame.show();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
    }
}

分析一下关键部分的代码

首先,需要一个顶层容器,然后从容器得到一个内容面板Container

JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Swing Frame");
Container contentPane=frame.getContentPane();

接下来,定义一个中间容器并完成一些初始化操作

JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.black, 5));
panel.setLayout(new GridLayout(2,1));

定义一些原子组件

JLabel label = new JLabel("Label",SwingConstants.CENTER);
JButton button = new JButton("Button");

最后一步,将原子组件加在中间层容器,然后将中间层容器加到顶层容器上

panel.add(label);
panel.add(button);
contentPane.add(panel);

以上就是Swing组件的基本层次结构了

布局管理

使用方法: 调用容器的setLayout方法就可以了

例如:

Container contentPane = frame.getContentPane();
ContentPane.setLayout(new FlowLayout());

其中的FlowLayout是布局管理器对象

有许多常用的布局管理器类,直接查找API文档就可以了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Swing基础(层次结构,组件,布局管理) 的相关文章

随机推荐

  • tcp和udp,通信协议

    1 什么是tcp和udp 常用的网络通讯 浏览网页 软件聊天等等 都是基于tcp和udp传输的 2 tcp和udp的区别是什么 1 最大的区别是一个基于连接 一个基于非连接 举例说明 如果把人与人之间的通信比喻为进程之间的通信 写信和电话
  • 通俗易懂讲解区块链

    文章目录 一 区块链是什么 区块链的几个核心特点 1 去中心化 2 非常安全 3 不可篡改性 4 开放性 5 无第三方 6 匿名性 二 区块链与比特币的关系 三 通俗易懂解释区块链 1 民生领域 2 经济产业领域 3 政务领域 4 数字身份
  • B站马士兵python入门基础版详细笔记(6)

    前言 这篇文章是B站学习python入门基础班的视频的第五 六章内容 主要讲述的是列表 主要包括列表的创建 以及他的元素的增 删 查 改操作命令 一 列表的初始化 为什么要使用列表 列表就好比C语言中的数组 它可以在这个数组里面保存各种类型
  • 达梦数据库创建数据库实例、规划表空间

    1 创建数据库实例 1 1图形方式创建 到数据库安装目录 dm7 的 tool目录下 打开达梦数据库配置助手 dmdba localhost tool dbca sh 打开达梦数据库配置助手 选择创建数据库实例 点击 开始 如下图 创建数据
  • unity shader入门(一) 基本结构和变量声明

    文章目录 前言 Unity中shader相关的结构 什么是openGL和DirectX unity shader的分类 编写一个unity shader shader的基本结构 shader的property类型 在subshader中再次
  • Matlab 高斯信道下QPSK通带通信系统的简单仿真

    1 原理 2 仿真 3 总结反思 4 参考资料 1 原理 QPSK的具体内容请参考百度 QPSK的调制jie框图大致如下 QPSK信号可以采用正交调制的方式产生 如第一张图片的左半部分 I路信号与cos 信号相乘 Q 路信号与sin信号相乘
  • 【知识分享】机器学习的基本流程

    个人理解的机器学习简单流程如下 0 收集数据 1 对数据集进行预处理 2 划分数据集 训练集 测试集 验证集 3 训练 4 验证模型 对每个步骤详细解释 0 收集数据 可以使用之前学过使用爬虫对特定网页内容爬取 或在数据网页等信息网站上直接
  • [error] MFC错误不能将参数1从"const char [3]"转换为"const wchar_t *"

    在做项目中经常遇到很多错误 这里我仅仅把自己遇到的一些错误和解决方法写出 供自己和大家查看 代码如下 CRect rect GetClientRect rect CString str str Format ld rect bottom M
  • OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1

    最近切换到64位系统上 运行以前的程序真是各种bug不停啊 主要还是系统位数导致的 先看下面这个错误 OpenCV Error Assertion failed type B type type CV 32FC1 type CV 64FC1
  • 解决ChatGML启动报错:RuntimeError: expected scalar type Half but found Float

    1 编辑web demo2 py文件 2 在原始命令加上 half 原始命令 model AutoModel from pretrained app model chatglm2 6b trust remote code True half
  • 如何优雅地实现 Excel 文件导出功能?(阿里出品的 EasyExcel,安利一波)

    EasyExcel 前言 导出是后台管理系统的常用功能 当数据量特别大的时候会内存溢出和卡顿页面 曾经自己封装过一个导出 POI百万级大数据量EXCEL导出 采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件
  • 区块链技术详解

    区块链概述 区块链定义 区块链 是一个共享的 不可篡改的账本 旨在促进业务网络中的交易记录和资产跟踪流程 资产 可以是有形的 如房屋 汽车 现金 土地 也可以是无形的 如知识产权 专利 版权 品牌 几乎任何有价值的东西都可以在区块链网络上跟
  • 关于ROM,RAM,FLASH的个人理解

    RAM和ROM是指的存储介质 不是存储器 在硬件构造上不同 所以性质不同 但都是半导体存储介质 RAM是随机存取存储器 随机是什么意思呢 意思是 给定一个地址 可以立即访问到数据 访问时间和位置无关 RAM特点是掉电会丢失数据 但是RAM的
  • docker -toolbox host is not running 最简单解决方案

    很多小伙伴下载toolbox后 用gitbash运行docker machine start 可能会出现 docker host is not running的错误信息 其实我觉得就是无法启用虚拟机服务 打开虚拟机可以看到其实创建的虚拟机是
  • 小米手机安装linux视频教程,屏幕失灵的小米5手机安装linuxdeploy centos7记录

    几年前使用的小米5手机不知道什么时候屏幕失灵了 触摸任何地方都没有反应 幸好下面三个实体按键还是好的 就拿来安装一下linux系统 我到华强北去问了一下 修好屏幕至少需要100多块 这个手机卖旧手机也就是100块 懒得换屏幕盖板了 刚好前段
  • java sqlexception_java.sql.SQLException

    java sql SQLException ResultSet is closed是什么错误 java sql SQLException ResultSetisclosed是什么错误 java sql SQLException Result
  • 项目开发中开发文档出现的问题及其对策

    在常规项目开发管理中 很多项目专家都提出要用各种各样规范的文档对开发工作进行管理 但是在日常工作中 由于这些文档的编写的管理工作都是相当繁重的 以致让一线员工不能主动积极使用 更新这些文档 长期下来 这些管理型的 设计型的文档所发挥的作用就
  • Qt中SQLite3的增、删、改、查操作

    QT sqlite3 先说一下QT自带数据库sqlite3和另外用sqlite3插件的区别 他们的功能是一样的 但是代码就不一样了 QT对数据库具有完善的支持 不需要加任何其他插件就可以直接使用 但是如果你要是加了sqlite3插件 调用数
  • 解决: Message: invalid selector: Compound class names not permitted报错的问题

    对于出现消息 无效的选择器 不允许使用复合类名的问题 该页面解析 原始代码 self driver find element by class name s btn btn ok click 问题 代码出现如下清空 Traceback mo
  • Java Swing基础(层次结构,组件,布局管理)

    Swing基础层次结构 图形环境和图形对象 坐标 GUI组件的左上角坐标默认为 0 0 从左上角到右下角 水平坐标x和垂直坐标y增加 坐标的单位是像素 Graphics对象 专门管理图形环境 Graphics类是一个抽象类 抽象类Graph