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

2021-05-21 02:27:41 +08:00
 HolyGu

首先电脑配置如下

在如上两组配置中,运行使用了 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);
    }

}

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

1763 次点击
所在节点    问与答
13 条回复
oneforallsoft
2021-05-21 08:15:50 +08:00
都什么年代了 还搞 swing 浪费宝贵生命
winterbells
2021-05-21 08:44:38 +08:00
我印象里也遇到过,好像是在 IDE 里改编码或者是编译时加 UTF8 还是 GBK 来着

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

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

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

不是自己写的软件,,是市面上挺多商业化软件,都遇到了这个问题,例如 BurpSuite 、SoapUI 、CobaltStrike 之类的,凡是使用了 Swing 的,都会遇到这个问题
HolyGu
2021-05-22 00:30:37 +08:00
@nicevar 我尝试了 1080P 100% 150%,4K 125% 150% 175% 200%都会遇到这个问题,,很奇怪。。。
HolyGu
2021-05-22 04:51:15 +08:00
@nicevar 我在 stackoverflow 找到了一个临时解决方案。创建一个值为 false 的环境变量 J2D_D3D 。关闭 Java 程序使用 Direct3D 渲染以后,Swing 的程序就正常了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/778261

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX