web-dev-qa-db-fra.com

Java Swing sur écran haute DPI

J'ai un programme Java Swing qui utilise le System Look And Feel:

UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName ());

Le problème est que sur un système à haute résolution, les polices dans les cadres sont beaucoup trop petites. Comment puis-je rendre le texte de mes cadres lisible sans avoir à changer les polices de tous les cadres? Mon programme a été écrit en utilisant Java 6 et a trop de cadres à modifier.

16
user1828108

Vous pouvez modifier physiquement les paramètres de police de l'apparence ...

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

            }

        }

    }

}

Nous utilisons une approche similaire pour augmenter/diminuer la taille de la police de l'application en cours d'exécution pour tester les mises en page (et éventuellement permettre à l'utilisateur un contrôle supplémentaire sur la taille de la police)

14
MadProgrammer

Je ne peux pas dire avec certitude si cela résout complètement le problème, mais un DPI apparemment élevé Java est corrigé pour Mac dans Java 7, et corrigé pour Linux et Windows en Java 9.

JEP 263: Graphiques HiDPI sous Windows et Linux: http://openjdk.Java.net/jeps/26

ticket correspondant: https://bugs.openjdk.Java.net/browse/JDK-8055212

2
Joshua Goldberg