JavaFX JavaFX Canvas einfaches Zeichenprogramm

Jak111

Mitglied
Ich will ein einfaches Zeichenprogramm erstellen, bei welchem man Linien und Rechtecke zeichnen kann (mithilfe der Maus). Dazu habe ich folgende Methoden erstellt:
Code:
public void mousePressed(MouseEvent e){
    pressedX = e.getX();
    pressedY = e.getY();

}
public void mouseDragged(MouseEvent e){
    releasedX = e.getX();
    releasedY = e.getY();

}
public void mouseReleased(MouseEvent e){

    gc = canvas.getGraphicsContext2D();
        gc.setFill(Color.BLUE);
        drawRectangle(gc);
}
private void drawRectangle(GraphicsContext gc){
    gc.setLineWidth(10);
    gc.fillRect(pressedX,
                pressedY,
                releasedX - pressedX,
                releasedY - pressedY);



}

Meine frage ist wie ich es schaffe dass das Rechteck bereits beim ziehen der Maus gezeichnet wird und sich die größe vom Rechteck verändert und erst beim auslassen der Maustaste das Rechteck dann effektiv gezeichnet wird. Ich habe bereits versucht in der Methode MouseDragged() die Methode dawRectangle() aufzurufen, dann wird zwar wie ich will das Rechteck beim ziehen der Maus gezeichnet, aber wenn man das Rechteck dann wieder kleiner zieht wird das effektive Rechteck (beim auslassen der Maustaste) durch das andere Rechteck was beim ziehen ensteht überschrieben (weil es größer ist).
 
Das habe ich mir auch schon gedacht, aber das Problem bei der Sache ist dass ich dann immer nur 1 Rechteck zeichnen kann (da alles auf dem Bildschirm immer gelöscht wird)...
 
Eine Möglichkeit wäre es, die bereits gezeichneten Objekte in einer Datenstruktur zu verwalten und bei Änderungen alles neu zu zeichnen.

Eine andere Möglichkeit könnte sein, bei den Maus-Bewegungen nicht das komplette Rechteck sondern nur den Rahmen im XOR-Modus zu zeichnen. Ich weiß aber nicht, ob JavaFX das überhaupt unterstützt. Wenn man im XOR-Modus zwei Mal dasselbe zeichnet, hat man danach wieder den Ursprungszustand. Wenn sich die Mausposition ändert, zeichnet man also einfach den vorherigen Rahmen mit den alten Koordinaten noch einmal (und löscht ihn dadurch), bevor man den Rahmen mit den neuen Koordinaten ausgibt. Das Prinzip funktioniert ganz gut, aber - wie gesagt - ich weiß nicht, ob JavaFX es unterstützt.

Dritte Möglichkeit: Man kopiert die Zeichenfläche beim Mausklick und kopiert sie während den Mausbewegungen bei Bedarf zurück, bevor man das geänderte Rechteck neu zeichnet.
 
So ein Problem hatte ich auch einmal, habe aber kein FX benutzt.

Ich habe in einer ArrayList die Zeichenobjekte gespeichert, sobal die Maustaste losgelassen wurde, wurde das Objekt dort eingetragen, das Rechteck ziehen zu können, habe ich über mouseDragged event listener gemacht. Dort wurde dann immer das Rechteck neu gezeichnet(und der Bildschirm gecleared sowie alle Objekte in der ArrayList gezeichnet).

Ab hier hatte ich performance Probleme. Vielleicht solltest du hier mit (anonymen) Threads arbeiten.
 
Ich habe jetzt ein ArrayList erstellt, in welchem die Rechtecke gespeichert werden (bei mouseReleased). Wie kann ich aber die Objekte von der ArrayList auf den GraphicsContext zeichnen?
 
Du iterierst durch die ArrayList und zeichnest sie - bei den Koordinaten einfach (nehmen wir an, das Rectangle der Schleife heißt rect) rect.getMinX, rect.getMinY, rect.getMaxX, rect.getMaxY .
Damit hättest du die kleinste x und y, sprich den Start, und die höchste x und y, sprich das Ende.
 

Zurück
Oben