当应将Java Swing应用程序缩放到正常大小时,它在高DPI屏幕上看起来很小

时间:2018-09-26 14:11:47

标签: java swing highdpi

如何在高DPI屏幕上使Java Swing应用程序GUI正确缩放以适应用户?

请参见下面的屏幕截图。在顶部,您可以看到与Ubuntu的文件浏览器图标和gedit相比,该应用程序的外观多么小。在左下角,您可以大致看到应用程序的尺寸(在常规DPI监视器上也可以看到)。因此,我正在寻找一种在使用高DPI监视器时正确缩放应用程序GUI的方法。例如,gedit在常规DPI和高DPI监视器上看起来都相同。我希望我的应用程序具有这种行为。

enter image description here

以下是该应用的源代码:https://github.com/baobabKoodaa/baopass

这是一个影响许多应用程序的极其普遍的问题。我在Ubuntu上运行的应用程序中大约有一半可以正确缩放,而无需用户采取任何操作,另一半没有缩放,而且看起来很小。请注意,我主要是在寻找一种不需要用户采取任何措施的解决方案(尽管目前已经获得了任何帮助,但我还没有找到任何扩展它的方法)。

根据this缩放比例应该已经可以使用。没有。除了在Java 9上运行应用程序外,我不确定这是否是错误或是否应该执行其他步骤?

4 个答案:

答案 0 :(得分:4)

您必须告诉图形库按比例放大应用程序。

GDK_SCALE = 2 ./应用程序

将在环境中设置适当的信息,并且小部件将按比例缩放渲染,以便每个像素有效地占用四个像素的足迹。

请注意,在加载整个Swing库之后,不会显示启动屏幕(如果使用Java的启动屏幕支持),因此无论您尝试进行何种设置,启动屏幕都不会缩放。

在某些平台上,例如Fedora的Linux发行版,也可以进行部分缩放,从而可以设置GDK_SCALE = 1.5。请记住,它不是通用的,并且不能设置为您可能想要的任何缩放比例。

最后,较早的JVM完全忽略了此设置,因此,如果您不使用Java 9或更高版本启动,则可能无法正常工作。而且,当然,针对较旧的JVM和不同的操作系统进行调整的方式往往会有所不同(如果它们可以工作的话)。

答案 1 :(得分:0)

您好,这个问题有点模棱两可,但是您是否要实现这一目标:

private void makeFrameAdjust2YourSize(JFrame aFrame)
{
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    //use your own percentage for width and height like = 0.8 * screenSize.width to cover %80 of screen width
    aFrame.setSize(screenSize.width, screenSize.height);
}

请记住,如果您为控制台应用程序使用多个监视器,则可能需要付出更多努力。

希望有帮助

答案 2 :(得分:0)

根据帖子中的link

  

开发人员可以手动缩放应用程序中的所有GUI元素   在HiDPI显示器上运行时,但这需要很多   应用程序以及Swing和AWT组件的重构工作   没有写成与从   外面。

如果您很幸运,并且应用程序对更改字体大小的响应很好(不会失真),则可以尝试缩放不同屏幕尺寸的默认外观字体大小。
这是一个简单的演示,假定基本屏幕宽度为1400(表示此宽度的应用看起来不错):

public static void main(String[] args) {

    SwingUtilities.invokeLater(() ->{

        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException
                | UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
        setDefaultSize(getScaleForScreenSize());

        //todo start GUI 
    });
}

private static double getScaleForScreenSize() {

    double screenSize = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
    return screenSize / 1400; //assuming app looks good at 1400
}

//source: https://stackoverflow.com/a/26877737/3992939
private static void setDefaultSize(double scale) {

    Set<Object> keySet = UIManager.getLookAndFeelDefaults().keySet();
    Object[] keys = keySet.toArray(new Object[keySet.size()]);

    for (Object key : keys) {
        if ((key != null) && key.toString().toLowerCase().contains("font")) {
            Font font = UIManager.getDefaults().getFont(key);
            if (font != null) {
                font = font.deriveFont((float)(scale * font.getSize()));
                UIManager.put(key, font);
            }
        }
    }
}

答案 3 :(得分:0)

您似乎正在使用Linux。您可以使用命令行开关

java -Dsun.java2d.uiScale=2 -jar some_application.jar

来自https://wiki.archlinux.org/index.php/HiDPI#Java_applications