2D-Grafik Mehrere Linien (nacheinander) übereinander Zeichnen

  • Themenstarter Themenstarter McThyzer
  • Beginndatum Beginndatum
M

McThyzer

Gast
Hallo,

ich sitze derweil an meiner Facharbeit.
Mein Thema ist in Java ein Programm zu schreiben, welches erlaubt durch simples zusammenklicken einen Schaltplan zu erstellen und diesen dann zu Simulieren.

Mein Problem ist, dass ich in Java noch keinerlei Grafik-Erfahrung habe. Ich habe es bis jetzt geschafft ein JFrame zu erstellen mit den jeweiligen Buttons für die Komponenten.

Jetzt geht es aber darum diese Komponenten (bei bedarf) zu Zeichnen.

Dafür habe ich ein JPanel erstellt und ich möchte nun auf diesem JPanel je nachdem wie der Benutzer das zusammenklickt diese Komponenten und Verbindungskabel zeichnen.

Ich weiß wie ich mit "drawLine(...)" vor Programmstart definieren kann wie ne Linie aussieht, bzw. diese variabel mache und durch Inputs verschieben kann.
Jedoch konnte ich nirgendswo einen Weg finden mit den standard Libarys (AWT od. SWING) das 'Graphics'-Objekt vom JPanel "weiterzugeben" und demnach funktionen wie:

<jpanel>.g.drawLine(...)
<jpanel>.g.drawRect(...)
<jpanel>.g.drawLine(...)
<jpanel>.g.drawLine(...)

Dieses JPanel-Graphics objekt während das Programm läuft zu ändern und Komponenten hinzuzufügen.

Vielleicht ist das Prinzip dahinter schon abwegig, aber wie gesagt habe ich keinerlei Erfahrung mit diesen Panels und Frames.
In anderen Programmiersprachen (Pascal, Basic, etc.) konnte man mit simplen befehlen immer auf ein und die selbe hintergrundfläche zeichnen.
Bei Java ist das anscheinend nicht so leicht möglich.


=> Kurz:
Ich möchte, dass ich mit den "drawLine(...)" befehlen außerhalb der "paintComponent(...)"-Methode dieses Graphics-Objekt verändern und somit theoretisch wie in Pascal damit Arbeiten kann.
 
=> Kurz:
Ich möchte, dass ich mit den "drawLine(...)" befehlen außerhalb der "paintComponent(...)"-Methode dieses Graphics-Objekt verändern und somit theoretisch wie in Pascal damit Arbeiten kann.
kurz: geht nicht. es wird bei komponenten wird ausschließlich in der paint... gezeichnet. natürlich kann man aus der methode heraus weitere methoden aufrufen, aber man muss sich immer “merken“ was wie darstellt werden soll und diese info innerhalb der paint... zur verfügung stellen
 
Zuletzt bearbeitet:
Und wie lösen wir das problemchen?

Muss ich ne andere Grafik-Engine/API importieren (oder etwas in der Art) um zu einem Ähnlichen Ziel zu gelangen?
 
Mehr Infos könnten helfen. Bisher klingt es, als könntest du im Panel einfach eine List<Shape> bzw. List<Line2D> anlegen wo die Linien drinliegen, und in paintComponent werden die dann alle mit graphics2D.draw(theShape) gezeichnet.
 
Wahlweise kannste dir auch erst alles in ein BufferedImage zeichnen und in der paint();
nur noch das zeichnen lassen.
 
Mehr Infos könnten helfen. Bisher klingt es, als könntest du im Panel einfach eine List<Shape> bzw. List<Line2D> anlegen wo die Linien drinliegen, und in paintComponent werden die dann alle mit graphics2D.draw(theShape) gezeichnet.

Ich glaube das wäre sogar möglich. - Den Wald vor lauter Bäume nicht mehr gesehen.

Danke. 😀

Ich war so fixiert von der idee von außen auf diese Graphics zuzugreifen anstatt zu überlegen wie ich diese 'Shapes' von Innen "reinzuziehen".
Wenn ihr versteht. 🙂

Falls das nicht geklappt haben sollte melde ich mich noch einmal.

- Das mit den Buffered Image könnte ich evtl. auch gebrauchen und kombinieren mit der List.
 
Das Selbe funktioniert übrigens auch hervorragend mit einem eigenen Interface, das eine Methode mit Graphics - Paramter enthält. Danach könnte man natürlich noch Klassen schreiben die dieses dann implementieren und somit in einer Liste mit den Interface verwenden. Oder aber man erzeugt im Programm eine anonyme Klasse des Interfaces und überschreibt dort die Zeichenmethode. Danach fügt man diese der entsprechenden Liste hinzu.

Beispielsweise:

Zeichen - Interface
Java:
import java.awt.Graphics2D;

public interface Paintable {
    public void paintObject(Graphics2D g);
}

Zeichenklasse
Java:
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;

public class DrawIt extends JPanel {

    private ArrayList<Paintable> paintables = new ArrayList<Paintable>();

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        for(Paintable paintable : paintables) {
            paintable.paintObject(g2);
        }
    }

    // irgendwo anders im Programm:
    protected void testmethode() {
        Paintable paintable = new Paintable() {
            public void paintObject(Graphics2D g) {
                g.drawString("Hallo", 10, 10);
            }
        };
        paintables.add(paintable);
        repaint();
        //weiterer Ablauf
    }
}

Wäre auch ne Möglichkeit, falls du noch ganz Spezielles zeichnen solltest!
 
Zuletzt bearbeitet:

Zurück
Oben