Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Swing on high-DPI screen

I have a Java Swing program that uses the System Look And Feel:

UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName ());

The problem is that on a high-DPI system, the fonts in the frames are way too small. How can I make the text on my frames readable without having to change the fonts for ALL the frames? My program was written using Java 6 and has too many frames to modify.

like image 561
user1828108 Avatar asked Nov 12 '14 01:11

user1828108


2 Answers

You could physically modify the look and feel's font settings...

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

            }

        }

    }

}

We use a similar approach to increase/decrease the font size of the running application to test layouts (and eventually allow the user some additional control over the font size)

like image 68
MadProgrammer Avatar answered Oct 05 '22 23:10

MadProgrammer


I can't say for sure if this fully addresses the issue, but apparently high DPI Java is fixed for Mac in Java 7, and fixed for Linux and Windows in Java 9.

JEP 263: HiDPI Graphics on Windows and Linux: http://openjdk.java.net/jeps/263

corresponding ticket: https://bugs.openjdk.java.net/browse/JDK-8055212

like image 27
Joshua Goldberg Avatar answered Oct 05 '22 23:10

Joshua Goldberg