Formatter für Formularblatt - reguläre Ausdrücke

Chriss_07

Aktives Mitglied
Ich habe mit SWT ein Formularblatt erstellt, in dem Textfelder mittels regulären Ausdrücken definiert werden soll. Dazu habe ich mir bereits ein snippet von SWT angesehen, weiß aber noch nicht so ganz wie ich das umsetzten kann.
Ein Textfeld soll für die Telefonnummer sein und der Text folgenden Kriterien entsprechen: +49.####-######
Ein weiteres ist für eine Referenznummer: UUU### also drei Buchstaben (Uppercase) und drei Zahlen.
Java:
text.setText(template); // das Template ist die Vorlage (UUU###)	
	text.addListener(SWT.Verify, new Listener() {
		//create the pattern for verification
		Pattern pattern = Pattern.compile(REGEX);   // REGEX gibt die Syntax vor ([+49.]\\d{4}[-]\\d{4])
...
...
		public void handleEvent(Event e) {
.....
.....
Das finde ich super, denn so kann ich für jedes textfeld ein REGEX1, REGEX2, Template1, Template2 erstellen und muss nur noch das jeweilige Event am textfeld auslösen. Nur weiß ich nicht wie???:L
Hat da jemand ne helfende Hand??
 

Chriss_07

Aktives Mitglied
Damit begrenze ich aber nicht die Eingabe. Ich möchte ja an bestimmten Stellen nur Zahlen eingeben können und das auch nur in bestimmter Anzahl. Bei der Referenznummer möchte ich drei Buchstaben und dann Zahlen eingeben können. Da helfen mir nur reguläre Ausdrücke weiter aber ich weiß nicht wie ich das anstellen soll. Toll finde ich halt die Verifizeirung über reguläre Ausdrücke. Da bräuchte ich Hilfe, um das auf meine Masken anzuwenden.
 

XHelp

Top Contributor
Sicher kannst du es.
Du kannst mit:
Java:
String s = e.text;
if (!s.matches(regex)) {
  e.doit = false;
}
versuchen (
Code:
e
ist eben dein Event)
 

Chriss_07

Aktives Mitglied
Ja genau, ich habe das an dem Kurzen kompilierbaren Beispiel ausprobiert, indem ich meine Telefonvorlage eingebunden habe aber da kann ich nichts eingeben und beim löschen wird mir die +49 mitgelöscht:
Java:
import java.util.regex.*;

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Snippet196 {

	private static final String REGEX = "[+49.]\\d{4}[-]\\d{6}";  //$NON-NLS-1$
	private static final String template = "+49.####-######"; //$NON-NLS-1$
	private static final String defaultText = "+49.0000-000000"; //$NON-NLS-1$
	
	
public static void main(String[] args) {
	
	Display display = new Display();
	Shell shell = new Shell(display);
	shell.setLayout(new GridLayout());
	final Text text = new Text(shell, SWT.BORDER);
	Font font = new Font(display, "Courier New", 10, SWT.NONE); //$NON-NLS-1$
	text.setFont(font);
	text.setText(template);	
	text.addListener(SWT.Verify, new Listener() {
		//create the pattern for verification
		Pattern pattern = Pattern.compile(REGEX);	
		//ignore event when caused by inserting text inside event handler
		boolean ignore;
		public void handleEvent(Event e) {
			if (ignore) return;
			e.doit = false;
			if (e.start > 14|| e.end > 15) return;
			StringBuffer buffer = new StringBuffer(e.text);
			
			//handle backspace
			if (e.character == '\b') {
				for (int i = e.start; i < e.end; i++) {
					// skip over separators
					switch (i) {
						case 0: 
							if (e.start + 1 == e.end) {
								return;
							} else {
								buffer.append('.');
							}
							break;
						case 4:
							if (e.start + 1 == e.end) {
								buffer.append(new char [] {'#','-'});
								e.start--;
							} else {
								buffer.append('-');
							}
							break;
						default: buffer.append('#');
				}
				text.setSelection(e.start, e.start + buffer.length());
				ignore = true;
				text.insert(buffer.toString());
				ignore = false;
				// move cursor backwards over separators
				if (e.start == 4 || e.start == 9) e.start--;
				text.setSelection(e.start, e.start);
				return;
			}
			
			StringBuffer newText = new StringBuffer(defaultText);
			char[] chars = e.text.toCharArray();
			int index = e.start - 1;
			for (int i = 0; i < e.text.length(); i++) {
				index++;
				switch (index) {
					case 0:
						if (chars[i] == '.') continue;
						index++;
						break;
					case 4:
						if (chars[i] == '-') continue;
						index++;
						break;
				}
				if (index >= newText.length()) return;
				newText.setCharAt(index, chars[i]);
			}
			// if text is selected, do not paste beyond range of selection
			if (e.start < e.end && index + 1 != e.end) return;
			Matcher matcher = pattern.matcher(newText);
			if (matcher.lookingAt()) {
				text.setSelection(e.start, index + 1);
				ignore = true;
				text.insert(newText.substring(e.start, index + 1));
				ignore = false;
			}			
		}
		}
	});
		
	shell.pack();
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch())
			display.sleep();
	}
	font.dispose();
	display.dispose();
}
}

Kannst du mir das vllt im Detail erklären, was ich da genau falsch mache?
Gruß Chriss
 

Chriss_07

Aktives Mitglied
Also wenn ich die +49 als ### mit übergebe, dann funktioniert das, allerdings will ich ja diese vorgeben und nicht zulassen diese zu editieren. Wie gibt man die +49 als festen Wert vor?
 

XHelp

Top Contributor
Naja, um solche Scherze bei der Eingabe zu machen, musst du natürlich aufpassen, z.B.:
du sollst 5 Zeichen eingeben.
Wenn ich anfange "123" zu tippen (und will schließend "45" dazumachen), dann ist es ja in dem Moment kein zugelassener String.
Mein Vorschlag wäre das ganze mit einem FocusListener zu machen, denn nach der Eingabe, musst du ja irgendwas machen, sprich Focus verlieren.
Du könntest ja sowas wie:
Java:
private class ValidateFocusListener implements FocusListener{
	private String pattern = "";
	private String defaultValue = "";
	public ValidateFocusListener(String defaultValue, String pattern) {
		this.defaultValue = defaultValue;
		this.pattern = pattern;
	}
	@Override
	public void focusGained(FocusEvent e) {}

	@Override
	public void focusLost(FocusEvent e) {
		if (e.getSource() instanceof JTextField) {
			JTextField field = (JTextField) e.getSource();
			if (!field.getText().matches(pattern)) {
				field.setText(defaultValue);
			}
		}
	}
}
machen
 
G

Gast2

Gast
Dann schreib das Bsp auch in SWT und nicht in Swing... In Swing würde ich nämlich für so ein Problem eher einen setInputVerifier benützen...

Und in SWT würde ich ein VerifyListener oder ein ModifyListener verwenden
SWT Snippets und da suchst du "verify input using a regular expression"...
oder eben die nebula widgets und dafür einen eigenen RegexFormatter ist wesentlich einfacher...
Aber für deine Zwecke müsste der MaskFormatter doch schon alles mitbringen...
 
Zuletzt bearbeitet von einem Moderator:

Chriss_07

Aktives Mitglied
JA das mit dem Nebula MaskFormatter hatte ich mir auch einfach vorgestellt aber Letters werden auch mit Digist interpretiert und das stört mich. ALso sind bei einem MaskFormattet String UUU### auch nur Zahlen möglich, hingegen wird ein Digist String korrekt dargestellt und lässt keine Letters zu.:bahnhof:
Scheint wohl ein Nebula Bug zu sein
 
G

Gast2

Gast
Mach ein Beispiel weiß nicht ob ich dich richtig verstanden habe...

Aber kannst ja mal ein bug melden ich denke U und L sollten keine Numbers zu lassen und A auch nicht...

Aber wie gesagt kannst dir ja auch einen eigenen Formatter schreiben muss mal daheim schauen ob ich ein Bsp. hab.

EDIT:
So ist es implementiert...
Java:
  case P_UPPERCASE :
176	          if ( Character.isLetterOrDigit(c) ) {
177	            editValue.setCharAt(i, Character.toUpperCase(c));
178	          } else {
179	            throw new IllegalArgumentException(INVALID_VALUE);
180	          }
181	          break;
182	        case P_LOWERCASE :
183	          if ( Character.isLetterOrDigit(c) ) {
184	            editValue.setCharAt(i, Character.toLowerCase(c));
185	          } else {
186	            throw new IllegalArgumentException(INVALID_VALUE);
187	          }
188	          break;
189	        case P_ALPHANUM :
190	          if ( Character.isLetterOrDigit(c) ) {
191	            editValue.setCharAt(i, c);
192	          } else {
193	            throw new IllegalArgumentException(INVALID_VALUE);
194	          }
195	          break;
196	        default :
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Hier nimmst halt den so lang ;) sollte doch deinen Vorstellung entsprechen wenn nicht kannst dir wie gesagt einen eigenen schmieden...
Java:
	static class  MyMaskFormatter extends MaskFormatter{
		  private static final char P_DIGIT = '#';
		  private static final char P_ALPHANUM = 'A';
		  private static final char P_UPPERCASE = 'U';
		  private static final char P_LOWERCASE = 'L';
		  private static final String INVALID_VALUE = "Wrong Value";
		  
		public MyMaskFormatter(String editPattern) {
			super(editPattern);
		}
		
		protected int insertText(String txt, int start) {
				    int i = start, j = 0;
				    char p, c, o;
				
				    while ( i < editPattern.length() && j < txt.length() ) {
				      p = editPattern.charAt(i);
				      c = txt.charAt(j);
				      o = editValue.charAt(i);
				      switch ( p ) {
				        case P_DIGIT :
				          if ( Character.isDigit(c) ) {
				            editValue.setCharAt(i, c);
				          } else {
				            throw new IllegalArgumentException(INVALID_VALUE);
				          }
				          break;
				        case P_UPPERCASE :
				          if ( Character.isLetter(c) ) {
				            editValue.setCharAt(i, Character.toUpperCase(c));
				          } else {
				            throw new IllegalArgumentException(INVALID_VALUE);
				          }
				          break;
				        case P_LOWERCASE :
				          if ( Character.isLetter(c) ) {
				            editValue.setCharAt(i, Character.toLowerCase(c));
				          } else {
				            throw new IllegalArgumentException(INVALID_VALUE);
				          }
				          break;
				        case P_ALPHANUM :
				          if ( Character.isLetter(c) ) {
				            editValue.setCharAt(i, c);
				          } else {
				            throw new IllegalArgumentException(INVALID_VALUE);
				          }
				          break;
				        default :   // Separator
				          if ( p != c ) {
				            if ( Character.isLetterOrDigit(c) ) {
				              i++;
				              continue;
				            } else {
				              throw new IllegalArgumentException(INVALID_VALUE);
				            }
				          }
				          o = '*';
				          break;
				      }
				      if ( o == SPACE && c != SPACE ) {
				        count++;
				      }
				      i++;
				      j++;
				    }
				    return i;
				  }
	}
 

Chriss_07

Aktives Mitglied
Danke, werde ich mir anschauen wenn ich zu HAus bin.
SO hatte ich den Nebula implementiert
Java:
							refnr.getControl().setEditable(true);
							MaskFormatter tpn = new MaskFormatter("UUU###");
							refnr.setFormatter(tpn);
							refnr.getControl().setTextLimit(8);

Wobei angemerkt, das ganze über ein Combo Press funktioniert, also in etwas so:

Java:
if (value.equals("Referenznummer")) {
							MaskFormatter pn = new MaskFormatter("UUU###");
							refnr.setFormatter(pn);
							refnr.getControl().setEditable(true);
							refnr.getControl().setTextLimit(12);
							if (textProcessNo.getControl().getText().equals("0"))
								textProcessNo.getControl().setText("");
						}
						if (value.equals("telnummer")) {
							telnr.getControl().setText("");
							NumberFormatter nf = new NumberFormatter("######");
							telnr.setFormatter(nf);
							telnr.getControl().setEditable(true);
							telnr.getControl().setTextLimit(6);
							if (telnr.getControl().getText().equals("0"))
								telnr.getControl().setText("");

Ich glaube so in etwa habe ich das versucht und da erzeugt der Nebula MaskFormatter falsche Eingabemöglichkeiten für "UPPERCASE".
 
G

Gast2

Gast
Was heißt flasche Eingabemöglichkeiten???

In nebula MaskFormatter lässt UPPERCASE und LOWERCASE zahlen siehst du doch im oben geposteten Code. Deshalb kannst du einen eigenen Formatter schreiben der dies nicht zu lässt siehe mein Bsp.
 

Chriss_07

Aktives Mitglied
ICh dachte

U = Any character (Character.isLetter). All lowercase letters are mapped to upper case
# = Any valid number, uses Character.isDigit.

Wenn U und L auch DIgit zulassen, nehm ich das mit dem Bug zurück, finde es aber trotzdem unpassend.
 
G

Gast2

Gast
ICh dachte

U = Any character (Character.isLetter). All lowercase letters are mapped to upper case
# = Any valid number, uses Character.isDigit.

Wenn U und L auch DIgit zulassen, nehm ich das mit dem Bug zurück, finde es aber trotzdem unpassend.

Steht ja nirgends^^... Also ich hab keine Beschreibung zu dem Formatter gefunden...
Aber wie gesagt mit dem Formatted Text widget kann man ja einen eigenen schreiben ohne großen Aufwand... Kannst ja sogar noch ein wildcard einführen wo beides erlaubt sein soll B oder so^^
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C SWT: Mehrere Formatter in einem Textfeld AWT, Swing, JavaFX & SWT 6
J Anzeige ID und Markierung für Knoten in Eclipse & Swing AWT, Swing, JavaFX & SWT 4
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
MJannek Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4
F Konstruktor für "Vier Gewinnt" AWT, Swing, JavaFX & SWT 10
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
R Swing Welche LayoutManager sind die richtigen für mich? AWT, Swing, JavaFX & SWT 11
L Event Handling Gui für Taschenrechner AWT, Swing, JavaFX & SWT 27
C Slider für Zeitauswahl AWT, Swing, JavaFX & SWT 3
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
OnDemand Gui Themes für FX AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P JavaFX Kalender mit Kacheln für Ereignisse AWT, Swing, JavaFX & SWT 4
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
J Swing Neuen Command für "show"? AWT, Swing, JavaFX & SWT 2
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
H Swing JFileChooser für nicht existierendes Unterverzeichnis AWT, Swing, JavaFX & SWT 3
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
D GUI-Bau für ein Auswertungs-Tool AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
RalleYTN Swing Menü für Texteditor (Rechtsklick) AWT, Swing, JavaFX & SWT 4
H Applet Flappy Bird für Noobs AWT, Swing, JavaFX & SWT 4
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4
A hilfe für flowlayout AWT, Swing, JavaFX & SWT 6
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
T Hintergrund für GUI AWT, Swing, JavaFX & SWT 1
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
C JavaFX Character Comparator für TableColumn AWT, Swing, JavaFX & SWT 0
KrokoDiehl JavaFX Gleiche Controller-Instanz für inludiertes FXML AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
S Pfad für Speichervorgang auswählen AWT, Swing, JavaFX & SWT 11
M If für viele TextFields AWT, Swing, JavaFX & SWT 7
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
R JMenuItems für Touchscreen auseinanderziehen AWT, Swing, JavaFX & SWT 3
L LookAndFeel Eigenes Design für die Applikation AWT, Swing, JavaFX & SWT 4
G Grafikformat für AWT-Applet? AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben