V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
HolyGu
V2EX  ›  问与答

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

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

    首先电脑配置如下

    • 操作系统: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 浪费宝贵生命
    winterbells
        2
    winterbells  
       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
    不要把时间浪费在这里
    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   ·   实用小工具   ·   3094 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:53 · PVG 18:53 · LAX 02:53 · JFK 05:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.