001-Kotlin界面开发之Jetpack Compose Desktop学习路径
Compose Desktop学习之路

学习过程
理解Kotlin的基本语法
Compose Desktop采用Kotlin构建,因此对Kotlin的基本语法有很好的理解是必不可少的。你可以从官方的Kotlin文档开始。
用一句话概括,Kotlin是一种现代的、静态类型的编程语言,它结合了面向对象和函数式编程的特性。用通俗的话说,Kotlin就是Java的含糖量爆表的全新版本。它非常现代,也非常简洁,同时还保留了Java的一些优点。
学习Kotlin的基本语法,包括变量、函数、类、接口、扩展函数、数据类、枚举类等,是学习Compose Desktop的基础。但是一个Java程序员,应该很快就能掌握Kotlin的基本语法。并且,JetBrains提供了一个非常好的在线Kotlin Playground,你可以在这里练习Kotlin的基本语法。JetBrains的免费Java开发环境IntelliJ IDEA也支持Kotlin,你可以在IntelliJ IDEA中创建一个Kotlin项目,并且支持把Java代码转换为Kotlin代码。
糖度高、身体好,Kotlin是Java程序员的福音。
开发环境搭建
- 安装IntelliJ IDEA:这是Kotlin和Compose Desktop开发的推荐IDE。
- 安装JDK:确保你安装了最新的JDK。
- 创建一个新项目:使用IntelliJ IDEA创建一个带有Compose Desktop支持的Kotlin项目。
这几个步骤就已经完成了Compose Desktop的开发环境搭建。
学习Jetpack Compose的基础知识
Jetpack Compose是Compose Desktop的基础。从官方的Jetpack Compose文档开始,了解核心概念。
这个部分主要包括一些非常基础的概念,如:
- Composable函数的概念
- GUI界面的概念
- Material Design的概念
- 界面布局的概念
- 基本的UI组件,如Button、TextField、Checkbox等
探索多平台Compose
- 官方文档:参考Compose Multiplatform文档.
- 示例项目:在GitHub上探索可用的示例项目,看看Compose Desktop在实际应用中是如何使用的。
Compose Desktop应用示例
首先,我们来看一个最简单的Compose Desktop应用示例。这个示例展示了如何创建一个简单的窗口,并在窗口中显示一段文本。
import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import java.awt.Dimension@Composable
@Preview
fun App() {MaterialTheme {Box(modifier = Modifier.fillMaxSize(),contentAlignment = Alignment.Center) {Text("您好, Compose Desktop!", style = MaterialTheme.typography.h3)}}
}fun main() = application {Window(onCloseRequest = ::exitApplication,title = "Compose Desktop Demo 000") {App()}
}
这个代码,跟JavaFx的实际上比较类似,JavaFx中的容器、布局类、空间类,在Compose Desktop中都有对应的概念,只是Compose Desktop采用可组合函数的方式来实现。
而在编译这个代码之前,最好先把Gradle的下载地址换个国内的镜像,就在gradle/wrapper/gradle-wrapper.properties文件中,把distributionUrl的地址换成国内的镜像地址,比如https\://services.gradle.org/distributions/gradle-8.7-bin.zip,更换为distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip。这样下载速度会快很多。
另外就是在build.gradle.kts文件中,添加国内的maven仓库地址,如下:
repositories {maven(url = "https://maven.aliyun.com/repository/public")mavenCentral()
}
当然,在你的settings.gradle.kts中同样需要增加maven("https://maven.aliyun.com/repository/public/")。
pluginManagement {repositories {maven("https://maven.aliyun.com/repository/public/")maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")google()gradlePluginPortal()mavenCentral()}plugins {kotlin("jvm").version(extra["kotlin.version"] as String)id("org.jetbrains.compose").version(extra["compose.version"] as String)id("org.jetbrains.kotlin.plugin.compose").version(extra["kotlin.version"] as String)}
}
就算是都加上了,IDEA还是要卡一会,因为傻瓜的IDEA也要从遥远的地方下载kotlin那一套。
这两个步骤完成之后,就可以编译这个Compose Desktop应用程序了。

可以调用gradle run命令来运行这个应用程序。
还能用gradle createRuntimeImage命令来创建一个可执行文件,这个可执行文件可以在没有安装JDK的机器上运行。
大概在build/compose/binaries/app/Demo000目录下,有一个可执行文件,双击这个文件就可以运行这个应用程序。整个目录大概170MB左右。当然,这都不重要……
理解状态管理
学会如何在Compose Desktop中管理状态。这对于构建交互式应用程序至关重要。这个地方实际上是Compose Desktop的核心,也是最难的地方。
Compose Desktop的核心思想是函数式编程,状态管理是函数式编程的核心。Compose Desktop提供了一些函数来帮助我们管理状态,如remember和mutableStateOf。这些函数可以帮助我们在Compose Desktop中管理状态,使得我们的应用程序更加健壮和易于维护。
探索布局和修饰符
布局是一切GUI设计的中心工作之一。
理解不同的布局组合(Box、Column、Row等)以及如何使用Modifier来设计和定位UI元素,是构造Compose Desktop应用程序的主要工作内容。
用户输入的处理
学会如何使用Button、TextField和Checkbox等组合来处理用户输入。
一方面要掌握工具,也就是具体的用于处理用户输入的组合函数,另一方面也要仔细学习不同组件的实际用途,跟需求分析结合在一起。
列表
显示数量不定的数据是GUI设计的常见需求。Compose Desktop提供了LazyColumn和LazyRow等组合函数来处理这种情况。
高级主题
- 自定义绘图:学会如何使用
Canvas组合来创建自定义绘图。 - 动画:探索如何为Compose Desktop应用程序添加动画。
- 互操作性:了解如何与现有的Swing应用程序进行互操作。
测试
学会为Compose Desktop应用程序编写测试,以确保它按预期工作。
Compose Desktop提供了一些测试工具,如ComposeTestRule和onNode,可以帮助我们编写测试。这些工具可以帮助我们确保我们的应用程序按预期工作,同时也可以帮助我们快速定位和修复问题。
应用部署
学会如何使用compose.desktop.application插件打包和分发Compose Desktop应用程序。
总结
Compose Desktop是一个非常强大的桌面应用程序框架,它提供了一种现代、简洁、易于使用的方式来构建桌面应用程序。学习Compose Desktop需要掌握Kotlin的基本语法、Jetpack Compose的基础知识、状态管理、布局和修饰符、用户输入的处理、列表、高级主题、测试和应用部署等内容。
通过上面的学习过程,就有可能获得对Compose Desktop较深入的理解,并能够构建自己的桌面应用程序。
那么,就让我们开始这段……感情……哦不……旅程吧……
相关文章:
001-Kotlin界面开发之Jetpack Compose Desktop学习路径
Compose Desktop学习之路 学习过程 理解Kotlin的基本语法 Compose Desktop采用Kotlin构建,因此对Kotlin的基本语法有很好的理解是必不可少的。你可以从官方的Kotlin文档开始。 用一句话概括,Kotlin是一种现代的、静态类型的编程语言,它结合…...
qt QStackedLayout详解
QStackedLayout类提供了一种布局方式,使得在同一时间内只有一个子部件(或称为页面)是可见的。这些子部件被维护在一个堆栈中,用户可以通过切换来显示不同的子部件,适合用在需要动态显示不同界面的场景,如向…...
python实现钉钉群机器人消息通知(消息卡片)
直接上代码 python """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class DingTalkRobotAlert():def __init__(self):self.webhook webhook_urlself.headers {Content-Type: applicatio…...
防火墙技术应用
目录 防火墙安全功能指标防火墙性能指标防火墙部署防火墙应用案例-Linux防火墙防火墙应用案例-华为包过滤防火墙ACL(基本)防火墙应用案例-工控防火墙部署 防火墙安全功能指标 我们防火墙也会提供各种各样的互联接口,它这种接口有以太网、快速以太网、千兆以太网&am…...
docker engine stopped
1)环境:win 10 2)docker安装时已经已经安装了虚拟机 3)启用网络适配器 4)启用docker服务(依赖服务LanmanServer) 5)全都弄好了,docker还是打不开,没办法了&a…...
Redis- 内核的分配内存限制的警告“WARNING Memory overcommit must be enabled!”
文章目录 问题描述报错原因影响解决方案注意事项 问题描述 [rootredisxxx]# redis-sentinel ./sentinel.conf 19638:X 01 Nov 2024 16:57:27.180 # WARNING Memory overcommit must be enabled! Without it, background save or replication may fail under low memory condi…...
腾讯云在线扩容数据盘
文章目录 一、查询云硬盘使用的分区形式二、根据不同的云硬盘类型进行在线扩容分区2.1 安装 gdisk 工具。2.2 安装 growpart 工具使用 growpart 工具扩容分区 三、根据不同的云硬盘类型进行在线扩容文件系统3.1 扩容 EXT 文件系统3.2 扩容 XFS 文件系统 一、查询云硬盘使用的分…...
Time Travel Queries|在 RisingWave 中访问历史数据
对于许多组织来说,能够访问历史数据十分关键。以金融交易公司为例: 特定时间点的数据快照与合规审查、审计流程息息相关。企业的关键业务系统也依赖历史数据来恢复故障并重建系统。分析过去事件及其对当前状况的影响,还有助于准确预测并制定…...
Unity之UnityWebRequest
复习UnityWebRequest 介绍下载文件和上传文件下载进度和异常验证文件DownloadHandlerScript 介绍 unity中使用UnityWebRequest来代替所有HTTP请求提供了三种API,UnityWebRequest.Get,UnityWebRequest.Post,UnityWebRequest.Put分别处理GET,POST,PUT请求…...
使用 pkg 打包 Puppeteer 应用:跨平台自动化的轻量级选择
使用 pkg 打包 Puppeteer 应用 pkg 是一个非常强大的工具,它允许你将 Node.js 项目打包成独立的可执行文件,这意味着你可以在没有安装 Node.js 环境的设备上运行该应用。这对于希望分发不暴露源代码的应用程序、创建跨平台的快速演示版本或简化部署流程…...
【Flask】三、Flask 常见项目架构
目录 前言 简单项目结构 中型项目结构 复杂项目结构 前言 Flask是一个轻量级的Web应用框架,它被广泛用于快速开发简单的网站和复杂的大型应用。随着项目规模的增长,合理的项目架构变得尤为重要。这里探讨Flask项目中的三种常见架构&…...
AI机西使用体验:你不知道的强大功能揭秘!
AI机西有人用过吗?用户体验和功能详解 最近我听说了很多关于AI机西的讨论,很多人都在问:这款工具好用吗?有没有人用过?今天我就从我的使用体验出发,给大家分享一下AI机西的功能和我的感受。 1. 绘画功能&a…...
什么是护网(HVV)需要什么技术?(内附护网超全资料包)
文章目录 一、什么是护网行动?二、护网分类三、护网的时间四、护网的影响五、护网的规则六、什么是红队? 6.1、红队测试的意义 七、什么是蓝队 一、什么是护网行动? 护网行动是以公安部牵头的,用以评估企事业单位的网络安全的…...
opencv优秀文章集合
文章目录 一、 CV领域1.1 图像处理1.2 目标检测与识别1.3 图像分割、目标追踪1.4 姿态估计1.5 3D视觉1.6 图像生成1.7 机器视觉1.8 其它 二、 nlp三、语音四、推荐系统 《OpenCV优秀文章集合》《OpenCV系列课程一:图像处理入门(读写、拆分合并、变换、注…...
php处理文件上传的五种方式
dd($_FILES); //方式一 if(!empty($_FILES[file])){ //获取文件后缀方式一 //strrchr()函数查找字符在指定字符串中从右面开始的第一次出现的位置, //如果成功,返回该字符以及其后面的字符…...
C#与C++交互开发系列(十一):委托和函数指针传递
前言 在C#与C的互操作中,委托(delegate)和函数指针的传递是一个复杂但非常强大的功能。这可以实现从C回调C#方法,或者在C#中调用C函数指针的能力。无论是跨语言调用回调函数,还是在多线程、异步任务中使用委托&#x…...
【window】补充一些powershell基本命令
刚才说了一下如何用powershell管理,下边是一些常见的 PowerShell 命令及其参数的示例,补充给大家: 1. 获取帮助 Get-Help:获取命令的帮助信息。 Get-Help Get-Process Get-Help Get-Process -Examples Get-Help Get-Process -Fu…...
精准触达用户,私域三步法!
发现没?现在很多人都开始利用私域来增加潜在的客户,维护现有客户。而在私域管理中,精准触达用户是非常重要的一环。 接下来,就和大家聊聊私域精准触达用户的三个方法,让你可以实现精准营销。 1、数据分析与用户画像构…...
Tcl脚本介绍(一)
芯冰乐知识星球入口:芯冰乐 TCL就是Tool Command Language的简称,广泛应用在各大eda工具中。 EDA工具能够高度自动化的运行得益于TCL。 用户在编写完相关的tcl脚本后,让eda工具自动运行,便能够很大程度地解放双手了。 其实,网络上介绍TCL脚本的课程层出不穷了。应很多粉…...
安全运营 -- 监控linux命令history
0x00 背景 最近,有个IT的同事给我提了一个需求,说想监控/root/.ssh/ 文件夹下的文件变动,于是我灵机一动,这个需求只要对执行过的历史命令做审计就可以了。 0x01 实践 我实现这个功能使用 rsyslog 和 firewalld 两个组件。 我的…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
