Die richtige Bildschirmgröße unter Java

Schon oft bin ich im Netz auf die Problematik gestossen: Taskleiste ist im Weg... oder die Zentrierung funktionert nicht 100%ig bei allen System.

Vielleicht ist das auch etwas kleinlich und man könnte die 30Pixel* der Taskleiste bei 864Pixel Bildschirmhöhe vernachlässigen. Aber ich fand das eher störend. In meiner Anwendung soll man die Bildschirmgröße prozentual einstellen können. Dann aber bitte zur sichtbaren Fläche und nicht zur Bildschirmgröße, sonst muss man unnötig in der Höhe 95% einstellen, nur weil die Taskleiste die Statuszeile überdeckt.

Hier ist jedenfalls ein Codeschnipsel, der hilft die richtige Größe zu berechnen:

  1. // Bildschirmgröße ein guter Ausgangswert
  2. Dimension _screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
  3.  
  4. // Hier kommt im Netz selten gefundene Zeile: Das sichtbare Rechteck!
  5. Rectangle _maxBounds = GraphicsEnvironment.getLocalGraphicsEnvironment()
  6. .getMaximumWindowBounds();
  7.  
  8. // Jetzt kann man die Ränder berechnen...
  9. Insets _screenInsets =
  10. new Insets(
  11. (int)_maxBounds.getY(), (int)_maxBounds.getX(),
  12. (int)(_screenDimension.getHeight() -_maxBounds.getY() - _maxBounds.getHeight()),
  13. (int)(_screenDimension.getWidth() - _maxBounds.getWidth() - _maxBounds.getX()));
  14.  
  15. // ... und die Dimensionen der sichtbaren Bildschirmoberfläche.
  16. Dimension _screenDimensionView =
  17. new Dimension(
  18. (int)(_screenDimension.getWidth() - _screenInsets.right - _screenInsets.left),
  19. (int)(_screenDimension.getHeight() - _screenInsets.top - _screenInsets.bottom));
  20.  
  21. // nun ist ein Fenster mit exakter 75%iger Breite und Höhe und richtig
  22. // zentiert in greifbarer Nähe:
  23. new JFrame("Test"){
  24. {
  25. this.setSize(
  26. (int) (_screenDimensionView.getWidth() *.75 ),
  27. (int) (_screenDimensionView.getHeight() *.75 )
  28. );
  29. this.setLocation(
  30. (int)((_screenDimensionView.getWidth() - _widthPixels) / 2) + _screenInsets.left,
  31. (int)((_screenDimensionView.getHeight() - _heightPixels) / 2) + _screenInsets.top);
  32. this.setVisible(true);
  33. }
  34. }