• Keine Ergebnisse gefunden

PROCESSING PROCESSING

N/A
N/A
Protected

Academic year: 2022

Aktie "PROCESSING PROCESSING"

Copied!
26
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

PROCESSING PROCESSING

JAVAFX JAVAFX

Created by Michael Kirsch & Beat Rossmy

(2)

INHALT INHALT

1.

1.

2.

2.

1.

Imports

Imports Node Graph

AnimationTimer

Wie können wir einen Loop erzeugen?

3.

1.

2.

4.

1.

Anonymous Classes

Was sind Anonyme Klassen?

Wie können wir nun den Kreis bewegen?

Key Input

Wie können wir auf Tasteneingaben reagieren?

(3)

IMPORTS

IMPORTS

(4)

IMPORTS IMPORTS

Imports binden Funktionalitäten von Entwicklern ein.

import javafx.application.Application;

import javafx.scene.Group;

import javafx.scene.Scene;

import javafx.scene.shape.Circle;

import javafx.stage.Stage;

public class Main extends Application { Circle ball;

public void start(Stage primaryStage) throws Exception{

Group root = new Group();

ball = new Circle (100,100,50);

root.getChildren().add(ball);

primaryStage.setTitle("Pong");

primaryStage.setScene(new Scene(root, 300, 275));

primaryStage.show();

}

public static void main(String[] args) {launch(args);}

}

(5)

NODE GRAPH NODE GRAPH

Der Node Graph enthält alle UI Elemente.

Die "Leafs" des Graphen sind dabei die sichtbaren Elemente.

Die "Branches" stellen

strukturierende Elemente dar, die wiederum Nodes als Kinder haben.

https://docs.oracle.com/javafx/2/scenegraph/jfxpub-scenegraph.htm

(6)

NODE GRAPH NODE GRAPH

Der Befehl getChildren() returned die Liste aller Kind- Knoten eines Nodes.

Durch add können wir ein neues Kind zu dieser Liste hinzufügen.

Auf diese Weise bauen wir den Node-Graph manuell auf.

//...

Group root = new Group();

ball = new Circle (100,100,50);

root.getChildren().add(ball);

//...

(7)

ANIMATIONTIMER

ANIMATIONTIMER

(8)

WIE KÖNNEN WIR EINEN LOOP WIE KÖNNEN WIR EINEN LOOP

ERZEUGEN?

ERZEUGEN?

Betrachten wir den bisherigen Code können wir bereits in start , ähnlich wie in setup unsere Applikation initialisieren.

Wo führen wir nun aber unseren draw Loop aus?

(9)

import javafx.application.Application;

import javafx.scene.Group;

import javafx.scene.Scene;

import javafx.scene.shape.Circle;

import javafx.stage.Stage;

public class Main extends Application { Circle ball;

public void start(Stage primaryStage) throws Exception{

// setup

Group root = new Group();

ball = new Circle (100,100,50);

root.getChildren().add(ball);

primaryStage.setTitle("Pong");

primaryStage.setScene(new Scene(root, 300, 275));

primaryStage.show();

// draw

while(true) {/* hier könnte unser Code stehen */}

}

public static void main(String[] args) {launch(args);}

}

(10)

Die auf der vorherigen Folie demonstrierte Methode über eine nicht endene while Schleife einen Loop zu erzeugen, in dem wir unsere Animationen zeichnen können ist möglich, bietet aber einige Nachteile.

Besser ist es auf von JavaFX vorgefertigte Methodiken zurückzugreifen.

Für diesen Fall bietet JavaFX die Klasse AnimationTimer, die Code in einem gleichmäßigen Zeitabstand wiederholt.

Dieser wird typischerweise wie folgend eingebunden.

(11)

//...

public void start(Stage primaryStage) throws Exception{

// setup

Group root = new Group();

ball = new Circle (100,100,50);

root.getChildren().add(ball);

primaryStage.setTitle("Pong");

primaryStage.setScene(new Scene(root, 300, 275));

primaryStage.show();

// draw

new AnimationTimer () {

public void handle (long currentNanoTime) { /* hier könnte unser Code stehen */

}

}.start();

}

//...

}

(12)

Was passiert hier?

(13)

ANONYMOUS CLASSES

ANONYMOUS CLASSES

(14)

WAS SIND ANONYME KLASSEN?

WAS SIND ANONYME KLASSEN?

Anonyme Klassen erlauben es uns Variationen von Klassen

während der Initialisierung eines Objekts zu erzeugen.

(15)

public class XXX { int x;

public XXX () {}

void doSomething () {

System.out.println("do something");

} }

public class Main {

public static void main (String [] args) { XXX test = new XXX () {

@Override

void doSomething() {

System.out.println("do something else");

} };

test.doSomething(); // -> "do something else"

} }

(16)

Beim Konstruktoraufruf haben wir die Möglichkeit die verwendete Klasse zu überschreiben.

Das bedeutet bereits angelegte Funktionalität kann abgeändert werden, aber keine neue hinzugefügt.

Das liegt daran, dass der Datentyp der Elternklasse diese

Funktionalität nicht enthält und daher nicht auf diese verwiesen werden kann.

Der Code kann noch weiter verknappt werden.

(17)

public class XXX { int x;

public XXX () {}

void doSomething () {

System.out.println("do something");

} }

public class Main {

public static void main (String [] args) { new XXX () {

@Override

void doSomething() {

System.out.println("do something else");

}

}.doSomething(); // -> "do something else"

} }

(18)

Nun wird direkt ein Objekt ohne Ziel erzeugt.

Durch den . Operator kann sofort auf dem erzeugten Objekt eine Methode aufgerufen werden.

Dies sehen wir auch beim AnimationTimer.

(19)

//...

public void start(Stage primaryStage) throws Exception{

// setup

Group root = new Group();

ball = new Circle (100,100,50);

root.getChildren().add(ball);

primaryStage.setTitle("Pong");

primaryStage.setScene(new Scene(root, 300, 275));

primaryStage.show();

// draw

new AnimationTimer () {

public void handle (long currentNanoTime) { /* hier könnte unser Code stehen */

}

}.start();

}

//...

}

(20)

WIE KÖNNEN WIR NUN DEN KREIS WIE KÖNNEN WIR NUN DEN KREIS

BEWEGEN?

BEWEGEN?

(21)

//...

public void start(Stage primaryStage) throws Exception{

// setup

Group root = new Group();

ball = new Circle (100,100,50);

root.getChildren().add(ball);

primaryStage.setTitle("Pong");

primaryStage.setScene(new Scene(root, 300, 275));

primaryStage.show();

int x = 0;

// draw

new AnimationTimer () {

public void handle (long currentNanoTime) { x++;

ball.setCenterX(x);

}

}.start();

}

//...

}

(22)

KEY INPUT

KEY INPUT

(23)

WIE KÖNNEN WIR AUF TASTENEINGABEN WIE KÖNNEN WIR AUF TASTENEINGABEN

REAGIEREN?

REAGIEREN?

(24)

//...

public void start(Stage primaryStage) throws Exception{

Group root = new Group();

ball = new Circle (100,100,50);

root.getChildren().add(ball);

primaryStage.setTitle("Pong");

primaryStage.setScene(new Scene(root, 300, 275));

primaryStage.show();

new AnimationTimer () {

public void handle (long currentNanoTime) { /* hier könnte unser Code stehen */

}

}.start();

// Tasten Eingabe

scene.setOnKeyPressed(new EventHandler<KeyEvent>() { @Override

public void handle(KeyEvent event) {/* Tastendruck */}

});

scene.setOnKeyReleased(new EventHandler<KeyEvent>() { @Override

public void handle(KeyEvent event) {/* Loslassen der Tasten */}

});

} //...

(25)

Auch hier sehen wir wieder die Verwendung anonymer Klassen.

Die Klasse EventHandler wird beim Übergeben and scene

überschrieben.

(26)

QUELLEN QUELLEN

https://docs.oracle.com/javafx/2/scenegraph/jfxpub-scenegraph.htm

Referenzen

ÄHNLICHE DOKUMENTE

In Processing hat jedes Pixel eines Bildes eine Nummer.. Wir beginnen

Interfaces, etc in einer Datei zu definieren, ist in Java nicht möglich. Jede Klasse, etc erhält ihr

// deklariere die Variablen: Seitenlänge und Faktor (anfangs 1 später -1) void setup () {. // lege

Created by Michael Kirsch &amp; Beat Rossmy... Sto

Eine schriftliche Prüfung ndet Ende des Semesters statt, in der der Sto der Vorlesung geprüft wird.. Der Termin wird

Neue Position bei Tastendruck (gezeichnet wenn gehalten). // deklariere Variablen zum Speichern

Created by Michael Kirsch &amp; Beat Rossmy... Sto

public ColorCircle (int x, int y, char c) { // Aufruf des Konstruktors der Elternklasse.. AUFGABE 2