diff options
| author | Stefan Suhren <suhren.stefan@fh-swf.de> | 2015-04-14 17:00:22 +0200 |
|---|---|---|
| committer | Stefan Suhren <suhren.stefan@fh-swf.de> | 2015-04-14 17:00:22 +0200 |
| commit | 31b7641ec7724f7eb2b5833c71705d176cb1bfdf (patch) | |
| tree | ead1f0d4a872e6053358049caa1901b34b8923ce | |
| parent | dbfb59b0dd320bfd4f284cd6c3896892529e42f7 (diff) | |
| download | Java2-31b7641ec7724f7eb2b5833c71705d176cb1bfdf.tar.gz Java2-31b7641ec7724f7eb2b5833c71705d176cb1bfdf.zip | |
Includes validator framework and completes Task 3
| -rw-r--r-- | src/de/fhswf/fbin/java2fx/validation/StatusEvent.java | 24 | ||||
| -rw-r--r-- | src/de/fhswf/fbin/java2fx/validation/StatusListener.java | 6 | ||||
| -rw-r--r-- | src/de/fhswf/fbin/java2fx/validation/ValidationAdapter.java | 64 | ||||
| -rw-r--r-- | src/de/fhswf/fbin/java2fx/validation/Validator.java | 16 | ||||
| -rw-r--r-- | src/de/fhswf/in/inf/java2/aufgabe03/EmailTextField.java | 25 | ||||
| -rw-r--r-- | src/de/fhswf/in/inf/java2/aufgabe03/JavaFxMain.java | 47 | ||||
| -rw-r--r-- | src/de/fhswf/in/inf/java2/aufgabe03/RegExTextField.java | 89 | ||||
| -rw-r--r-- | src/de/fhswf/in/inf/java2/aufgabe03/RegExValidator.java | 45 | ||||
| -rw-r--r-- | src/img/error.png | bin | 0 -> 330 bytes |
9 files changed, 316 insertions, 0 deletions
diff --git a/src/de/fhswf/fbin/java2fx/validation/StatusEvent.java b/src/de/fhswf/fbin/java2fx/validation/StatusEvent.java new file mode 100644 index 0000000..3a6ce24 --- /dev/null +++ b/src/de/fhswf/fbin/java2fx/validation/StatusEvent.java @@ -0,0 +1,24 @@ +package de.fhswf.fbin.java2fx.validation; + +public class StatusEvent<T> +{ + private boolean status; + private T value; + + public StatusEvent(T value, boolean status) + { + super(); + this.status = status; + this.value = value; + } + + public boolean isStatus() + { + return status; + } + + public T getValue() + { + return value; + } +} diff --git a/src/de/fhswf/fbin/java2fx/validation/StatusListener.java b/src/de/fhswf/fbin/java2fx/validation/StatusListener.java new file mode 100644 index 0000000..26b341d --- /dev/null +++ b/src/de/fhswf/fbin/java2fx/validation/StatusListener.java @@ -0,0 +1,6 @@ +package de.fhswf.fbin.java2fx.validation; + +public interface StatusListener<T> +{ + public void stateChanged(StatusEvent<T> e); +} diff --git a/src/de/fhswf/fbin/java2fx/validation/ValidationAdapter.java b/src/de/fhswf/fbin/java2fx/validation/ValidationAdapter.java new file mode 100644 index 0000000..6b6afea --- /dev/null +++ b/src/de/fhswf/fbin/java2fx/validation/ValidationAdapter.java @@ -0,0 +1,64 @@ +package de.fhswf.fbin.java2fx.validation; + +import java.util.ArrayList; +import java.util.List; + +import javafx.beans.value.ObservableValue; + +public abstract class ValidationAdapter<T> implements Validator<T> +{ + private List<StatusListener<T>> listeners; + + private boolean wasValid = true; + + // Partial implementation of interface Validator + public boolean validate(T value) + { + boolean isValidNow = isValid(value); + if (isValidNow != wasValid) + { // state changed + fireChangedEvent(value, isValidNow); + wasValid = isValidNow; + } + return (isValidNow); + } + + // Implementation of interface ChangeListener<T> + @Override + public void changed(ObservableValue<? extends T> observable, T oldValue, + T newValue) + { + validate(newValue); + } + + // Support for StatusListeners + public void addStatusListener(StatusListener<T> l) + { + if (listeners == null) + { + listeners = new ArrayList<>(); + } + + listeners.add(l); + } + + public void removeStatusListener(StatusListener<T> l) + { + if (listeners != null) + { + listeners.remove(l); + } + } + + public void fireChangedEvent(T value, boolean status) + { + if (listeners != null) + { + StatusEvent<T> event = new StatusEvent<T>(value, status); + for (StatusListener<T> sl : listeners) + { + sl.stateChanged(event); + } + } + } +} diff --git a/src/de/fhswf/fbin/java2fx/validation/Validator.java b/src/de/fhswf/fbin/java2fx/validation/Validator.java new file mode 100644 index 0000000..ee23298 --- /dev/null +++ b/src/de/fhswf/fbin/java2fx/validation/Validator.java @@ -0,0 +1,16 @@ +package de.fhswf.fbin.java2fx.validation; + +import javafx.beans.value.ChangeListener; + +public interface Validator<T> extends ChangeListener<T> +{ + + public boolean isValid(T value); + + public boolean validate(T value); + + // support StatusListeners + public void addStatusListener(StatusListener<T> l); + + public void removeStatusListener(StatusListener<T> l); +} diff --git a/src/de/fhswf/in/inf/java2/aufgabe03/EmailTextField.java b/src/de/fhswf/in/inf/java2/aufgabe03/EmailTextField.java new file mode 100644 index 0000000..e68860c --- /dev/null +++ b/src/de/fhswf/in/inf/java2/aufgabe03/EmailTextField.java @@ -0,0 +1,25 @@ +/** + * File for the EmailTextField class. + */ + +package de.fhswf.in.inf.java2.aufgabe03; + +/** + * A text field that validates email addresses and gives optical feedback. + * + * @author $Author: $ + * @version $Revision: $, $Date: $ UTC + */ +public class EmailTextField extends RegExTextField +{ + + /** + * Creates a RegExTextField that only accepts email addresses. + * + */ + public EmailTextField() + { + super("\\b[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}\\b", "E-Mail"); + } + +} diff --git a/src/de/fhswf/in/inf/java2/aufgabe03/JavaFxMain.java b/src/de/fhswf/in/inf/java2/aufgabe03/JavaFxMain.java new file mode 100644 index 0000000..b822b5f --- /dev/null +++ b/src/de/fhswf/in/inf/java2/aufgabe03/JavaFxMain.java @@ -0,0 +1,47 @@ +/* + * + */ + +package de.fhswf.in.inf.java2.aufgabe03; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +/** + * The loader for a RegExTextField that validates e-mail addresses. + * + * @author $Author: $ + * @version $Revision: $, $Date: $ UTC + */ +public class JavaFxMain extends Application +{ + + /* + * (non-Javadoc) + * + * @see javafx.application.Application#start(javafx.stage.Stage) + */ + @Override + public void start(Stage primaryStage) + { + RegExTextField regText = new RegExTextField("[a-z]"); + EmailTextField emaText = new EmailTextField(); + VBox vbox = new VBox(regText, emaText); + Scene scene = new Scene(vbox); + primaryStage.setScene(scene); + primaryStage.show(); + } + + /** + * Loads the main window of this application. + * + * @param args + * Command line arguments + */ + public static void main(String[] args) + { + launch(args); + } +} diff --git a/src/de/fhswf/in/inf/java2/aufgabe03/RegExTextField.java b/src/de/fhswf/in/inf/java2/aufgabe03/RegExTextField.java new file mode 100644 index 0000000..cc68ff2 --- /dev/null +++ b/src/de/fhswf/in/inf/java2/aufgabe03/RegExTextField.java @@ -0,0 +1,89 @@ +/** + * File containing the RegExTextField class. + */ + +package de.fhswf.in.inf.java2.aufgabe03; + +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; + +/** + * A class that checks an input against a regex and gives optical feedback. + * + * @author $Author: $ + * @version $Revision: $, $Date: $ UTC + */ +public class RegExTextField extends HBox +{ + + private Label label; + + private TextField textField; + + private RegExValidator rv; + + /** + * Creates an element that checks regexes. + * + * @param regEx + * The regex to check the text field against. + */ + public RegExTextField(String regEx) + { + this(regEx, "regEx"); + } + + /** + * Creates an element that checks regexes. + * + * @param regEx + * The regex to check the text field against. + * @param labelText + * An optional label that is shown before the text field. + */ + public RegExTextField(String regEx, String labelText) + { + if (regEx == null) + { + throw new IllegalArgumentException("RegEx can't be null."); + } + if (regEx.isEmpty()) + { + throw new IllegalArgumentException("RegEx can't be empty."); + } + if (labelText == null) + { + throw new IllegalArgumentException("labelText can't be null."); + } + if (labelText.isEmpty()) + { + throw new IllegalArgumentException("labelText can't be empty."); + } + + label = new Label(labelText); + textField = new TextField(); + + label.setContentDisplay(ContentDisplay.RIGHT); + + this.getChildren().addAll(label, textField); + + rv = new RegExValidator(regEx); + rv.addStatusListener(e -> { + if (!e.isStatus()) + { + label.setGraphic(new ImageView(new Image("img/error.png"))); + } + else + { + label.setGraphic(null); + } + }); + + textField.textProperty().addListener(rv); + } + +} diff --git a/src/de/fhswf/in/inf/java2/aufgabe03/RegExValidator.java b/src/de/fhswf/in/inf/java2/aufgabe03/RegExValidator.java new file mode 100644 index 0000000..e17b5ca --- /dev/null +++ b/src/de/fhswf/in/inf/java2/aufgabe03/RegExValidator.java @@ -0,0 +1,45 @@ +/** + * Java file containing the RegExValidator class. + */ + +package de.fhswf.in.inf.java2.aufgabe03; + +import java.util.regex.Pattern; + +import de.fhswf.fbin.java2fx.validation.ValidationAdapter; + +/** + * A class that checks if a given string matches a predefined regex. + * + * @author $Author: $ + * @version $Revision: $, $Date: $ UTC + */ +public class RegExValidator extends ValidationAdapter<String> +{ + + private Pattern validRegEx; + + /** + * A validator that checks a specific regex. + * + * @param validRegEx + * The regex to validate against + */ + public RegExValidator(String validRegEx) + { + this.validRegEx = Pattern.compile(validRegEx); + } + + /* + * (non-Javadoc) + * + * @see + * de.fhswf.fbin.java2fx.validation.Validator#isValid(java.lang.Object) + */ + @Override + public boolean isValid(String value) + { + return validRegEx.matcher(value).matches(); + } + +} diff --git a/src/img/error.png b/src/img/error.png Binary files differnew file mode 100644 index 0000000..a0179e8 --- /dev/null +++ b/src/img/error.png |
