2014-12-05

Breite von Dialogen

Was ist eine geeignete Breite für Dialoge? Die Frage mag sich komisch anhören. Was ich meine, ist folgendes… Nehmen wir an, Sie haben eine Menge Fließtext, zum Beispiel die Linzenzbestimmungen Ihrer Software. Um die anzuzeigen, bietet es sich an, sie in Swing in eine JEditorPane zu packen, die wiederum von einer JScrollPane (denken Sie an meinen vorherigen Post) gekapselt wird. Mit der JEditorPane können prima einfache HTML-Texte angezeigt werden, deren Links sogar anklickbar sind. Die Breite der Komponente ergibt sich aus der Breite der scroll pane; diese bezieht sie vom Layoutmanager des übergeordneten Containers. Hat der Dialog also in sich eine passende Größe, bekommt auch der Fließtext eine geeignete Breite. Was aber, wenn ein entsprechendes ordnendes Element fehlt?
Screenshot: viel zu breiter Dialog
Solche Monster möchte und sollte man niemandem zumuten. Zumal die Lösung recht einfach ist. Die Basis vieler Swing-Komponenten, java.awt.Component, kennt seit Java SE 5 die Methode setPreferredSize(). Der kann man eine bevorzugte Größe mit auf den Weg geben.
Nur – sind wir jetzt wirklich weiter? Woher sollen wir im Zeitalter von Hoch-DPI-Anzeigen passende Pixelwerte nehmen? Mein pragmatischer Vorschlag ist, sich am verwendeten Zeichensatz und einem Stück Text mit geeigneter Länge zu orientieren. Ich habe das in Notes and Tasks umgesetzt, der entsprechende Code ist eingecheckt. Als Text verwende ich den berühmten Blindtext Lorem ipsum: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy. Hier die Methode, die die Größe berechnet:
 private static final String LOREM = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy";  
   
 /**  
  * Gets the rectangle for one line of lorem ipsum  
  *  
  * @param font font  
  * @return size  
  */  
 public static Rectangle2D getSizeForLoremIpsum(Font font) {  
     Graphics2D g = (Graphics2D) Application.getInstance().getGraphics();  
     return font.getStringBounds(LOREM, g.getFontRenderContext());  
 }  
Und so wird sie verwendet:
 Rectangle2D r = FontUtilities.getSizeForLoremIpsum(pane.getFont());  
 pane.setPreferredSize(new Dimension((int) r.getWidth(), 12 * (int) r.getHeight()));  
Screenshot: Dialog mit geeigneter Breite
Sieht hübsch aus, oder?
Anmerken möchte ich noch, dass sich die grundsätzliche Idee auch in anderen Frameworks prima umsetzen lässt. Gefällt Ihnen meine Idee? Schreiben Sie mir.

1 comment:

  1. Kleiner Nachtrag: Aus Gestaltungssicht hat mein Dialog noch ein kleines Problem. Es sollte auffallen, wenn Sie sich den zweiten Screenshot genauer ansehen. Wissen Sie, was ich meine? Die Auflösung folgt im nächsten Post.

    ReplyDelete