Konzept: Runnable Click

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)

von | Kategorie: Programmierung
Schlagwörter: //

Schreibe einen Kommentar

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

2 + 8 =