%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

%Kopfzeile
\ihead{Java}
\chead{}
\ohead{http://kohnlehome.de/java/regextextfield.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

%Bilder
\usepackage{graphicx}
\usepackage{graphics}

\pagestyle{scrheadings}

%\pdfpagewidth=\paperwidth
%\pdfpageheight=\paperheight

\begin{document}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
JavaFX 8 - RegexTextField
\end{center}

\section*{Funktionsweise}
Das \textbf{RegexTextField} überprüft bei Änderungen seines Inhalts über die GUI, ob der Text zu einem Regulären Ausdruck passt. Falls der Text nicht passt, wird der alte Inhalt wiederhergestellt.\\
Änderungen über Aufruf der setText()-Methode werden nicht überprüft.

\section*{beispiel.fxml}
Da der JavaFX Scene Builder die Klasse \textbf{RegexTextField} nicht kennt, müssen die Elemente im Texteditor bearbeitet werden.
\begin{verbatim}
<!-- Package einbinden, in dem sich die Klasse RegexTextField befindet --> 
<?import regextextfieldtester.*?>

<!-- Eingabefeld für 6-stellige Hexadezimalzahlen -->
<RegexTextField regex="[0-9a-fA-F]{0,6}" />

<!-- unbeschränktes Eingabefeld -->
<RegexTextField />
\end{verbatim}

\section*{RegexTextField.java}
\begin{verbatim}
package regextextfieldtester;
import javafx.scene.control.TextField;

public class RegexTextField extends TextField {
    //-------------------------------------------------------
    // Das Attribut "regex" speichert den Regulären Ausdruck,
    // mit dem der Inhalt des TextField überprüft wird
    //-------------------------------------------------------
    private String regex;

    public RegexTextField() {
        this.regex = ".*";
    }

    public String getRegex() {
        return regex;
    }

    public void setRegex(String regex) {
        this.regex = regex;
    }
    
    //----------------------------------------------------------------
    // Bei Änderung des Inhalts des TextField über GUI wird überprüft
    // ACHTUNG: Bei Aufruf der setText()-Methode wird NICHT überprüft!
    //----------------------------------------------------------------
    @Override
    public void replaceText(int start, int end, String text) {
        // alten Text und Cursorposition merken
        String alterText = this.getText();
        int alteCursorPosition = this.getCaretPosition();

        // neuen Text zuweisen
        super.replaceText(start, end, text);

        // überprüfen und evtl. zurücksetzen
        ueberpruefen(alterText, alteCursorPosition);
    }

    @Override
    public void replaceSelection(String replacement) {
        // alten Text und Cursorposition merken
        String alterText = this.getText();
        int alteCursorPosition = this.getCaretPosition();

        // neuen Text zuweisen
        super.replaceSelection(replacement);

        // überprüfen und evtl. zurücksetzen
        ueberpruefen(alterText, alteCursorPosition);
    }

    private void ueberpruefen(String alterText, int alteCursorPosition) {
        String neuerText = this.getText();
        if (!neuerText.matches(regex)) {
            // alten Text und alte Cursorpoition wiederherstellen
            this.setText(alterText);
            this.positionCaret(alteCursorPosition);
        }
    }
}
\end{verbatim}

\end{document}
