Java SWT Composite 绘画

Java SWT Composite 绘画

  • 1 Java SWT
  • 2 Java 图形框架 AWT、Swing、SWT、JavaFX
    • 2.1 Java AWT (Abstract Window Toolkit)
    • 2.2 Java Swing
    • 2.3 Java SWT (Standard Widget Toolkit)
    • 2.4 Java JavaFX
  • 3 比较和总结

1 Java SWT

Java SWT(Standard Widget Toolkit)是一套用于构建桌面图形用户界面(GUI)的工具包,由 Eclipse 基金会开发和维护。SWT 提供了一组丰富的本地界面组件,这些组件直接调用底层操作系统的本地 API,以实现高性能和本地外观的图形用户界面。

项目解释
设计理念本地小部件:SWT 将 GUI 小部件映射到底层操作系统的本地小部件,而不是使用 Java Swing 或 AWT 中的纯 Java 实现。这种方法使得 SWT 的外观和行为更加接近本地操作系统的风格,提供了更好的性能和用户体验。轻量级:SWT 设计为轻量级工具包,尽量减少内存占用和运行时开销。它提供了一套简洁而灵活的 API,使开发者可以更容易地创建复杂的 GUI 应用程序。
组件和小部件SWT 提供了丰富的 GUI 小部件,包括按钮、文本框、标签、列表、树形控件、表格、滑块等。这些小部件可以被组合在一起,以构建复杂的用户界面。
布局管理SWT 使用布局管理器(Layout Manager)来处理小部件的布局。布局管理器负责在 GUI 窗口中安排小部件的位置和大小,以适应不同的屏幕大小和分辨率。
事件处理与其他 GUI 工具包一样,SWT 也使用事件模型来处理用户输入和其他事件。开发者可以注册监听器(Listener)来响应按钮点击、鼠标移动等事件。
图形上下文和绘图SWT 提供了图形上下文(GC,Graphics Context)来进行绘图操作。通过 GC,开发者可以在窗口上绘制文本、图像和其他图形元素。
线程模型SWT 的线程模型要求 GUI 操作必须在主线程(UI 线程)中执行。这确保了在更新 GUI 元素时不会导致并发问题。

2 Java 图形框架 AWT、Swing、SWT、JavaFX

Java中有几个常见的GUI框架,包括AWT、Swing、SWT和JavaFX。

2.1 Java AWT (Abstract Window Toolkit)

项目解释
设计理念AWT是Java最早的GUI工具包,采用本地小部件,使用底层平台的原生组件。它提供了一组基本的GUI组件,如按钮、文本框、标签等。
外观AWT的外观受到本地平台的影响,可能在不同平台上有不同的外观。
轻量级/重量级组件AWT有轻量级和重量级组件。轻量级组件是由Java代码实现的,而重量级组件使用本地代码(AWT peers)。
线程模型AWT的事件处理和绘图操作都是在主线程中进行的。

2.2 Java Swing

项目解释
设计理念Swing是在AWT之上构建的,是一套纯Java的GUI工具包。它提供了更丰富、更灵活、外观一致的组件集。
外观Swing的外观不受本地平台影响,具有一致的外观。可以使用“Look and Feel”来自定义外观。
轻量级组件Swing全部采用轻量级组件,通过Java代码实现,不依赖于底层平台。
线程模型Swing的事件处理和绘图操作也是在主线程中进行的。

2.3 Java SWT (Standard Widget Toolkit)

项目解释
设计理念SWT是由Eclipse开发的GUI工具包,采用本地小部件,使用底层平台的原生组件,类似于AWT的设计思想。
外观SWT的外观更接近本地平台,看起来和感觉更像是本地应用程序。
轻量级/重量级组件SWT有轻量级和重量级组件,但它的重量级组件是使用JNI(Java Native Interface)调用本地库,而不同于AWT的方式。
线程模型SWT的事件处理和绘图操作是在主线程以外的专用UI线程中进行的。

2.4 Java JavaFX

项目解释
设计理念JavaFX是Java的最新GUI框架,提供了丰富的图形和媒体功能,支持现代UI设计。它采用声明式UI编程,使用FXML进行布局。
外观JavaFX的外观是通过CSS进行定义的,可以轻松自定义和设计。它具有更现代的外观和感觉。
轻量级组件JavaFX全部采用轻量级组件,不依赖于底层平台。
线程模型JavaFX使用单线程模型,UI操作必须在JavaFX应用程序线程中执行,以确保线程安全。

3 比较和总结

框架总结
AWT、SwingAWT和Swing是传统的GUI工具包,主要用于构建桌面应用程序。它们提供了丰富的组件,但外观可能随本地平台而异。
SWTSWT更接近本地平台,提供了与本地外观一致的GUI。它的设计目标是提供更好的性能和用户体验。
JavaFXJavaFX是一个现代的GUI框架,提供了丰富的图形和媒体功能,支持现代UI设计。它是未来Java GUI开发的推荐选择,特别适合富客户端应用程序和数据可视化。
package com.xu.music.player.test;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

/**
 * SWT Composite 绘画
 *
 * @date 2024年2月2日19点27分
 * @since V1.0.0.0
 */
public class SwtDraw {

    private Shell shell = null;

    private Display display = null;

    private Composite composite = null;

    private final Random random = new Random();

    private List<Integer> spectrum = new LinkedList<>();

    public static void main(String[] args) {
        SwtDraw test = new SwtDraw();
        test.open();
    }

    /**
     * 打开 SWT 界面
     *
     * @date 2024年2月2日19点27分
     * @since V1.0.0.0
     */
    public void open() {
        display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        task();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    /**
     * 设置 SWT Shell内容
     *
     * @date 2024年2月2日19点27分
     * @since V1.0.0.0
     */
    protected void createContents() {
        shell = new Shell(display);
        shell.setSize(900, 500);
        shell.setLayout(new FillLayout(SWT.HORIZONTAL));

        // 创建一个Composite
        composite = new Composite(shell, SWT.NONE);

        // 添加绘图监听器
        composite.addPaintListener(listener -> {
            GC gc = listener.gc;

            int width = listener.width;
            int height = listener.height;
            int length = width / 10;

            if (spectrum.size() >= length) {
                for (int i = 0; i < length; i++) {
                    draw(gc, i * 10, height, 5, spectrum.get(i));
                }
            }

        });

    }

    /**
     * 模拟 需要绘画的数据 任务
     *
     * @date 2024年2月2日19点27分
     * @since V1.0.0.0
     */
    public void task() {
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                display.asyncExec(() -> {
                    if (!composite.isDisposed()) {
                        // 在这里调用你更新数据的方法
                        updateData();
                        // 重绘
                        composite.redraw();
                    }
                });
            }
        }, 0, 100);
    }

    /**
     * 模拟 更新绘画的数据
     *
     * @date 2024年2月2日19点27分
     * @since V1.0.0.0
     */
    public void updateData() {
        spectrum.clear();
        for (int i = 0; i < 160; i++) {
            spectrum.add(random.nextInt(300));
        }
    }

    /**
     * Composite 绘画
     *
     * @param gc     GC
     * @param x      x坐标
     * @param y      y坐标
     * @param width  宽度
     * @param height 高度
     * @date 2024年2月2日19点27分
     * @since V1.0.0.0
     */
    private void draw(GC gc, int x, int y, int width, int height) {
        // 设置条形的颜色
        Color color = new Color(display, 0, 0, 255);
        gc.setBackground(color);
        // 绘制条形
        Rectangle draw = new Rectangle(x, y, width, -height);
        gc.fillRectangle(draw);
        // 释放颜色资源
        color. Dispose();
    }

}

在这里插入图片描述

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

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

相关文章

Power BI案例-链接Mysql方法

Power BI案例-连锁Mysql 方法1-通过组件mysql-connector-net-8.3.0&#xff1a; 选择文件–获取数据–选择MySQL数据库–选择链接 提示无组件&#xff0c;选择了解详细情况 弹出浏览器&#xff0c;选择下载 不用登陆&#xff0c;可以直接下载 下载的组件如下&#xff1a…

【开源】基于JAVA+Vue+SpringBoot的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

代码随想录算法训练营Day46|139.单词拆分、多重背包理论基础、背包问题总结

目录 139.单词拆分 方法一&#xff1a;回溯法 算法实现 方法二&#xff1a;背包问题 算法实现 多重背包理论基础 思路 算法实现 背包问题总结 前言 背包递推公式 遍历顺序 0-1背包 完全背包 139.单词拆分 题目链接 文章链接 方法一&#xff1a;回溯法 在回溯专题…

Endnote常见设置(硕士毕业论文参考文献修改)

1、根据大多数期刊或学校使用的标准&#xff0c;英文名首字母大写后续字母小写。 2、需要手动调整Endnote中的参考文献相关内容 3、关于姓名大小写设置 AS IS是不更改大小写&#xff0c;EndNote库中文献的大小是什么样&#xff0c;Word中就显示什么样。选择Normal为首字母大…

HDMI2.1之eARC简介-Dolby Atmos和DTS:X

文章目录 eARC目的更大的带宽更高质量音频支持对象型音频与CEC&#xff08;Consumer Electronics Control&#xff09;的兼容性&#xff1a; 适应流媒体发展Dolby AtmosDTS:X高分辨率音频更高的音频位深度和采样率低延迟音频 对象型音频格式独立对象三维定位动态音场适应性和灵…

嵌入式——串行外围设备接口(SPI)

目录 一、初识SPI 1. 介绍 2. 特性 补&#xff1a; 二、物理层 1. SS &#xff08;Slave Select&#xff09; 2. SCK &#xff08;Serial Clock&#xff09; 3. MOSI &#xff08;Master Output, Slave Input&#xff09; 4. MISO &#xff08;Master Input&#xff0…

虚拟机Windows Server 2016 安装 MySQL8

目录 一、下载MySQL8 1.下载地址&#xff1a; 2.创建my.ini文件 二、安装步骤 第一步&#xff1a;命令窗口 第二步&#xff1a;切换目录 第三步&#xff1a;安装服务 第四步&#xff1a;生成临时密码 第五步&#xff1a;启动服务 第六步&#xff1a; 修改密码 三…

【Linux系统化学习】进程替换

目录 进程程序替换 替换原理 ​编辑替换函数 函数解释 命名理解 函数使用 execl execlp execv execvp 调用其它程序 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个…

0203-2-输入输出系统

第六章&#xff1a;输入输出系统 I/O系统的功能&#xff0c;模型和接口 I/O系统管理的对象是I/O设备和相应的设备控制器。 I/O系统的基本功能 隐藏物理设备的细节与设备的无关性提高处理机和I/O设备的利用率对I/O设备进行控制确保对设备的正确共享错误处理 I/O软件的层次结…

重写Sylar基于协程的服务器(4、协程调度模块的设计)

重写Sylar基于协程的服务器&#xff08;4、协程调度模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日…

2.03作业

1.请编程实现单向循环链表的头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删。 2.请编程实现单向循环链表约瑟夫环 约瑟夫环&#xff1a;用循环链表编程实现约瑟夫问题 n个人围成一圈&#xff0c;&#xff0c;从某人开始报数&#xff0c;1,2&#xff0c;......,m,数到…

牛客-NC249946-小d和孤独的区间

牛客-小d和孤独的区间 题目如上 1 s 1s 1s的时间限制&#xff0c;说明我们应该找到一种“巧法” 根据提示&#xff0c;我们只需要找到“中间全部都是 0 0 0&#xff0c;只有一个1的区间”即可 但是在找的途中&#xff0c;我们不仅要顾及当前 1 1 1之前的 0 0 0的个数&#xff…

JProfiler for Mac:提升性能和诊断问题的终极工具

在当今的高性能计算和多线程应用中&#xff0c;性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具&#xff0c;旨在帮助开发者更好地理解其应用程序的运行情况&#xff0c;提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括&#xff1a;…

常见API

文章目录 Math类1.1 概述1.2 常见方法 System类2.1 概述2.2 常见方法 Runtime3.1 概述3.2 常见方法 Object类4.1 概述4.2 常见方法 Objects类5.1 概述5.2 常见方法 BigInteger类6.1 引入6.2 概述6.3 常见方法6.4 底层存储方式&#xff1a; 7 BigDecimal类7.1 引入7.2 概述7.3 常…

PAT-Apat甲级题1005(python和c++实现)

PTA | 1005 Spell It Right 1005 Spell It Right 作者 CHEN, Yue 单位 浙江大学 Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output every digit of the sum in English. Input Specification: Each input file cont…

kubernetes-深入理解Pod对象:调度

一、创建一个Pod的工作流程 Pod创建流程&#xff1a; 1、kubectl 向 APIServer 发起一个 Pod 创建请求。 2、APIServer 接受到 Pod 创建请求后&#xff0c;不是直接创建 Pod&#xff0c;而是将 Pod 的数据写入 etcd 中&#xff0c;待写入操作执行完成&#xff0c;APIServer 将…

vue3 之 组合式API - setup选项

首先我们先看下setup选项的写法和执行时机 setup选项中写代码的特点 语法糖 总结 setup选项的执行时机&#xff1f; beforeCreate钩子之前 自动执行 setup写代码的特点是什么&#xff1f; 定义数据 函数 然后以对象方式return 经过语法糖的封装更简单的使用组合式API set…

mybatis-plus 3.5.1 自动填充无效问题

使用了mybatis-plus的自动填充功能,但是我debug的时候进都进不去 这是为什么? 我在新增的时候连insertFill方法都进不去 原因是,我没有在我的新增实体类上加上 fill FieldFill.INSERT 还有些问题是配置类, 没有扫描到的问题,这个网上一搜一大把 注意,这个实体类是你新增的…

BUUCTF-Real-[struts2]s2-013

struts2的标签中 <s:a> 和 <s:url> 都有一个 includeParams 属性&#xff0c;可以设置成如下值none - URL中不包含任何参数&#xff08;默认&#xff09; get - 仅包含URL中的GET参数 all - 在URL中包含GET和POST参数 当includeParamsall的时候&#xff0c;会将本次…

ep-bg-purple-dark element-plus 不生效

element-plus 官网里面的 Layout 布局中的示例&#xff0c;官方文档中添加类名 class"grid-content ep-bg-purple-dark" 有相应的样式 import element-plus/theme-chalk/index.css //默认css样式 英文 import element-plus/dist/index.css 两…