Java Swing 的程序一直出现 UI 错位问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HolyGu
V2EX    问与答

Java Swing 的程序一直出现 UI 错位问题

  HolyGu 2021-05-21 02:27:41 +08:00 2414 次点击
这是一个创建于 1609 天前的主题,其中的信息可能已经有所发展或是发生改变。

首先电脑配置如下

  • 操作系统:Windows10 20H2 / Windows10 1909 (均为 MSDN 下载的原版)
  • 主板:ASUS Z490-E / ASUS C8DH
  • CPU:i9-10850K / Ryzen9 5950X
  • 内存:海盗船 DDR4 3600 16G2 / 宏 DDR4 3600 16G2
  • 显卡:ASUS 6900XT / ASUS 3090
  • 硬盘:东芝 RD20 / 海康威视 C2000 Pro
  • 电源:艾派电竞 AJ-850M
  • 显示器:DELL U2417H / DELL U2720Q
  • JDK:1.8 / 13

在如上两组配置中,运行使用了 Swing 编写的 UI 程序,在使用过程中,如果触发中文输入法,就会导致软件布局错乱

困扰了我很久了。。。求大佬帮忙

比如运行最简单的 Swing 的登录框实例,在输入中文的时候 UI 就会错乱

但是测试 JavaFX 编写的软件就是正常的

登录框代码示例:

import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class SwingLoginExample { public static void main(String[] args) { // 创建 JFrame 实例 JFrame frame = new JFrame("Login Example"); // Setting the width and height of frame frame.setSize(350, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* 创建面板,这个类似于 HTML 的 div 标签 * 我们可以创建多个面板并在 JFrame 中指定位置 * 面板中我们可以添加文本字段,按钮及其他组件。 */ JPanel panel = new JPanel(); // 添加面板 frame.add(panel); /* * 调用用户定义的方法并添加组件到面板 */ placeComponents(panel); // 设置界面可见 frame.setVisible(true); } private static void placeComponents(JPanel panel) { /* 布局部分我们这边不多做介绍 * 这边设置布局为 null */ panel.setLayout(null); // 创建 JLabel JLabel userLabel = new JLabel("User:"); /* 这个方法定义了组件的位置。 * setBounds(x, y, width, height) * x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。 */ userLabel.setBounds(10,20,80,25); panel.add(userLabel); /* * 创建文本域用于用户输入 */ JTextField userText = new JTextField(20); userText.setBounds(100,20,165,25); panel.add(userText); // 输入密码的文本域 JLabel passwordLabel = new JLabel("Password:"); passwordLabel.setBounds(10,50,80,25); panel.add(passwordLabel); /* *这个类似用于输入的文本域 * 但是输入的信息会以点号代替,用于包含密码的安全性 */ JPasswordField passwordText = new JPasswordField(20); passwordText.setBounds(100,50,165,25); panel.add(passwordText); // 创建登录按钮 JButton loginButton = new JButton("login"); loginButton.setBounds(10, 80, 80, 25); panel.add(loginButton); } } 

错乱的样子 1

还有比如 BurpSuite 这款软件,也是触发输入法就会错乱 错乱的样子 2

13 条回复    2021-05-22 04:51:15 +08:00
oneforallsoft
    1
oneforallsoft  
   2021-05-21 08:15:50 +08:00
都什么年代了 还搞 swing 浪费宝贵生命
300
    2
300  
   2021-05-21 08:44:38 +08:00 via Android
我印象里也遇到过,好像是在 IDE 里改编码或者是编译时加 UTF8 还是 GBK 来着

Jetpack Compose 也支持桌面了,也是跑 Java 上的,或许这个简单点
supermoonie
    3
supermoonie  
   2021-05-21 09:03:55 +08:00 via iPhone
@winterbells jb 的 chromium 内核的浏览器咋样了
amwyyyy
    4
amwyyyy  
   2021-05-21 09:14:21 +08:00
不要把时间浪费在这里/div>
wangsipeng95
    5
wangsipeng95  
   2021-05-21 09:17:24 +08:00
我一直在想这个 Swing 到底是啥。。。
happyeveryday
    6
happyeveryday  
   2021-05-21 10:25:56 +08:00
不要把时间浪费在这里,学这就是浪费生命
iminto
    7
iminto  
   2021-05-21 10:46:21 +08:00
我写的 swing gui 没遇到过你说的问题。

绝对定位这种方式,很少人用了,swing 有自己的 flow 布局。

另外,可以考虑用 idea 或者 netbean 的可视化插件来拖拉拽控件
qping
    8
qping  
   2021-05-21 11:57:15 +08:00
搞个浏览器界面呗
raaaaaar
    9
raaaaaar  
   2021-05-21 12:00:58 +08:00 via Android
表示现在做实验还在用这玩意
nicevar
    10
nicevar  
   2021-05-21 12:28:54 +08:00   1
楼主,这个可以调节一下分辨率试试看,win10 下面 125%的缩放容易导致 java 软件出现这个问题
另外楼上那些不提供解决方案说废话倒是很起劲
HolyGu
    11
HolyGu  
OP
   2021-05-22 00:29:59 +08:00
@oneforallsoft
@amwyyyy
@iminto

不是自己写的软件,,是市面上挺多商业化软件,都遇到了这个问题,例如 BurpSuite 、SoapUI 、CobaltStrike 之类的,凡是使用了 Swing 的,都会遇到这个问题
HolyGu
    12
HolyGu  
OP
   2021-05-22 00:30:37 +08:00
@nicevar 我尝试了 1080P 100% 150%,4K 125% 150% 175% 200%都会遇到这个问题,,很奇怪。。。
HolyGu
    13
HolyGu  
OP
   2021-05-22 04:51:15 +08:00
@nicevar 我在 stackoverflow 找到了一个临时解决方案。创建一个值为 false 的环境变量 J2D_D3D 。关闭 Java 程序使用 Direct3D 渲染以后,Swing 的程序就正常了。。
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2662 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 26ms UTC 15:05 PVG 23:05 LAX 08:05 JFK 11:05
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86