当前位置: 首页 > 知识库问答 >
问题:

高DPI屏幕上的Java Swing

何浩荡
2023-03-14

我有一个使用系统外观的Java Swing程序:

UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName ());

问题是在高DPI系统中,框架中的字体太小了。我如何使框架上的文本可读而不必更改所有框架的字体?我的程序是使用Java6编写的,有太多的框架需要修改

共有2个答案

琴正初
2023-03-14

我不能肯定这是否完全解决了这个问题,但显然高DPIJava在Java7中为Mac修复,在Java9中为Linux和Windows修复。

JEP 263:Windows和Linux上的HiDPI图形:http://openjdk.java.net/jeps/263

对应票:https://bugs.openjdk.java.net/browse/JDK-8055212

公西俊才
2023-03-14

您可以实际修改外观的字体设置。。。

import java.awt.EventQueue;
import java.awt.Font;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                setDefaultSize(24);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JLabel("Happy as a pig in a blanket"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static void setDefaultSize(int size) {

        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")) {

                System.out.println(key);
                Font font = UIManager.getDefaults().getFont(key);
                if (font != null) {
                    font = font.deriveFont((float)size);
                    UIManager.put(key, font);
                }

            }

        }

    }

}

我们使用类似的方法来增加/减少正在运行的应用程序的字体大小,以测试布局(并最终允许用户对字体大小进行一些额外的控制)

 类似资料:
  • 低密度120 dpi mdpi中密度160 dpi 高密度240 dpi XHDPI:2.0 HDPI:1.5 MDPI:1.0(基线) 这意味着,如果为xhdpi设备生成200x200映像,则应为hdpi生成150x150的相同资源,为mdpi生成100x100,最后为ldpi设备生成75x75映像 这是否意味着如果我以640x360为基线,我必须制作以下4组图像: 1)ldpi-大小480x2

  • 本文向大家介绍写个方法获取屏幕的DPI相关面试题,主要包含被问及写个方法获取屏幕的DPI时的应答技巧和注意事项,需要的朋友参考一下

  • 问题内容: 我正在开发一个需要屏幕DPI的应用程序。我检查了几个论坛,并获得了一个代码段,内容如下: 但是无论我的屏幕分辨率值是多少,该值都保持不变,为96。代码有什么问题? 对于同一件事,我得到了另一个代码,如下所示: 但是再一次,无论我的屏幕分辨率如何,返回的值都是相同的96。怎么了?我的代码是错误的还是我以错误的方式解释了它? 问题答案: 问题是没有人知道操作系统的确切物理尺寸,甚至连操作系

  • 在Android系统中如何获得屏幕的可用高度?我需要的高度减去状态栏/菜单栏或任何其他可能在屏幕上的装饰,我需要它为所有设备工作。另外,我需要在onCreate函数中了解这一点。我知道这个问题以前有人问过,但我已经尝试过他们的解决方案,但没有一个奏效。以下是我尝试过的一些事情: 我已经在API7-17上测试了这段代码。不幸的是,在API 13的底部水平和垂直都有额外的空间,而在API 10、8和7

  • 您好,我正在中制作一个游戏,我想知道如何以及最好的方式是在屏幕上添加游戏。以下是玩家健康状况小于或等于0的代码: 我不确定该怎么做,因为我试图使用另一个py呼叫游戏,但玩家死亡的时间被重置为0并返回,所以玩家死亡的地方可能发生任何事情吗?

  • 我不明白以下几点: 三星Galaxy S3显示720px 1280px,屏幕尺寸为4.8英寸 因此,屏幕密度可以评估为305dpi 在Android屏幕支持推荐页面中,305dpi对应于“xhdpi”限定符 所以我的问题是:为什么运行在GS3上的应用程序会从“mdpi”限定符中获取资源? 作为更新,请参阅我的代码以测试它: main.xml: strings.xml文件夹{"值","值-ldpi"