高DPI屏幕上的Java Swing

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

UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName ()); 

问题是在高DPI系统上,帧中的字体太小。 如何在不更改所有帧的字体的情况下使我的帧上的文本可读? 我的程序是使用Java 6编写的,并且有太多的框架需要修改。

你可以在物理上修改外观的字体设置……

HappyPig

 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 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); } } } } } 

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

我不能肯定地说这是否完全解决了这个问题,但显然在Java 7中针对Mac修复了高DPI Java,而在Java 9中修复了Linux和Windows。

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

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