2010-10-11 7 views
5

Gibt es eine Möglichkeit, die Standardschriftgröße im Swing GTK LaF zu ändern?Wie ändert man die Standardschriftgröße im Swing GTK LookAndFeel?

Der GTK LaF scheint 72dpi anzunehmen, so dass alle Schriftarten nur 3/4 der Größe sind, die sie bei Verwendung eines 96dpi-Bildschirms haben sollten. Siehe hierzu Fedora bug für Details. Ich möchte in der Zwischenzeit einen Workaround finden, während ich auf die Reparatur warte.

Ich habe bereits versucht, die Schriftgröße über UIDefaults, wie empfohlen here, zum Beispiel, aber (wie auch dort bemerkt) der GTK LaF scheint dies zu ignorieren versucht.

I konnte ein Widget Fabrik bauen, die auch die gewünschte Schriftgröße würde für alle meine Swing-Widgets erstellen, aber das wird massiv invasive sein, so möchte ich diesen Weg zu vermeiden, wenn es eine andere Möglichkeit ist .

Edit: Die folgende nicht funktioniert:

public class GTKLaF extends com.sun.java.swing.plaf.gtk.GTKLookAndFeel { 
    @Override 
    public UIDefaults getDefaults() { 
    final float scale = 3f; 

    final UIDefaults defaults = super.getDefaults(); 

    final Map<Object,Object> changes = new HashMap<Object,Object>(); 

    for (Map.Entry<Object,Object> e : defaults.entrySet()) { 
     final Object key = e.getKey(); 
     final Object val = e.getValue(); 

     if (val instanceof FontUIResource) { 
     final FontUIResource ores = (FontUIResource) val; 
     final FontUIResource nres = 
      new FontUIResource(ores.deriveFont(ores.getSize2D()*scale)); 
     changes.put(key, nres); 
     System.out.println(key + " = " + nres); 
     } 
     else if (val instanceof Font) { 
     final Font ofont = (Font) val; 
     final Font nfont = ofont.deriveFont(ofont.getSize2D()*scale); 
     changes.put(key, nfont); 
     System.out.println(key + " = " + nfont); 
     } 
    } 

    defaults.putAll(changes); 

    return defaults; 
    } 
} 

Man könnte denken, diese Schlüssel-Wert-Paare mindestens ein Dutzend drucken würde, aber er druckt nur eins: TitledBorder.font. Anscheinend werden die anderen Schrifteigenschaften nicht von GTLLookAndFeel geliefert, sondern kommen von irgendwo anders!

Antwort

1

Es scheint keine Möglichkeit zum Festlegen der Standardschriftgröße zu geben. Der Fehler, auf den in der Frage verwiesen wurde, wurde jedoch behoben, daher ist dies jetzt nicht möglich.

0

Es ist etwas falsch mit dem Code, den Sie verknüpft haben. UIDefaults.get(key) Funktion muss keine Font Instanz zurückgeben. Es kann eine javax.swing.plaf.FontUIResource Instanz sein. folgende Code-Schnipsel findet alle installierten Aussehen und fühlt sich, als Änderungen alle Schriften Größen in einem Verhältnis von scale

float scale=1.1f; 
UIManager.LookAndFeelInfo looks[] = UIManager.getInstalledLookAndFeels(); 

for (UIManager.LookAndFeelInfo info : looks) { 

    //if you want to change LaF to a spesific LaF,such as "GTK" 
    //put here a if statement like: 
    //if(info.getClassName().contains("GTK")) 
    UIManager.setLookAndFeel(info.getClassName()); 

    UIDefaults defaults = UIManager.getDefaults(); 
    Enumeration newKeys = defaults.keys(); 

    while (newKeys.hasMoreElements()) { 
     Object obj = newKeys.nextElement(); 
     Object current = UIManager.get(obj); 
     if (current instanceof FontUIResource) { 
      FontUIResource resource = (FontUIResource) current; 
      defaults.put(obj, new FontUIResource(resource.deriveFont(resource.getSize2D()*scale))); 
      // System.out.printf("%50s : %s\n", obj, UIManager.get(obj)); 
     } else if (current instanceof Font) { 
      Font resource = (Font) current; 
      defaults.put(obj, resource.deriveFont(resource.getSize2D()*scale)); 
      // System.out.printf("%50s : %s\n", obj, UIManager.get(obj)); 
     } 
    } 
} 

finde ich etwas über das GTK LaF Problem ein Buch, Java Beispiele in aller Kürze, dritte Auflage. Werfen Sie einen Blick auf es here

+0

Dies funktioniert nicht. Für den GTK LaF macht es keinen Unterschied, wofür ich den Skalierungsfaktor eingestellt habe --- dieser Code hat keine merkliche Auswirkung. – uckelman

+0

@uckelman Funktioniert es bei anderen LaFs? –

+0

Der Aufruf von UIManager.getInstalledLookAndFeels() scheint einen katastrophalen Absturz von X zu verursachen, irgendwie --- die Maschine blockiert stark. Wenn ich diese und die äußere Schleife entferne, funktioniert dein Code für das Metal LaF. – uckelman

1

Mein Vorschlag ist es, Ihre eigene Unterklasse von GTKLookAndFeel zu erstellen und zu verwenden. In Ihrer Unterklasse würde ich wahrscheinlich getDefaults() überschreiben. In Ihrem getDefaults() können Sie die UIDefaults abrufen, die GTKLookAndFeel zurückgeben und wenn nötig anpassen würde. (Durch Einwickeln oder Subklassen sie und Überschreiben der UIDefaults.getFont Methoden.)

Holen Sie sich das aktuelle DPI mit

int dpi = Toolkit.getDefaultToolkit().getScreenResolution(); 

und wenn es nicht 72 ist kann man die Schriftgröße entsprechend ändern.

Edit: der Link, den Sie veröffentlicht, funktioniert nicht, glaube ich, weil GTKLookAndFeel die beteiligten Methoden überschreibt und keine Standardwerte von seinen Vorfahren durchlassen. Das Überschreiben sollte es Ihnen ermöglichen, dieses Problem zu umgehen.

+0

Siehe meine Bearbeitung der ursprünglichen Frage. Das Überschreiben von 'getDefaults()' funktioniert nicht, da die Schlüssel nicht vorhanden sind. – uckelman

+0

Mann, das muss ein schlecht entworfenes Aussehen und Gefühl sein. Während ich mir den Quellcode nicht angesehen habe, fange ich an zu fühlen, dass sie die Werte nur hart codiert haben. Als letzten Ausweg könntest du den GTKLookAndFeel-Code in deine eigene Klasse kopieren und etwas darin hacken. –

+0

Ja, ich denke, es ist eher ein dampfender Haufen. Ich gab dir das Kopfgeld, weil (1) die Zeit fast abgelaufen war und (2) du einer Antwort am nächsten kamst. (Mein Verdacht ist, dass das Überschreiben von mehr Methoden erforderlich ist, möglicherweise in einigen anderen Klassen in 'com.sun.java.swing.plaf.gtk'.) – uckelman

0

Ich habe eine Menge Zeit verloren herauszufinden, wie man unsere App auf Ubuntu anständig machen und ich kam zu diesem Hack. Ich habe versucht, wie jemand vorgeschlagen, GTKLookAndFeel zu erweitern, aber da es viele native Aufrufe an GTKEngine verwendet, und ich erkannte, dass es nicht lebensfähig war. Ich hoffe, das hilft

Kurz nach den Look Einstellung und fühle meine Hack checkGTKLookAndFeel() aufrufen, es reduziert die Schrift Standard von zwei Punkten:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
try { 
    InvoicexUtil.checkGTKLookAndFeel(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

public static void checkGTKLookAndFeel() throws Exception { 
    LookAndFeel look = UIManager.getLookAndFeel(); 
    if (!look.getID().equals("GTK")) return; 

    new JFrame(); 
    new JButton(); 
    new JComboBox(); 
    new JRadioButton(); 
    new JCheckBox(); 
    new JTextArea(); 
    new JTextField(); 
    new JTable(); 
    new JToggleButton(); 
    new JSpinner(); 
    new JSlider(); 
    new JTabbedPane(); 
    new JMenu(); 
    new JMenuBar(); 
    new JMenuItem(); 

    Object styleFactory; 
    Field styleFactoryField = look.getClass().getDeclaredField("styleFactory"); 
    styleFactoryField.setAccessible(true); 
    styleFactory = styleFactoryField.get(look); 

    Field defaultFontField = styleFactory.getClass().getDeclaredField("defaultFont"); 
    defaultFontField.setAccessible(true); 
    Font defaultFont = (Font) defaultFontField.get(styleFactory); 
    FontUIResource newFontUI; 
    newFontUI = new FontUIResource(defaultFont.deriveFont((float)(defaultFont.getSize() - 2f))); 
    defaultFontField.set(styleFactory, newFontUI); 

    Field stylesCacheField = styleFactory.getClass().getDeclaredField("stylesCache"); 
    stylesCacheField.setAccessible(true); 
    Object stylesCache = stylesCacheField.get(styleFactory); 
    Map stylesMap = (Map) stylesCache; 
    for (Object mo : stylesMap.values()) { 
     Field f = mo.getClass().getDeclaredField("font"); 
     f.setAccessible(true); 
     Font fo = (Font)f.get(mo); 
     f.set(mo, fo.deriveFont((float)(fo.getSize() - 2f))); 
    } 
} 

Aufruf der Konstruktor verschiedene Swing Komponenten GTK Arten zu initialisieren. nicht sehr elegant, aber es funktioniert

Verwandte Themen