Java Swing 如何判断JSplitPane左侧面板是否折叠 如何判断右侧面板是否折叠

相同问题:

  • 如何判断JSplitPane顶部面板是否折叠 如何判断底部面板是否折叠
  • 如何判断JSplitPane面板1是否折叠 如何判断面板2是否折叠

监听PropertyChangeEvent

可以通过判断分割条的位置来判断左右侧面板是否被折叠:

  • 当分隔条的位置为0的时候,左侧面板被折叠
  • 但是由于窗体可大可小,折叠右侧面板时,分隔条的位置是不固定的。
    • 如果窗体大小时固定的话,我们可以尝试折叠右侧面板,记下此时分隔条的位置Xxx。
      • 当下次分隔条的位置为Xxx时,就说明右侧面板被折叠。
    • 不过我发现jSplitPane.getMaximumDividerLocation()jSplitPane.getMinimumDividerLocation()相加起来的结果,就是折叠右侧面板时分隔条的坐标值。
阅读全文 »

使用JPopupMenu实现系统托盘中文弹出菜单

TrayIcon构造函数

方法 描述
TrayIcon(Image image) Creates a TrayIcon with the specified image.
TrayIcon(Image image, String tooltip) Creates a TrayIcon with the specified image and tooltip text.
TrayIcon(Image image, String tooltip, PopupMenu popup) Creates a TrayIcon with the specified image, tooltip and popup menu.

可以看到,我们可以使用PopupMenu作为系统托盘程序的弹出菜单。

PopupMenu不支持中文

但是PopupMenu有如下问题:

  • PopupMenu添加的菜单项MenuItem不支持图标,是awt级组件,没有提供paint函数,也就意味着不能重绘,去实现带图标的菜单;
  • PopupMenu只支持英文,中文会乱码,如果确实需要支持中文的话,运行的jar时候,需要使用加上-Dfile.encoding=GBK参数,指定以GBK编码来运行,一般来说我们要处理的文件也通常是UTF-8编码的,如果使用这个GBK编码运行的jar来处理此文件,就会出现乱码问题。

基于JPopupMenu的解决方案

JPopupMenu是Swing组件,而且支持图标+文本,更美观。在标准API里,添加JPopupMenu的有两种方式:
1、Component组件调用setComponentPopuMenu(JPopupMenu)方法来绑定JPopupMenu;
2、JPopupMneu调用show(Component c,int x,int y)方法绑定至组件的(x,y)坐标上;

但问题是,TrayIcon不是Component,不能通过上述两种方法进行绑定。

弹出菜单的触发过程

在 鼠标点击或者按下快捷键 时 生成弹出菜单。

所以我们可以在点击系统托盘的时候,单独创建一个Component作为JPopupMenu的参考坐标。

这个Component,我们可选择Java现成的JWindow或者JDialog等等。经过测试JDialog来实现会更好一些。

JPopupMenu实现系统托盘弹出菜单的步骤

获取鼠标点击的坐标值,在这个坐标值上创建一个JDialog,然后将JPopupMenu绑定到这个JDialog的(0,0)位置上,弹出菜单显示后再获取弹出菜单的尺寸,再根据尺寸回调JDialog的大小,这样JPopupMenu就完美的遮罩了JDialog,看不出JDialog的存在。
不过这样做,还有最后一个问题,那就是在弹出菜单消失后,JDialog依然存在;

这倒不用担心,JPopupMenu提供了:firePopupMenuCanceled()、firePopupMenuWillBecomeInvisible()、firePopupMenuWillBecomeVisible(),菜单消失、消失前、消失后,这三个回调函数。

所以,我们可以选择重写其中任意一个函数,在JPopupMenu消失之前关闭JPopupMenu的载体即可。

这样就可以完美实现系统托盘弹出菜单啦。

阅读全文 »

  • InetAddress表示IP地址的操作类,可以通过此类指定要连接的主机名称。
  • 在开发中如果要取得一个网络资源可以使用URL类进行定位,只有使用IO流的方式进行读取。
  • 使用URLEcoder可以为信息编码,使用URLDecoder可以为编码的内容进行解码
  • ServerSocket主要用在TCP协议的服务器程序开发上,使用accept()方法等待客户端连接,每一个连接的客户端都使用一个Socket表示。
  • 服务器端加入多线程机制之后,就可以同时多个用户提供服务。
  • UDP属于不可靠的连接协议,采用数据报的形式,对于服务器发送的信息,客户端不一定能收到。

批处理 延迟变量SetLocal EnableDelayedExpansion

在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。

示例0

D:\Desktop\test\CMD\延迟变量\test0.bat
1
2
set value=kkkkkkk 
echo %value%

将这段代码保存到test0.bat文件中。然后打开cmd,进到对应目录下,执行这个文件。

运行结果:

1
2
3
4
5
6
7
D:\Desktop\test\CMD\延迟变量>test0.bat

D:\Desktop\test\CMD\延迟变量>set value=kkkkkkk

D:\Desktop\test\CMD\延迟变量>echo kkkkkkk
kkkkkkk

最后一行是结果,但是在结果之前,还有两句,set value=kkkkkkk 和 echo kkkkkkk。
但是在test0.bat中,我们并没有写echo kkkkkkk这样的语句,这表明至少在执行到echo %value% 这句时,cmd已经把 变量value 替换成 kkkkkkk这个值。

这就是变量的扩展

那么什么是变量的延迟扩展呢?

变量延迟两要素

  • 变量延迟的启动语句是“SetLocal EnableDelayedExpansion”,
  • 并且变量要用一对英文感叹号“!!”括起来
阅读全文 »

运行python却弹出Microsoft Store

今天安装好python之后,我在cmd中输入python,但是并没有运行python,而是弹出了Microsoft Store,并跳转到python的安装下载界面。

image-20220506230809031

然后我查找了一下,居然有两个python:

1
2
3
4
5
6
7
D:\Desktop\test\CMD\phone>python

D:\Desktop\test\CMD\phone>where python
C:\Users\HellloWorld\AppData\Local\Microsoft\WindowsApps\python.exe
C:\Users\HellloWorld\AppData\Local\Programs\Python\Python310\python.exe

D:\Desktop\test\CMD\phone>

解决方案

打开设置,进入应用执行别名,关掉python.exe即可。

阅读全文 »

安装Chocolatey

1
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

未完待续

参考资料

https://chocolatey.org/install
https://sspai.com/post/55309
https://juejin.cn/post/6994715287178182693
https://zhuanlan.zhihu.com/p/53421288
https://zhuanlan.zhihu.com/p/42441423
https://www.jianshu.com/p/a1ba81746fe8

Scrcpy.exe命令详解

  • 指定连接到192.168.10.4:5555的手机
  • 启动镜像时关闭手机屏幕
  • 进制手机休眠
  • 镜像最大高度为768
  • 镜像标题设置为xxx
  • 镜像永远置顶
1
scrcpy.exe -s 192.168.10.4:5555 --turn-screen-off --stay-awake -m 768 --window-title xxx --always-on-top
阅读全文 »