Konzept: Runnable Click

09. August 2018 von | Kategorie: Programmierung
Schlagwörter: //

Heute möchte ich euch ein Konzept vorstellen, welches ich im Rahmen des Projekt Hellweglauf entwickelte. Bei dem Konzept geht es um, die AusfĂŒhrung des eigentlichen Inhalt eines Klicks in einer anderen Methode.

Anmerkung: Dieses Konzept habe ich mir selbst ausgedacht, da ich einen solchen Ansatz nicht kenne. Sollte es jemanden geben, der das Prinzip des „Runnable Click“ bereits erfunden habe, so sei gesagt, dass ich unter keinen UmstĂ€nden abgeschrieben habe!

Die Idee hinter diesem Konzept ist die, dass es verschiedene Buttons gibt, welche unterschiedliche Aufgaben ausfĂŒhren sollen. Allerdings sind einige Dinge bei diesen Knöpfen gleich, denn die Vor- und Nachbereitungen unterscheiden sich nicht. So könnte z.B. vorher etwas zurĂŒckgesetzt und nachher ein Fenster geschlossen werden.

Dies wird erreicht, indem der Quelltext des Klicks in die run()-Methode das Runnable-Interface (Java) implementiert wird. Dieses Interface wird anschließend an eine Methode (z.B. runnableClick) ĂŒbergeben. Diese Methode erwartet als Parameter ein Runnable.

In der runnableClick-Methode werden die eben erwĂ€hnten Vor- und Nachbereitungen getroffen und an entsprechender Stelle des Runnable ausgefĂŒhrt. Sogar Exceptions können auf diese Weise abgefangen werden. Dies war im aktuellen Projekt (ProHell) der Fall. Dort gibt es in einer Maske drei Auswahlknöpfe. Jeder dieser Knöpfe erfĂŒllt einen anderen Zweck. Jedoch werfen alle Buttons unter UmstĂ€nden eine Exception. Diese sollen auf ein und die selbe Art behandelt werden. Dies kann erreicht werden, indem das Runnable innerhalb einey try-catch-Blocks ausgefĂŒhrt wird.

Anmerkend ist zu sagen, dass dieses Konzept nicht dringend notwendig ist. An manchen Stellen wĂŒrde es die Sache sogar verkomplizieren. Mit Methoden, die entsprechende Parameter akzeptieren, oder per Überladung von Methoden kann man das gleiche Ergebnis erzielen. Dennoch spart man sich einige Verzweigungen und der Quelltext, welcher zu dem Klick gehört, steht auch dort, wo das Event ausgelöst wird. Dies ist unter UmstĂ€nden ein Schönheitsaspekt.

Wer flachen (wenig verzweigten) Quelltext bevorzugt, sollte sich diesen Ansatz anschauen. Und vielleicht kann dieser das ein oder andere Mal eingesetzt werden. Es ist nicht immer sinnvoll, den Weg ĂŒber diesen Ansatz zu gehen, aber dies gilt fĂŒr jedes Konzept.

Da ich denke, dass diese ErklÀrung nicht wirklich aufklÀrend war, gebe ich an dieser Stelle ein Beispiel (JavaFX):

package runnableButtons;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class RunnableButtonsApp extends Application {

	private int counter = 0;
	private Pane leinwand;
	private Label counterLabel;
	
	private void runnableClick(Runnable runnable) {
		// Vorbereitungen treffen
		leinwand.getChildren().clear();
		
		// Den Inhalt der Methode ausfĂŒhren
		runnable.run();
		
		// Nachbereitungen treffen
		counterLabel.setText("" + ++counter);
	}
	
	@Override
	public void start(Stage st) throws Exception {
		
		Label infoLabel = new Label("Anzahl gezeichneter Objekte:");
		counterLabel = new Label("0");
		
		HBox hb1 = new HBox();
		hb1.setSpacing(10);
		hb1.setPadding(new Insets(10, 10, 10, 10));
		hb1.getChildren().addAll(infoLabel, counterLabel);
		
		leinwand = new Pane();
		leinwand.setPrefWidth(300);
		leinwand.setPrefHeight(300);
		
		Button kreisBtn = new Button("Kreis erstellen");
		kreisBtn.setOnAction(e -> {
			runnableClick(new Runnable() {
				public void run() {
					Circle c = new Circle();
					c.setFill(Color.RED);
					c.setRadius(50);
					c.setCenterX(150);
					c.setCenterY(150);
					leinwand.getChildren().add(c);
				}
			});
		});
		
		Button quadratBtn = new Button("Quadrat erstellen");
		quadratBtn.setOnAction(e -> {
			runnableClick(new Runnable() {
				public void run() {
					Rectangle r = new Rectangle();
					r.setFill(Color.ORANGE);
					r.setWidth(100);
					r.setHeight(100);
					r.setX(100);
					r.setY(100);
					leinwand.getChildren().add(r);
				}
			});
		});
		
		HBox hb2 = new HBox();
		hb2.setSpacing(10);
		hb2.setAlignment(Pos.CENTER);
		hb2.getChildren().addAll(kreisBtn, quadratBtn);
		
		VBox vb = new VBox();
		vb.getChildren().addAll(hb1, leinwand, hb2);
		
		st.setResizable(false);
		st.setScene(new Scene(vb));
		st.show();

	}

	public static void main(String[] args) {
		launch(args);
	}
}
Was denkst du ĂŒber diesen Post?
  • Gut (2)
  • Hilfreich (0)
  • Nicht gut (0)
  • Lustig 😀 (1)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

72 − 66 =