Java Idee zur Umsetzung eines interaktiven "Schaltbildes"

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo Community,

mein Anliegen ist das Folgende: ich möchte ein Schaltnetz (siehe hier ein Beispiel) mit Java umsetzen. Dabei geht es mir NICHT darum, einen Editor zu bauen, sondern ich möchte ein spezifisches (festes) Schaltnetz sozusagen als interaktive Demonstration bereitstellen, wo man an Eingangsknöpfen "herumspielen" kann und sich dementsprechend auch die Farben der Leitungen ändern (high pegel/low pegel) uvm.

Der Programmiertechnische Ansatz dahinter wird Objektorientiert sein. D.h. es gibt einzelne Bausteine, die durch "Leitung"s-Objekte miteinander verbunden sind und (auf der Grundebene) z.B. "And"-Objekte, welche die Gatter darstellen.

Schön und gut. Das wäre sozusagen der Backstage-Ansatz und so auch funktionstüchtig. Nun soll es dazu aber auch eine entsprechende Oberfläche geben, d.h. einfach dieses gesamte Schaltnetz als "interaktive Grafik".

Und meine Frage ist nun, wie man das am effizientesten realisiert. Sicherlich wäre es ein Ansatz alles Hardkodiert mit Koordinaten auf ein JPanel zu zeichnen, das scheint mir aber nicht so ganz robust/optimal!

Wie würdet Ihr das machen?

Freue mich über Vorschläge,
CPU
 
Du braucht wohl einen Algorithmus zur effizienten Anordnung der Bauteile - möglichst ohne Überschneidungen der Leitungen.

Eine sehr einfache Variante wäre: Platziere die Eingänge ganz oben in der Mitte und dann gehst du deinen Bauteilbaum Stück für Stück durch und setzt die Teile mit einem fixen Abstand von z.B. 40px untereinander und wenn ein Bauteil mehrere Ausgänge hat, dann kommen die angeschlossenen Bauteile darunter nebeneinander.

Während der Algorithmus läuft wirst du feststellen, dass du Platznot bekommst in der Horizontalen. Dann gehst du per Backtracking zurück und machst mehr Platz.

Am Ende sollte das Ganze dann wie ein B+-Baum aussehen, nur dass es auch noch Querverbindungen gibt.


EDIT: Die Variante mit grafischem Editor ist natürlich wesentlich einfacher ;) (Zumindest für die Darstellung am Ende)
 
Hey,

schon einmal Danke für die Antwort. Es scheint jedoch, dass ich mich falsch ausgedrückt habe: die Anordnung der Bausteine und Leitungen steht schon fest. Die ist fix, da muss auch kein Algorithmus mehr dran rumbasteln.

Es geht mir einzig darum, wie ich das am saubersten und effizientesten mit Java zeichnen kann, und dann die Farben wechseln kann.

Eine Variante wäre z.B. alles mit festen Koordinaten zu zeichen: d.h. die Objekte haben eine Methode paint(Graphics2D g) und die wird dann von dem Toplevel-Container aufgerufen und so zeichnen sich die Komponenten. Aber das ist ja ein bisschen "hausbacken".

Gibt es hierfür noch bessere andere Wege?

Gruß,
CPU
 
Du hast eine Klasse für die Komponenten (und ggf. eine Hierarchie darunter) und diese hat grundlegende Felder wie Image (eben der Sprite, der dargestellt wird), eine x-Koordinate, eine y-Koordinate, vielleicht noch ein boolean, ob sie überhaupt sichtbar ist. Und das war es dann auch fast schon. Eine eigene paint-Logik brauchen die Komponenten nicht.

Dann hast du irgendeine von JPanel erbende Klasse, in der du die paintComponent überschreibst und dort findet sämtliche Zeichenlogik statt.
Woher weiß dieses Panel was wohin muss? Es gibt eine zentrale Stelle (kann der Einfachheit halber innerhalb der Panel-Klasse liegen), in der eine Collection mit sämtlichen zu zeichnenden Objekten liegt. Zu jedem repaint wird nur über diese Collection iteriert und es wird g2d.drawImage(...) benutzt, um jedes Objekt an seine Stelle zu zeichen. Ist der z-index von Bedeutung (Überlappungen), musst du die Collection vor dem Zeichnen entsprechend sortieren. Ansonsten zeichnest du logischerweise von hinten nach vorn.

Beispiel aus der Hüfte:
Code:
for (CircuitElement ce : elementsToDraw) {
   if (!ce.isVisible()) {
      continue;
   }
   g.drawImage(ce.getImage(), ce.getPosX(), ce.getPosY(), null);
}

Durch Eingaben des Benutzers, kann sich die Position der Elemente natürlich zur Laufzeit verändern. Dadurch ist da auch nichts hardcoded drin.
 
Hey,

okay, wenn dieses Architekturpattern so in Ordnung ist, dann werde ich das so machen.

Vielen Dank! :)

Gruß,
CPU
 
Zurück
Oben