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

发现网上一键切换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,EditEnvironmentVariablesProcess.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;" /MProcess.Start("cmd", "/c setx JAVA_PATH \"" + item.Text + "\\bin;" + item.Text + "\\lib\\dt.jar;" + item.Text + "\\lib\\tools.jar;\" /M");// 执行bash命令:refreshenv.cmdProcess.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文件夹

效果图

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

3种方法解决Docker容器中配置运行环境问题

1. dockerfile用于通过脚本生成镜像 2.进入docker容器后&#xff0c;配置环境完&#xff0c;导出容器快照为镜像&#xff0c;拷贝到另一个主机&#xff0c;再进行加载&#xff1b; 3.在本地将依赖库等需要的文件按照目录整理好&#xff0c;映射到docker中。 1. dockerfile用于…

系统架构设计师-知识产权与标准化

目录 一、保护范围与对象 二、保护期限 三、知识产权人确定 四、侵权判断 五、标准化 一、保护范围与对象 知识产权是权利人依法就下列课题享有的专有权利&#xff1a; &#xff08;一&#xff09;作品&#xff08;著作&#xff09; &#xff08;二&#xff09;发明、实用…

用实力说话!望繁信科技与创鑫激光达成战略合作

2023年 &#xff0c;国内激光器龙头企业创鑫激光与望繁信科技正式签署战略合作协议。双方将在流程智能平台应用、流程梳理与数据分析等业务领域展开深度合作&#xff0c;携手共赴广阔未来&#xff01; 此次战略合作协议的签订&#xff0c;不仅标志着双方合作关系的进一步巩固和…

PHP 异步编程:从入门到精通

异步编程简介 异步编程是一种允许程序在等待某些操作&#xff08;如I/O操作或长时间运行的任务&#xff09;完成时继续执行其他任务的编程模式。这种方式可以显著提高应用程序的效率&#xff0c;尤其是在处理高延迟操作时。 PHP异步编程的实现 在PHP中&#xff0c;实现异步编…

鸿蒙开发:民族之光的崛起

在科技飞速发展的今天&#xff0c;操作系统的选择直接影响到我们的生活和工作方式。鸿蒙操作系统的出现&#xff0c;不仅代表了技术的进步&#xff0c;更是中国科技实力的象征&#xff0c;承载着“民族之光”的使命。 一、鸿蒙操作系统的背景 鸿蒙操作系统&#xff08;Harmony…

「接口自动化测试」高频面试题!

一、json和字典的区别&#xff1f; json就是一个文本、字符串&#xff1b;有固定的格式&#xff0c;格式长的像python字典和列表的组合&#xff1b;以key-value的键值对形式来保存数据&#xff0c;结构清晰&#xff0c;。可以说是目前互联网项目开发中最常用的一种数据交互格式…

C++进阶——红黑树

1.红黑树的概念及其介绍 红黑树是一种近似平衡的二叉搜索树&#xff0c;与AVL树极为相似&#xff0c;红黑树的主要特点在于它通过约束树中节点的颜色和其他规则&#xff0c;确保树的高度始终接近对数时间复杂度&#xff0c;从而使常见操作&#xff08;如插入、删除、查找&…

wpa_cli支持EAP-TLS认证运行设计

wpa_cli支持EAP-TLS认证运行设计 1 输入 1.1启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:/data/service/el1/public/wifi/sock…

物联网行业中3D打印工艺——FDM(熔融沉积成型技术)工艺

01 3D打印工艺——FDM工艺简介 格融沉积快速成型(Fused Deposion Modeling, FDM)是继光固化快速成型和叠层实体快速成型工艺后的另一种应用比较广泛的快速成型工艺。该技术是当前应用较为广泛的一种3D打印技术&#xff0c;同时也是最早开源的3D打印技术之一。该工艺方法以美国…

农场小程序带你走进生态农产品的世界

在快节奏的现代生活中&#xff0c;人们对食品安全的关注日益增强&#xff0c;对环境、健康农产品的需求也愈发迫切。然而&#xff0c;传统农产品市场往往信息不透明&#xff0c;消费者难以直接了解农产品的生长环境和生产过程&#xff0c;导致信任缺失。而农场小程序的出现&…

制定六西格玛人才培养方案需要考虑哪些因素?

当下&#xff0c;六西格玛作为一种先进的质量管理方法&#xff0c;被越来越多的企业采纳并应用于日常管理和流程优化中。然而&#xff0c;要成功实施六西格玛&#xff0c;关键在于培养一支具备高度专业素养和实战能力的六西格玛人才队伍。那么&#xff0c;制定六西格玛人才培养…

什么情况?上交所服务器被你们给买崩了?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 上午好&#xff0c;我的网工朋友。 9月27日早上&#xff0c;A股市场迎来了一波前所未有的火爆行情&#xff0c;成交量激增&#xff0c;市场情绪高…

加固与脱壳03 - 加固技术讨论

在 02 中&#xff0c;贴了一张图&#xff0c;里面涵盖了加固的绝大部分知识。现在我们稍微展开说一下其中几个&#xff0c;也是后续会深入学习的&#xff0c;其中一些还需要单独成系列才行。 代码混淆 分为 Java 层与 Native 层混淆。 Java 层的混淆主要分为两种&#xff1a…

基于微信小程序的交友平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷

在数字艺术和创意领域&#xff0c;[ComfyUI]Flux以其独特的虚实结合技术&#xff0c;已经成为艺术家和设计师们手中的利器。今天&#xff0c;我们激动地宣布&#xff0c;[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品&#xff0c;经典中文元素通过AI技术重现&#xff0c;包…

结婚证识别-离婚证识别接口-结婚证识别API应用场景

在信息化与智能化高速发展的今天&#xff0c;证件的自动识别技术逐渐成为了各行各业数字化转型的关键工具&#xff0c;而结婚证识别接口、离婚证识别接口正在悄然改变着传统的民政工作方式。 结婚证识别与离婚证识别接口是基于光学字符识别&#xff08;OCR&#xff09;技术的智…

热门财务软件大盘点,哪款最适合你?

本文介绍了ZohoBooks、金蝶云、速达会计等10款财务记账软件&#xff0c;各具优点&#xff0c;适合不同需求企业。各软件特点包括实时财务跟踪、多币种管理、无缝银行账户同步等&#xff0c;助企业高效管理财务。建议企业根据自身需求试用后选择。 一、Zoho Books Zoho Books是…

FreeRTOS列表与列表项

1.什么是列表与列表项 列表与列表项实际上是FreeRTOS中一个大量使用的一种数据结构 1.列表 列表的概念有点像链表&#xff0c;在 FreeRTOS 中&#xff0c;列表主要用于以下几个方面&#xff1a; 任务的管理&#xff1a;FreeRTOS 使用列表来管理不同的任务&#xff0c;包括就…

计算机网络面试题——第二篇

1. TCP拆包和粘包 现象 粘包&#xff1a;指在TCP传输中&#xff0c;发送方的多个数据包在接收方被合并在一个包接收&#xff0c;导致多条消息数据粘在一起&#xff0c;接收方无法正确区分这些消息的边界。拆包&#xff1a;指的是发送方的一个数据包在接收方被分成了多个包接收…

springboot集成mybatis插入数据时返回刚插入数据的自增id,插入数据没有使用实体

直接上代码吧 需要改两个地方一个dao一个xml 实现类里的逻辑 dao中新增注解 Options(useGeneratedKeys true, keyProperty "id")xml中新增 useGeneratedKeys"true" keyProperty"id"