为什么jmenu在使用systeml&f时不能正确呈现?

cgvd09ve  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(193)

背景

我已经提交了错误报告。一旦处理,将用报告更新帖子。
除了我在mcve中发布的代码外,没有其他代码在运行;运行这个程序时没有其他jvm处于活动状态(尽管我认为这不重要)。
我没有安装任何自定义系统ui的程序。
目标环境

Java 1.8.0_201
Windows 10 Home Edition

测试JDK
jdk 9至jdk 15
由第三方测试
乔治z.-windows 7-可以复制错误
davidkroukamp-windows10,jdk10-可以重现bug
camickr-windows10,jdk11-可以复制错误
canvas(discord)-windows10-可以重现bug
pawnee(discord)-macos catalina 10.15.7,jdk 15-无法复制错误

mcve公司

import javax.swing.*;

public class Demo {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(Demo::launchUI);
    }

    private static void launchUI() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        JFrame frame = new JFrame();
        JMenuItem report = new JMenuItem("Report");
        JMenu newMenu = new JMenu("New...");
        JMenu fileMenu = new JMenu("File");
        JMenuBar bar = new JMenuBar();

        newMenu.add(report);
        fileMenu.add(newMenu);
        bar.add(fileMenu);
        frame.setJMenuBar(bar);

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

复制步骤

运行mcve
单击菜单
调整窗口大小
再次单击菜单

mcve结果

针对jdk 11的windows 10计算机(尽管在所有已测试的主要java发行版上的结果相似):

菜单在调整窗口大小前后提供不同的渲染结果
有重叠的突出显示-突出显示的“新…”出血到“报告”菜单项。
有时“new…”箭头会与“report”重叠,如下所示。
windows 7-图片作者:george z

windows 10,jdk-画布图像(discord)

新发现

如果“report”菜单项的一部分超出windows边界,则不会出现突出显示错误。

这是通过更新菜单的弹出偏移量来实现的:

// apply this before creating any components
UIManager.put("Menu.menuPopupOffsetX", 20);
UIManager.put("Menu.menuPopupOffsetY", 20);

工作在。。。

macos catalina 10.15.7-图像由pawnee(discord)

问题

JMenu 正确使用系统l&f,如果是这样,我缺少什么来获得正确的结果(无额外间距,无高光渗入其他组件)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题