Montag, 14. Januar 2013

Eclipse RCP - Textboxen zur Schriftgröße unter Windows anpassen

Artikelinhalt:Anpassen von Widgets wie Textboxen (org.eclipse.swt.widgets.Text) oder Labels (org.eclipse.swt.widgets.Label) an die Bildschirmauflösung.

Problembeschreibung: in Windows hat der Benutzer einer Eclipse RCP Anwendung die Möglichkeit die Schriftgröße in Standartapplikationen anzupassen. Unter Windows 7 ist dies in Systemsteuerung\Alle Systemsteuerungselemente\Anzeige möglich, indem die Textgröße auf Mittel 125% oder Größer 150% eingestellt wird. Weiterhin kann ein Benutzer auch unter Benutzerdefinierte Textgröße (DPI) festlegen die größe beliebig skalieren. Werden Widgets mit fester Größe erzeugt, so kann es vorkommen, dass ein Text im Label nicht mehr vollständig angezeigt wird.

Zu beachten ist, dass hier nicht die Schriftgröße skaliert wird, sonder die Auflösung (Anzahl der Bildpunkte oder oft auch DPI oder PPI genannt). In dieser Erkenntnis liegt auch die Lösung für das Problem.

Lösungsansatz: Mit Hilfe der Toolkit AWT Klasse ist es möglich die Bildschirmauflösung abzufragen. Unter Windows 7 ist die Textgröße von 100% gleichzusetzen mit 96 DPI. Die Textgröße von 150% entspricht dann 144 DPI.

Mit folgenden zwei Zeilen kann der DPI Wert ermittelt werden.

Toolkit tk = Toolkit.getDefaultToolkit();
System.out.println("Screen resolution = " + tk.getScreenResolution());


Beispielanwendung:

Schritt 1: Erzeuge eine Eclipse RCP Applikation mit den Namen com.blogspot.javadingsda.getweindowdpiaus aus dem Template RCP Application with a view 

Schritt 2: Ändere die Klasse View wie folgt ab:

package com.blogspot.javadingsda.getweindowdpi;

import java.awt.Toolkit;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;

public class View extends ViewPart {
 public static final String ID = 
           "com.blogspot.javadingsda.getweindowdpi.view";

 public void createPartControl(Composite parent) {
  
  Toolkit tk = Toolkit.getDefaultToolkit();
  int resolution = tk.getScreenResolution();
  double factor = ((double)resolution) / 96;
  
  parent.setLayout(new GridLayout(1, false));
  
  // Text der sich der Auflösung anpasst
  Text textBox = new Text(parent,SWT.BORDER);
  GridData gdTextBox = new GridData();
  gdTextBox.widthHint = (int)(54 * factor);
  textBox.setLayoutData(gdTextBox);
  textBox.setText("Teststring!");
  
  // Text der sich nicht anpasst 
  Text textBox2 = new Text(parent,SWT.BORDER);
  GridData gdTextBox2 = new GridData();
  gdTextBox2.widthHint = 54;
  textBox2.setLayoutData(gdTextBox2);
  textBox2.setText("Teststring!");
  
 }

 public void setFocus() {
 }
}

Schritt 3: Die Schriftgröße wie oben genannt in Windows ändern und Anwendung ausprobieren. Das obere Text Feld sollte sich anpassen, während das untere immer die gleiche Größe behält.