Java regolando automaticamente la regolazione della dimensione del carattere di Windows 7


In Windows 7, se si modifica la dimensione del carattere tramite il Pannello di controllo->Aspetto e personalizzazione -> Display "Crea testo e altri elementi più grandi o più piccoli", regola non solo le dimensioni del menu, ma anche la dimensione del contenuto del testo di app come Blocco note, Wordpad, Firefox.

C'è un modo per ottenere Java per ridimensionare automaticamente il font senza doverlo ridimensionare manualmente?

Author: Joshua McKinnon, 2010-01-11

2 answers

Ci sono due parti in questo:

  1. Ottenere i tuoi componenti, font, ecc per scalare
  2. Ottenere i layout a scala

Per Swing, la prima parte è facile-tutto inizia con una chiamata.

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

Su Windows, questo farà sì che rispetti l'impostazione DPI (Small/Large Fonts).

Ecco due screenshot di un'app di test rapido che ho messo insieme, dimostrando come appare sulla mia macchina in Windows 7 @ 96dpi (dimensione normale del carattere) e @ 144dpi (150%)

Primo esempio di dimensione del carattere predefinita:

Swing app con Windows utilizzando le normali dimensioni dei caratteri

Ora con la dimensione del carattere più grande (150%) impostata:

Swing app con Windows utilizzando le dimensioni dei caratteri più grandi

Non vi è alcuna modifica del codice tra le esecuzioni, solo disconnessione e ritorno con nuove impostazioni DPI. Ho impostato una dimensione del frame fissa di proposito per dimostrare che il mio contenitore non sta ridimensionando le dimensioni, il che ha causato la spinta verso il basso della mia etichetta per adattarla.

Ecco il mio codice sorgente: taglia e incolla ed eseguilo tu stesso:

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

}

Il Look & Feel fornisce il dimensionamento predefinito, ma spetta all'autore della GUI utilizzare unità scalabili nei loro layout. Ci vuole sforzo (i layout scalabili sono un dolore anche sulle pagine web!), ma è sicuramente raggiungibile.

Vi consiglio di utilizzare un layout come FormLayout che vi permetterà di definire i layout in Unità di dialogo (DLU), come questi scala con DPI. Ciò ti consentirà di ridimensionare i tuoi contenitori e dovrebbe aiutare a limitare i comportamenti come lo spostamento dell'etichetta alla riga successiva a causa del dimensionamento. Se la dimensione del frame è stata determinata usando le unità di dialogo, potrebbe essere fatta apparire uguale, solo più grande.

È tardi - quindi per ora è tutto.

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

Questo dipenderebbe interamente da quale toolkit GUI stai usando. Sono quasi certo che SWT, ad esempio, raccoglierebbe automaticamente le nuove dimensioni (poiché utilizza widget nativi). AWT potrebbe anche per quanto ne so. Puoi specificare quale toolkit stai usando e se hai determinato che non sta già facendo quello che vuoi (e possibilmente come)?

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