使用WPF实现一个快速切换JDK版本的客户端工具

【Java】JDK 版本切换(Windows) JDK 版本切换 (Windows) 阅读详情

发现网上一键切换JDK环境的方法都是在mac或Linux下的,本人主力电脑是Windows,于是看了一下WPF的文档,自己开发了一个客户端。

直接上代码吧:

using JavaSwitch.Properties;
using Newtonsoft.Json;
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Forms;

namespace JavaSwitch
{
    public class ListItem
    {
        public string Text { get; set; }
        public bool IsSelected { get; set; }

        public ListItem(string text)
        {
            Text = text;
        }
    }

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public ObservableCollection<ListItem> Items { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            // 从本地加载已有的数据
            LoadDataFromJson();
            // 数据绑定上下文
            DataContext = this;
        }

        private void Button_Add(object sender, RoutedEventArgs e)
        {
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog
            {
                // 设置初始目录
                RootFolder = Environment.SpecialFolder.Desktop
            };
            // 这个方法可以显示文件夹选择对话框
            folderBrowserDialog.ShowDialog();
            // 获取选择的文件夹的全路径名
            string directoryPath = folderBrowserDialog.SelectedPath;

            // 打印出选择的路径
            Console.WriteLine(directoryPath);

            if (string.IsNullOrEmpty(directoryPath))
            {
                return;
            }

            // 持久化到本地
            var newItem = new ListItem(directoryPath);
            Items.Add(newItem);
            SaveDataToJson();
        }

        /// <summary>
        /// 删除一项
        /// </summary>
        private void Button_Delete(object sender, RoutedEventArgs e)
        {
            var deleteButton = sender as System.Windows.Controls.Button;
            if (deleteButton != null)
            {
                var listItem = deleteButton.DataContext as ListItem;
                if (listItem != null)
                {
                    Items.Remove(listItem);
                    SaveDataToJson();
                }
            }
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            // 打开环境变量设置页面 rundll32 sysdm.cpl,EditEnvironmentVariables
            Process.Start("rundll32.exe", "sysdm.cpl,EditEnvironmentVariables");
            //string originalPath = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine);
            //System.Windows.MessageBox.Show("Original Path: " + originalPath);
        }

        private void RadioButton_Click(object sender, RoutedEventArgs e)
        {
            var radioButton = sender as System.Windows.Controls.RadioButton;
            if (radioButton != null)
            {
                var listItem = radioButton.DataContext as ListItem;
                if (listItem != null)
                {
                    foreach (var item in Items)
                    {
                        item.IsSelected = item == listItem;
                        if (item.IsSelected)
                        {
                            // 设置环境变量
                            // 执行bash命令:setx JAVA_PATH "%JAVA_HOME%\bin;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;" /M
                            Process.Start("cmd", "/c setx JAVA_PATH \"" + item.Text + "\\bin;" + item.Text + "\\lib\\dt.jar;" + item.Text + "\\lib\\tools.jar;\" /M");
                            // 执行bash命令:refreshenv.cmd
                            Process.Start("cmd", "/c refreshenv.cmd");
                        }
                    }
                }
            }
            SaveDataToJson();
        }

        private string ENV_DATA = "JavaEnvironment.json";
        /// <summary>
        /// 保存数据到本地
        /// </summary>
        private void SaveDataToJson()
        {
            var json = JsonConvert.SerializeObject(Items, Formatting.Indented);
            File.WriteAllText(ENV_DATA, json);
        }

        /// <summary>
        /// 从本地加载数据
        /// </summary>
        private void LoadDataFromJson()
        {
            if (File.Exists(ENV_DATA))
            {
                var json = File.ReadAllText(ENV_DATA);
                Items = JsonConvert.DeserializeObject<ObservableCollection<ListItem>>(json);
            }
            else
            {
                Items = new ObservableCollection<ListItem>();
            }
        }
    }
}

布局文件:

<Window x:Class="JavaSwitch.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:JavaSwitch"
        mc:Ignorable="d"
        Title="Java环境切换" Height="450" Width="800">
    <Grid>
        <TextBlock FontSize="18" FontWeight="Bold" Foreground="#ffbe4d4d"  HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="请用管理员身份打开本程序,否则没有权限修改设置!" VerticalAlignment="Top" Width="586"/>
        <TextBlock FontSize="16" HorizontalAlignment="Left" Margin="10,47,0,0" TextWrapping="Wrap" Text="第一步:打开系统变量-Path,检查并添加%JAVA_PATH%(已添加则不用重复添加)" VerticalAlignment="Top" Width="629"/>
        <TextBlock FontSize="16" HorizontalAlignment="Left" Margin="10,84,0,0" TextWrapping="Wrap" Text="第二步:添加已安装的JDK文件夹" VerticalAlignment="Top" Width="263"/>
        <Button FontSize="16" Content="检查环境变量" HorizontalAlignment="Left" Margin="639,47,0,0" VerticalAlignment="Top" Click="Button_Click_1"/>
        <Button FontSize="16" Content="添加一个Java环境" HorizontalAlignment="Left" Margin="257,82,0,0" VerticalAlignment="Top" Click="Button_Add"/>
        <TextBlock FontSize="16" HorizontalAlignment="Left" Margin="10,123,0,0" TextWrapping="Wrap" Text="第三步:点击按钮切换环境" VerticalAlignment="Top"/>
        <ListBox x:Name="listBox" ItemsSource="{Binding Items}" Margin="0,156,0,0">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="0, 10, 0, 10">
                        <Viewbox Height="22" VerticalAlignment="Center">
                            <RadioButton x:Name="radioButton" GroupName="RadioGroup" IsChecked="{Binding IsSelected, Mode=TwoWay}" Click="RadioButton_Click" />
                        </Viewbox>
                        <TextBlock Text="{Binding Text}" VerticalAlignment="Center"  FontSize="16" Margin="10,0,0,0"/>
                        <Button Content="删除" VerticalAlignment="Center" Click="Button_Delete" FontSize="16" Margin="20,0,0,0"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

    </Grid>
</Window>

github链接:https://github.com/ITAnt/JavaSwitch
安装文件在根目录的release文件夹

效果图

Windows开发环境搭建与运维实战:从WSL到Docker的完整指南 在实际技术开发和日常工作中,操作系统是承载一切软件和服务的基石。对于绝大多数开发者、IT从业者以及普通用户而言,Windows 不仅仅是一个操作系统,更是一个集成了庞大硬件生态、海量软件兼容性、成熟开发工具链和直观用户界面的综合性平台。理解 Windows 的优势,并非为了进行无谓的“站队”,而是为了在技术选型、环境搭建、问题排查和效率提升时,能够做出更符合实际需求、更高效的决策。无论是部署本地开发环境、运行企业级服务,还是进行日常办公和娱乐,Windows 都提供了独特的价值。 本文将从技术实践者的视角, 阅读详情

相关推荐

Windows技术生态解析:从硬件兼容到AI集成的开发者实践指南

如果你问一个开发者“为什么选择 Windows”,得到的答案可能五花八门:有人会说“因为游戏”,有人会说“因为 Office”,还有人会说“因为兼容性”。但这些都只是表象。Windows 真正的“伟大之处”,或者说它最核心的护城河,并非某个单一功能,而是一个由 硬件生态、软件兼容性、开发者工具链和商业应用场景 共同构成的、几乎无法被复制的 综合体验平台 。 对于技术从业者而言,理解这一点至关重要。它解释了为什么在服务器和移动端,Linux 和 macOS 可以各领风骚,但在个人计算和生产力领域,Window

weixin_34007906的博客 464

JDK 版本切换工具 JEnv

JDK 版本切换工具 JEnv

青年有志 2271

VS Code Remote-SSH远程开发实战:原理、配置与排错

Remote-SSH 是一种基于 SSH 协议的远程开发范式,它将 VS Code 的编辑器前端与远程服务器上的 vscode-server 后端通过加密隧道协同工作,实现本地界面操作、远程执行计算的‘伪本地’体验。其核心原理是进程级代理而非图形转发,因此具备低延迟、高一致性、环境零漂移等技术优势,特别适用于跨平台开发、GPU/CUDA 环境调试、生产级 Linux 开发等场景。相比传统 SSH + Vim、终端模拟器或 WSL,Remote-SSH 在语言服务(LSP)、调试器(Debugger)、Git

dianwei5413的博客 399

Windows下多个JDK版本快速切换

本文介绍了一种在Windows系统下快速切换多个JDK版本的解决方案。通过创建软链接(Symlink)并结合Git Bash的工程化实践,实现了一键切换不同JDK版本的功能。方案核心是将JAVA_HOME固定指向一个虚拟入口目录,通过动态修改软链接指向来切换JDK版本。文章详细说明了准备工作、环境变量配置、JDK安装规范、Git Bash脚本配置以及Windows开发者模式开启等步骤。最终只需在Git Bash中输入简单命令(如jdk8、jdk17等)即可完成版本切换,解决了多项目开发中频繁手动修改环境变量

12年Java研发经验,从码农到架构师/项目经理。专注技术分享,热爱Linux与开源生态,2023年起扎根长沙。 5355

SpringBoot+Vue3博客项目实战:从零搭建前后端分离管理系统

前后端分离架构是现代Web应用开发的主流模式,其核心原理是将用户界面与业务逻辑解耦,通过HTTP API进行数据交互。这种架构模式的技术价值在于提升开发效率、便于团队协作和实现技术栈的灵活选型。在工程实践中,SpringBoot作为后端框架,通过RESTful API提供数据服务;Vue3作为前端框架,负责构建用户界面和交互逻辑。典型的应用场景包括内容管理系统、电商平台后台等需要高效数据操作和良好用户体验的项目。本教程聚焦于博客管理系统这一具体场景,详细拆解了基于SpringBoot 3.x和Vue 3.x

weixin_34293141的博客 605

windows多版本jdk快速切换工具JavaEnvSwitcherApp v0.1.1.0

windows多版本jdk快速切换工具,能够快速切换电脑上已经安装的jdk环境,并且立即生效 。 支持本地jdk文件,比如openjdk是没有安装的

分层架构的认识

MVC:简单直接,适合小型项目,但易导致 Controller 臃肿。MVP:通过 Presenter 解耦 View 和 Model,适合需要严格分离的场景(如测试驱动开发)。MVVM:通过数据绑定减少胶水代码,适合复杂 UI 交互和现代前端框架。实际开发中,MVVM 是 MVC/MVP 的演进,尤其在前端开发中广泛应用。选择哪种模式取决于框架支持(如 Vue 用 MVVM)、团队习惯和项目复杂度。B/S与C/S架构:定义系统整体结构,关注客户端与服务端的职责划分和通信方式。

weixin_45809780的博客 1260

一键切换jdk版本工具

1.将RefreshEnv放到C:\Windows\system32中 2.用记事本打开bat脚本文件,修改脚本中对应版本jdk路径 3.以管理员权限执行该脚本即可使用

JavaFX入门

1、JavaFX简介: (1)JavaFX是JDK1.8及以上提供的大杀器,前台开发体验可以参考.NET的WPF和Android,强于之前的AWT和Swing。 (2)JavaFX由舞台stage(相当于Form),容器container(相当于layout),控件control等构成。 (3)依靠内置或独立的可视化场景编辑器Scene Builder,可以可视化设置属性、事件。 (4)组件(容器...

haoranhaoshi的博客 1029

JDK版本快速切换工具,界面操作超省心

本工具通过修改系统环境变量JAVA_HOME,快速切换JDK版本。您只需提前配置好不同版本的JDK路径(如JAVA_HOME8、JAVA_HOME11等),即可一键切换。操作简单,无需手动修改注册表或环境变量。详细说明博客:https://blog.youkuaiyun.com/qq_24396737/article/details/146413893?spm=1011.2124.3001.6209

计算机图形学入门30:动画与模拟介绍

计算机图形学入门,动画与模拟,物理模拟,质点弹簧系统,运动学,粒子系统,动作捕捉。

YanisWu的博客 1485

别再死记硬背命令了!用Docker Compose一键复现ActiveMQ反序列化漏洞(CVE-2015-5254)

本文详细介绍了如何使用Docker Compose一键复现ActiveMQ反序列化漏洞(CVE-2015-5254),通过Vulhub提供的容器化环境,简化传统漏洞复现的繁琐步骤。文章包含环境搭建、漏洞原理解析及实战操作,帮助安全研究人员高效验证漏洞,提升研究效率。

weixin_30372371的博客 482

Codex接入CCSwitch:本地代理与模型路由配置指南

在AI编程工具链中,本地代理与模型路由是连接智能体与模型服务的核心桥梁。Codex作为OpenAI推出的编程智能体,虽然具备强大的仓库理解和自主编码能力,但其默认模型链路固定,导致在多模型切换、内网统一管理及成本控制上存在天然瓶颈。CCSwitch正是为解决这一痛点而生的本地代理工具,它通过OpenAI兼容协议将Codex的请求透明转发至DeepSeek、通义千问等第三方模型服务,使模型切换如同点击按钮般简单。本文从本地代理和模型路由器的基础原理切入,系统讲解Codex与CCSwitch的安装配置、模型ID

weixin_33910460的博客 428

Visual Studio与VS Code深度对比:从IDE到编辑器,如何选择适合你的开发工具?

集成开发环境(IDE)与代码编辑器是现代软件开发中的核心工具,它们通过不同的设计哲学服务于开发流程。IDE通常提供开箱即用的完整工具链,涵盖编码、调试、测试和部署,适合大型、复杂的项目开发。而轻量级编辑器则强调速度和灵活性,通过扩展生态实现功能定制,尤其适配快速迭代和跨平台场景。在技术价值上,前者能显著降低环境配置成本,提升团队协作一致性;后者则鼓励个性化工作流,降低资源开销。对于Web开发、脚本编写和云原生应用,VS Code凭借其扩展市场和远程开发能力成为主流选择;而在Windows原生应用、企业级.N

weixin_34128839的博客 398

VScode利用EIDE和cortex-debug进行stm32开发(也适用51)

你是否因为keil页面太丑而烦恼,你是否因为keil编译太慢而恼怒,ok阿,今天也是给大家带来怎么在vscode上进行stm32的编程(我不会告诉你,我搞了好几天才搞好的💔💔💔)为什么是简单介绍?因为太啰嗦了,我嫌麻烦😋,大家可以去EIDE的官方文档去看。

weixin_73952614的博客 9394

计算机组成原理实验:手把手教你用模拟程序实现中断机制(附完整代码)

本文通过一个计算机组成原理模拟实验,手把手教你从零实现一个可工作的中断系统。实验详细演示了如何配置中断控制器、编写主程序与中断服务程序,并观察中断响应、现场保护和恢复的全过程,深入解析了中断原理的核心机制。

473

.NET到底是啥?Runtime、BCL、SDK、CLI四层拆解

.NET不是一门语言,也不是操作系统,而是一个分层演进的跨平台开发平台。其核心由Runtime(执行引擎,负责JIT编译IL字节码)、BCL(基础类库,封装OS能力的预编译二进制集合)、SDK(含Roslyn编译器与CLI工具链的开发套件)和CLI(底层构建协议,比IDE更真实的控制入口)四大部件构成。这种分层结构决定了.NET既能实现C#语法统一,又能支撑Windows专属API(如WMI、注册表)与Linux/macOS跨平台运行并存的技术现实。理解这四者关系,是解决Runtime版本冲突、自包含部署失

世范水晶 338

Windows 10下用Python 3搞定Android源码下载:最新repo工具避坑指南

本文详细介绍了在Windows 10系统上,使用Python 3和官方最新repo工具下载Android源码的完整流程。文章提供了从Git安装、环境配置到repo工具初始化、同步加速及常见错误排查的避坑指南,帮助开发者高效搭建稳定的源码下载环境。

weixin_29266749的博客 436

JetBrains 2025.1 全家桶落地指南:配置、调试与合法授权实战

JetBrains IDE 是基于 IntelliJ Platform 构建的智能开发环境,其核心价值在于工程化支持而非基础编码。它通过统一的项目模型抽象、本地化 AI 辅助引擎和增量式设置同步,显著提升多语言混合开发效率。技术价值体现在对 Spring Boot、Webman、.NET 等主流框架的深度调试支持,以及 Git 工作流、数据库集成、依赖分析等企业级能力。典型应用场景包括 Java 后端微服务调试、PHP 框架(如 Webman)热启 Debug、Rider 资源管理器扩展,以及跨设备开发环境

weixin_30617797的博客 566

香橙派5使用RK3588S内置NPU加速yolov5推理,实时识别数字达到50fps

香橙派5采用了RK3588S,内置的NPU达到了6Tops的算力,博主这里记录一下自己的踩坑过程,好不容易做出来的不能以后忘记了(手动狗头)。这里博主还在B站上发布了效果视频,大家感兴趣的话可以看一下。其中解决了先验框标注位置不对,或者出现非常多的框的问题

weixin_51651698的博客 2万+

微信DAT图片恢复全攻略:从文件路径到批量解密(附最新工具下载)

本文详细介绍了微信DAT图片恢复的全过程,从文件路径定位到批量解密操作,帮助用户高效恢复加密存储的图片。文章涵盖新旧版本微信的存储结构差异,推荐使用专业解密工具进行批量转换,并提供了提升恢复成功率的实用技巧和常见问题解决方案。

weixin_29325007的博客 455

Visual Studio与VS Code深度对比:从核心定位到实战场景的开发者选择指南

集成开发环境(IDE)与代码编辑器是现代软件开发的核心工具,它们通过提供代码编写、调试、构建和项目管理等功能,极大地提升了开发效率。从原理上看,IDE通常集成了编译器、调试器和项目管理工具,旨在为特定技术栈提供开箱即用的完整解决方案;而轻量级编辑器则更侧重于代码编辑本身,通过强大的插件生态来扩展功能,实现高度的定制化。其技术价值在于,前者能显著降低大型、复杂项目的配置与管理门槛,后者则为快速迭代、多语言混合开发及跨平台工作流提供了灵活性。在应用场景上,IDE更适合Windows平台下的C++、C#大型桌面应

424

vue2学习笔记2-老规矩,从Hello World开始,了解Vue实例和模板

想要把“Hello,World”放置在页面上,首先需要准备一个HTML的块级元素div,来承接内容。

l_q_l的专栏 1258

Rider 2025 深度解析:.NET 多语言开发的语义级 IDE 转型

IDE 不再是代码编辑器,而是嵌入开发流的实时决策系统。从 .NET 生态底层原理出发,Rider 2025 通过 Roslyn 与 ReSharper 融合的语义分析引擎,实现 C#、F#、VB.NET 等语言的上下文感知式诊断与智能补全;其内置 .NET Runtime 层打破传统进程隔离模式,支持跨语言、跨 SDK 的增量分析与调试协同。这种架构升级带来显著技术价值:诊断速度提升3倍、大型解决方案加载延迟降低84%、混合项目类型(如 MAUI+Vue+VB.NET)工程一致性增强。典型应用场景涵盖企业

weixin_33984032的博客 458

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

桌面宠物应用开发指南:从零构建轻量级桌面互动程序

桌面应用开发是软件开发领域的重要分支,其核心在于创建运行在用户本地设备上的图形界面程序。其原理基于事件驱动架构和图形渲染技术,通过处理用户输入和系统消息来实现交互功能。这项技术的价值在于能够提供响应迅速、资源可控的本地化体验,尤其适合需要常驻桌面、低资源占用的场景。在工程实践中,桌面宠物应用是典型的学习案例,它综合运用了窗口管理、图形绘制和事件处理等基础技术。这类应用通常采用Python的PyQt或Electron等技术栈实现,通过模块化设计将渲染、行为逻辑和交互分离,便于扩展和维护。对于初学者而言,通过构

weixin_33841503的博客 376

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java与.NET程序员的工程思维差异解析

Java和.NET作为企业级开发两大主流技术栈,其本质差异远超语法层面,根植于JVM与CLR运行时设计哲学、生态演进逻辑及工程实践范式。JVM强调强契约与确定性,适合对资源可控性要求严苛的金融系统;CLR侧重弹性伸缩与场景深度,在高吞吐HTTP服务中表现突出。二者在依赖注入、配置管理、日志追踪、ORM抽象等关键环节呈现系统性分野,直接影响微服务治理、CI/CD效率与跨团队协作质量。理解这些底层机制,是实现双栈共治、故障协同定位与架构平滑演进的技术前提。

diaojin6880的博客 445

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: 10年Android应用开发感想(Compose会是未来吗?)
ithouse
博客等级 码龄12年 200粉丝 212原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值