Java s'ajustant automatiquement à l'ajustement de taille de police de Windows 7


Dans Windows 7, si vous modifiez la taille de la police via le Panneau de configuration->Apparence et personnalisation -> Affichage "Rendre le texte et d'autres éléments plus grands ou plus petits", il ajuste non seulement les tailles de menu, mais aussi la taille du contenu textuel des applications comme Notepad, Wordpad, Firefox.

Est-il un moyen d'obtenir de Java automatiquement l'échelle de la police, sans avoir à manuellement échelle?

Author: Joshua McKinnon, 2010-01-11

2 answers

Il y a deux parties à cela:

  1. Obtenir vos composants, polices, etc à l'échelle
  2. Obtenir vos mises en page pour échelle

Pour Swing, la première partie est facile - tout commence par un seul appel.

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

Sous Windows, cela l'amènera à respecter votre paramètre Small/Large fonts (DPI).

Voici deux captures d'écran d'une application de test rapide que j'ai jeté ensemble, démontrant à quoi cela ressemble sur ma machine sous Windows 7 @ 96dpi (taille de police normale) et @ 144dpi (150%)

D'abord l'exemple de taille de police par défaut:

Application Swing avec Windows en utilisant des tailles de police normales

Maintenant avec une taille de police plus grande (150%):

Swing app avec Windows en utilisant des tailles de police plus grandes

Il n'y a pas de changement de code entre les exécutions, uniquement la déconnexion et le retour avec de nouveaux paramètres DPI. J'ai défini exprès une taille d'image fixe pour démontrer que mon conteneur ne se met pas à l'échelle, ce qui a poussé mon étiquette vers le bas pour s'adapter.

Voici mon code source - couper-coller et l'exécuter vous-même:

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class SwingFontTest
{
    private static void createGUI()
    {
        JButton button = new JButton("my button with Some Text");
        JLabel label = new JLabel("and a label");

        JPanel panel = new JPanel(new FlowLayout());
        panel.add(button);
        panel.add(label);

        JFrame frame = new JFrame("Title!");
        frame.setContentPane(panel);
        frame.setSize(300,125);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run()
            {
                createGUI();
            }
        });
    }

}

Le Look & Feel fournit le dimensionnement par défaut, mais il appartient à l'auteur de l'interface graphique d'utiliser des unités évolutives dans leurs mises en page. Cela demande des efforts (les mises en page évolutives sont aussi une douleur sur les pages Web!), mais c'est certainement réalisable.

Je recommande d'utiliser une mise en page comme FormLayout qui vous permettra de définir vos mises en page dans des unités de dialogue (DLU), car celles-ci évoluent en DPI. Cela vous permettra de faire évoluer la taille de vos conteneurs et devrait aider à limiter les comportements tels que le déplacement de l'étiquette vers la ligne suivante en raison du dimensionnement. Si la taille de l'image a été déterminée à l'aide d'unités de dialogue, elle pourrait être identique, mais plus grande.

Il est tard - alors c'est tout pour l'instant.

 6
Author: Joshua McKinnon, 2017-02-08 14:19:42

Cela dépend entièrement de la boîte à outils GUI que vous utilisez. Je suis presque certain que SWT, par exemple, prendrait automatiquement les nouvelles tailles (car il utilise des widgets natifs). AWT pourrait aussi bien pour tout ce que je sais. Pouvez-vous spécifier quelle boîte à outils vous utilisez et si vous avez déterminé que ce n'est pas déjà fait ce que vous voulez (et peut-être comment)?

 0
Author: Jherico, 2010-01-12 00:47:44