Grundgerüst des Programms

Das Programm Orbit wird nach im Folgendem beschriebenen Grundgerüst strukturiert. Auch wenn sich das Konzept nicht immer genau an diesem Grundgerüst orientiert, so ist es doch grundlegend, um den Programmaufbau zu verstehen und nachvollziehen zu können.

Datei- und Verzeichnisstruktur

Im Arbeitsverzeichnis wird eine Quellcode Datei „Orbit.java“ als Ausgangspunkt des Programms erstellt. Außerdem werden folgende Packages (und damit Ordner) im Arbeitsverzeichnis angelegt:

  • GUI
  • Backend

Im Package GUI wird alles untergebracht, dass einen starken Bezug zur Benutzeroberfläche oder den Zeichenroutinen hat. Später werden wir sehen, dass auch etwas mehr in das Package gerutscht ist, was nicht direkt mit der GUI zu tun hat.

Im Package Backend werden die grundsätzlichen Berechnungen zu den Satellitenbahnen durchgeführt.

Orbit.java

import GUI.OWindow;
 
public class Orbit
{
 
  private OWindow window;
 
  public Orbit()
  {
    window = new OWindow();
  }
 
  public static void main(String[] args)
  {
    Orbit app = new Orbit();
  }
}

Diese Datei stellt den Einsprungspunkt der Ausführung dar. In der main wird zunächst eine Instanz der Programmklasse erzeugt, in deren Konstruktor dann das (Programm-) Fenster erstellt wird.

GUI

OWindow.java

package GUI;
 
public class OWindow extends JFrame implements Runnable
{
  public OWindow()
  {
    super();
    javax.swing.SwingUtilities.invokeLater(this);
  }
  public void run()
  {
    buildGUI();
  }
  private final void buildGUI()
  {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Orbit");
 
    JPanel mainpanel = new JPanel();
    mainpanel.setLayout(new BoxLayout(mainpanel,BoxLayout.Y_AXIS));
    {
      mainpanel.add(Box.createVerticalStrut(4));
 
      JPanel buttonpanel = new JPanel();
      buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.X_AXIS));
      buttonpanel.setMaximumSize(new Dimension(999999,30));
      {
        // Hier werden die Buttons später hinzugefügt
      }
      mainpanel.add(buttonpanel);
 
      mainpanel.add(Box.createVerticalStrut(8));
 
      JPanel simspeedpanel = new JPanel();
      simspeedpanel.setLayout(new BoxLayout(simspeedpanel,BoxLayout.X_AXIS));
      simspeedpanel.setMaximumSize(new Dimension(999999,15));
      {
        // Hier wird angezeigt, welche Simulationsgeschwindigkeit gerade eingestellt ist
      }
      mainpanel.add(simspeedpanel);
 
      mainpanel.add(Box.createVerticalStrut(8));
 
      JPanel sliderpanel = new JPanel();
      sliderpanel.setLayout(new BoxLayout(sliderpanel,BoxLayout.X_AXIS));
      sliderpanel.setMaximumSize(new Dimension(999999,30));
      {
        // Platz für einen Slider, mit dem wir später die Simulationsgeschwindigkeit einstellen
      }
      mainpanel.add(sliderpanel);
 
      mainpanel.add(Box.createVerticalStrut(8));
 
      // Platz für unser Zeichenfeld, das den Großteil der Arbeit übernehmen wird
 
      mainpanel.add(Box.createVerticalStrut(2));
    }
    add(mainpanel);
 
    // Platz für eine Statusbar, auf der wir uns aktuelle Werte anzeigen lassen werden
 
    pack();
    setLocationRelativeTo(null);
    setVisible(true);
  }
}

Zunächst wird der JFrame initialisiert, anschließend wird das OWindow mit Komponenten gefüllt. Eine Änderung der Oberfläche sollte - laut Swing Philosophie - nur der Event Dispatcher Thread von Swing/AWT durchführen. Deshalb wird die Methode buildGUI erst durch run(), und damit der ausführbaren Methode des Runnables, dass dem Event Dispatcher Thread übergeben wird, aufgerufen. Genau genommen ist dieser Schritt hier noch überflüssig. Änderungen an der GUI sind aus jedem Thread erlaubt, solange noch keine Componente „realized“ wurde. Dies geschieht insbesondere, wenn die Methode setVisible(true) aufgerufen wird. Um Einheitlichkeit zu wahren, wird hier buildGUI() aber trotzdem durch den Event Dispatcher ausgeführt.

TODO

Backend