GUI: Ich brauche ein Textfeld mit "Sperre"

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hey, doofer Titel, aber ich hab keine Ahnung wie man sowas nennt...
Ich hatte in die Richtung schon mal etwas gefragt gehabt, aber irgendwie ist nix bei rausgekommen, also versuche ich es noch einmal.

Aus diversen Gründen brauche ich ein Textfeld, dass jegliche User-Interaktion mit der GUI verhindert, solange der Inhalt nicht valide ist. Es geht darum dass der User Datensätze editieren kann, aber ich will sicherstellen dass er keinen Mist abspeichert. Wenn er jetzt also in ein Textfeld hineinklickt, soll die komplette GUI gesperrt werden, solange bis er zB "Enter" drückt. Und nur wenn der Inhalt dann eine bestimmte Validitäts-Prüfung bestanden hat, soll das abgespeichert und die GUI wieder freigegeben werden. Solange das aber nicht der Fall ist, wird der User gezwungen etwas anderes einzugeben.
(Keine Angst, ich hab nicht vor sowas in ein Quiz oder etwas ähnliches einzubauen, was dann zu einem nicht-beendbaren Programm führt ;))

...am besten mit diesem typischen "Bing"-Ton, den Windows von sich gibt wenn eine bestimmte Eingabe oder Aktion nicht passt.
So nach dem Motto: "Wenn du diesen Raum betrittst, bleibst du solange da drin bis ich sage du darfst raus".

Ich kann zwar natürlich sicherstellen, dass der Datenbestand intern okay ist, in dem ich etwas einfach nicht abspeichere. Aber das ist nicht wirklich user friendly, denn es kann dann dazu führen dass der User denkt er hat etwas gespeichert, aber in Wahrheit ist das gar nicht passiert. Das Problem ist halt das man jederzeit einfach ein Tab wechseln kann oder auf das Menü des Frames klicken usw.. Dann verliert das Textfeld den Fokus, es wurde nix gespeichert aber der Text im Textfeld wird so angezeigt wie der User ihn eingegeben hat. Das ist halt doof.

Also.. wie kann ich mir sowas am besten machen?

Ich wäre echt sehr dankbar für Hilfe, weil ich sitz an dem Mist schon seit mehreren Wochen -.-
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Ganz banal und möglicherweise auch nicht unbedingt der Stein der Weisen, aber mit einem [c]FocusListener[/c] an das Textfeld gehängt könnte das was werden. Bei [c]focusLost()[/c] Eingaben überprüfen und diesen ggf. mit [c]requestFocus()[/c] wiederholen.
 

hdi

Top Contributor
Ne das hab ich alles schon durch, diese ganzen requests usw. sind viel zu "nett". Es hindert niemanden daran einfach das komplette Tab, in dem das Textfeld drinsteckt, zu wechseln oder schließen.
 
S

Spacerat

Gast
Sag' ich doch... nicht der Stein der Weisen...
Ein Tab? Dabei kann es sich doch höchstens um einen Container handeln, der sich irgendwo in einem Window befindet. Also: Um die Idee noch nicht ganz at Acta zu legen, [c]focusGained()[/c] könnte dafür sorgen, das dieses Window nicht mehr geschlossen werden kann, indem es dort z.B. eine Variable setzt, die das Verhalten des [c]WindowListeners[/c] entsprechend korrumpiert (boah wat' 'ne Wortwahl... hoffe du verstehst was ich meine).
 

hdi

Top Contributor
Naja aber ich will ja mehr als nur verhindern, dass das Window geschlossen wird: Sämtliche Komponenten darin sollen nicht mehr reagieren. Ich befürchte es geht nur mit nem modalen Dialog (undecorated, der aussieht wie das Textfeld, den Inhalt enthält, und genau dort erscheint, wo das Textfeld ist Oo). Aber das is....nich so gut ^^
 
S

Spacerat

Gast
Versteh' ich nicht... Wieviele Komponenten innerhalb eines Fensters (oder überhaupt) können denn gleichzeitig den Fokus haben? Doch nur eine, oder nicht? Und wenn sich genau diese Eine den Fokus immer wiederholt, solange ihr Inhalt nicht stimmt kann doch gar nichts passieren, denn Eingaben können doch nur beim Focus-Owner gemacht werden. Für mich wird's erst mal Zeit für schief gehende Experimente...:D
 

hdi

Top Contributor
Oh ja das ist ja auch noch ein Problem :autsch:: Ich hab mehrere solcher Textfelder.. Das heisst wenn ich zB per Tab-Druck aus einem rausspringe, spring ich evtl ins nächste. Und dann geht das Battle um den Fokus los :D

... am besten aber ich zeig euch mal meine Applikation, dann seht ihr den Zusammenhang, und vllt fällt euch ja eine ganz andere Herangehensweise ein.

Hier ist meine App:
RapidShare: 1-CLICK Web hosting - Easy Filehosting
Alternativ-Link (falls es bei RS schon 10x runtergeladen wurde):
http://www.filedropper.com/lmdb16

Erstellt einfach mal nen Film dann könnt ihr ihn editieren.
Die Filterfunktion funktioniert hier noch nicht, nur das Editieren im "Film-Details" Tab. Aber ihr seht halt wie das aussieht und dann versteht ihr vllt mein Problem.
Kritische Momente wären zB das Bearbeiten des Titels, der nicht leer sein darf. Oder das Jahr, das eine gültige Zahl haben muss.
Im Moment mach ich einfach ein Reset wenn der Wert nicht passt, und lass das Feld kurz aufleuchten. Aber erstens behebt das nicht das Problem dass ich mit dem Filtern bekommen würde, und zweitens ist auch das nicht so cool weil man jederzeit nen anderen Film anklicken kann und z.T. wird das dann nicht gespeichert.

...bitte einfach mal starten und überlegen wie ihr das machen würdet, sodass es DAU-kompatibel ist, und natürlich möglichst einfach (sowohl für den User als auch für die Implementierung)

Ich freu mich über jeden Tipp! Danke!

PS: Das Programm legt beim ersten Start ein neues File in dem Ordner an, aus dem es gestartet wird. Das könnt ihr nach dem Rumspielen auch gleich löschen. (ist die "Datenbank" die eure Filme enthält)

PPS: bitte nicht auf andere Dinge eingehen, ich weiß dass es auch sonst noch einiges zu Verbessern gibt, ich arbeite auch schon an einer 2ten Version, aber da bin ich noch nicht so weit dass ich euch jetzt die Problematik veranschaulichen kann.
 
S

Spacerat

Gast
Da... Bitte... Mach was draus...
Java:
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.TextField;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public final class CriticalTextFields
{
	public static void main(String[] args)
	{
		final Frame f = new Frame("CriticalTextFields");
		f.addWindowListener(new WindowAdapter()
		{
			@Override
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
		f.setLayout(new GridLayout(5, 1, 5, 5));
		f.setBackground(Color.GRAY);
		for(int n = 0; n < 5; n++) {
			f.add(new CriticalTextField());
		}
		f.pack();
		f.setVisible(true);
	}
}

class CriticalTextField
extends TextField
{
	private static final long serialVersionUID = 1L;
	private static final FocusLock focus = new FocusLock();

	{
		addFocusListener(new FocusListener()
		{
			private final CriticalTextField tf = CriticalTextField.this;

			public void focusLost(FocusEvent evt)
			{
				synchronized(tf) {
					if(check()) {
						try {
							synchronized(focus) {
								focus.unlock(tf);
							}
						} catch(UnlockException exc) {
						}
						return;
					}
					try {
						synchronized(focus) {
							focus.lock(tf);
						}
						tf.requestFocus();
					} catch(LockException exc) {
					}
				}
			}
			
			public void focusGained(FocusEvent evt)
			{
			}
		});
	}

	private boolean check()
	{
		return "test".equals(getText());
	}
}

class FocusLock
{
	private CriticalTextField field;

	public void lock(CriticalTextField obj)
	throws LockException
	{
		if(obj != null) {
			if(field != null && field != obj) {
				throw new LockException();
			}
			field = obj;
		}
	}

	public void unlock(CriticalTextField obj)
	throws UnlockException
	{
		if(obj != null) {
			if(field != null && field != obj) {
				throw new UnlockException();
			}
			field = null;
		}
	}
}

class LockException
extends Exception
{
	private static final long serialVersionUID = 1L;
}

class UnlockException
extends Exception
{
	private static final long serialVersionUID = 1L;
}
Zu deiner gehosteten Anwendung: Iwie habe ich da nicht eine Zeile Quelltext gefunden. Aber was soll's. Obiges Beispiel locked zumindest schon mal die einzelnen Textfelder. Mir ist auffgefallen, das die Enter-Taste die Textfelder auch dann nicht weiterschaltet, wenn die Eingabe korrekt ist. Ist das normal?
 
Zuletzt bearbeitet von einem Moderator:

KrokoDiehl

Top Contributor
Ich würde vom FocusListener weggehen und mich mit InputVerifier beschäftigen ;) Hier kann man einen eigenen schreiben und die Methoden
Code:
verifiy()
und
Code:
shouldYieldFocus()
entsprechend überschreiben. Dann geht der Cursor auch erst aus dem Feld, wenn man dort true zurückgibt, ohne dass man den Fokus hin und her setzen muss.

Das Problem bei den Verifiern ist, dass er ggfs nicht immer aufgerufen wird, zB wenn man in ein Menü klickt. Das kann man aber über die JComponent-Methode
Code:
setVerifyInputWhenFocusTarget()
steuern.
So wie ich's verstehe bräuchte also jede andere Komponente (die den Fokus haben kann) diesen Wert auf true :)
 
S

Spacerat

Gast
Das Problem bei den Verifiern ist, dass er ggfs...
Ist das die feine englische Verkaufsstrategie? Jemandem etwas "Verkaufen" wollen, womit es möglicherweise Probleme gibt? :lol:
Aber hey... Immerhin 'ne Idee, die besser aussehen könnte als meine, zumal ich diese Möglichkeit noch gar nicht gesehen habe, [c]InputVerifier[/c] also nicht kannte. Iwie werd' ich das Gefühl nicht los, dass die zu verifizierende Komponente im Gegensatz zu meiner Lösung über die anderen involvierten Komponenten Bescheid wissen muss.
So wie ich's verstehe bräuchte also jede andere Komponente (die den Fokus haben kann) diesen Wert auf true
Rein intuitiv steuert man den Fokus halt über Listener. Ob das mit der Synchronisierung der Listener Methode allerdings sein muss... kA. Ich denke mal nicht, zumal es nur einen EDT gibt. Beim [c]FocusLock[/c] aber bin ich sicher... die gehört so.
 
J

JohannisderKaeufer

Gast
Einen JDialog kann man doch auf modal setzen und somit die restliche GUI sperren.

Das Klingt für mich zumindest mal nach einem Lösungsansatz, bzw. wenn man die Sourcen dazu anschaut könnte man eine Lösung daraus ableiten wie man ein Textfield modal setzt.

Eine weitere Möglichkeit könnte sein direkt mit einem Dialog zu arbeiten, bzw. einen Dialog derart umzubauen, damit er das gewünschte tut.
 

KrokoDiehl

Top Contributor
Spacerat hat gesagt.:
Ist das die feine englische Verkaufsstrategie? Jemandem etwas "Verkaufen" wollen, womit es möglicherweise Probleme gibt?
Klar, hdi soll ja beschäftigt bleiben ;)

Aber im Ernst. Wir hatten das im aktuellen Projekt auch zuerst via FocusListener. Das tat größtenteils auch, aber Problem war in manchen Fällen, dass
Code:
focusGained()
und
Code:
focusLost()
erst aufgerufen werden, wenn der Fokus schon da, bzw. weg ist und ein
Code:
requestFocus()
führte dann manchmal zu Endlosschleifen. Ok, mit nem Fokus-Lock haben wir es nie probiert.
Die InputVerifier werden ausgeführt, bevor eine Komponente den Fokus verliert (hat mich auch einiges an googlen gekostet), was wesentlich entspannter abläuft, allerdings auch restriktiver für den Benutzer.

Dann kam bei uns aber das Problem, dass man in nem Feld war, und nicht mehr ins Menü klicken durfte, weil beim Klick aufs Menü der Fokus kurz herausspringt, was laut InputVerifier aber verboten war. Aber dafür gibts ja die o.g. Methode ;) Ich weiß aber leider nicht, was die Standardeinstellung für diese Eigenschaft bei den jeweiligen Komponenten ist.
 
S

Spacerat

Gast
Naja... Bei meinem Beispiel kann man der [c]check()[/c]-Methode immerhin noch die Quelle des Events die den Fokus haben wollte mit übergeben und so explizit filtern, ob man dieser den Fokus überlässt. Ich wüsste blos nicht, wie sich das Textfeld den Fokus dann zurückholen sollte, wenn die Quelle diesen wieder abgibt. Aber da fällt mir sicher auch noch was zu ein.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Robert Zenz Ich brauche bitte mal kurz einen Sanity/Reality-Check betreffend Tests. Allgemeine Java-Themen 9
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
MoxxiManagarm Ich brauche einen smarten Ansatz Allgemeine Java-Themen 23
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
J Java "Bank Programm" Brauche eure Hilfe Allgemeine Java-Themen 3
Thallius Unfassbarer Fehler. Brauche Ideen zum Debuggen Allgemeine Java-Themen 9
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
H NetBeans geotools 15 oder 16 - welche Abhängingkeiten gibt es? Welche Jars brauche ich? Allgemeine Java-Themen 4
S Best Practice Brauche eine Idee für eine Java Projekt! Allgemeine Java-Themen 11
M Brauche Hilfe bei Quellcodeverständnis Allgemeine Java-Themen 4
D Brauche Hilfe bei Rechnung (Exponentiation) Allgemeine Java-Themen 12
F Brauche Hilfe bei Java Allgemeine Java-Themen 6
C Brauche Hilfe mit Modulo Strategie Allgemeine Java-Themen 2
S Brauche Hilfe: Prüfungsaufgabe Java Allgemeine Java-Themen 8
Fu3L Input/Output Brauche Rat bei effizienter Speicherung großer Datenmengen Allgemeine Java-Themen 21
S brauche Hilfe für ssh connection in java Allgemeine Java-Themen 6
T Ich brauche gute Quellen Allgemeine Java-Themen 13
S Brauche Hilfe bei Planung für JAVA-Programm Allgemeine Java-Themen 3
Developer_X Brauche Hilfe bei meinem kleinen hilfsprogramm Allgemeine Java-Themen 4
Developer_X Bound Animation - Brauche Hilfe Allgemeine Java-Themen 3
E brauche schnell Ausführbare Datei Allgemeine Java-Themen 4
D Brauche mal Hilfe bin noch nicht so fit Allgemeine Java-Themen 3
M brauche grösseren Datentyp Allgemeine Java-Themen 5
L Brauche Hilfe bei Memory Programmierung Allgemeine Java-Themen 2
N Brauche dringend Hilfe! Allgemeine Java-Themen 7
S brauche dringend help bei einem projekt (Römisch-dezimal) Allgemeine Java-Themen 3
M Brauche einen Tipp, bei einer Aufgabe ! Allgemeine Java-Themen 3
M brauche hilfe mit iReport Allgemeine Java-Themen 4
P Java Acces Datenbank Problem ! (Brauche eine Abfrage) Allgemeine Java-Themen 5
E Ich brauche euren Code Allgemeine Java-Themen 12
V Brauche dringend Hilfe. Object-handling Allgemeine Java-Themen 4
S Ich Brauche Bei Einen Bot Hile :( Allgemeine Java-Themen 2
V Brauche Beratung in Sachen Java+Datenbank+Web Allgemeine Java-Themen 8
M Schätzfrage: Wieviel Prozessorpower brauche ich? Allgemeine Java-Themen 27
R Hilfe - brauche ein Applet zu Demozwecken Allgemeine Java-Themen 10
J Brauche Hilfe zum ToolKit Allgemeine Java-Themen 15
K Brauche Hilfe bei Simulation einer Flugkurve . Allgemeine Java-Themen 14
T Brauche Hilfe! Allgemeine Java-Themen 10
T Lizenzfrage - brauche Infos Allgemeine Java-Themen 34
T Autostart Programm - brauche Tipps Allgemeine Java-Themen 5
G Brauche hilfe bei JMF: Wie eigene Streaming Data Source! Allgemeine Java-Themen 4
N int[] referenzen in ein Array packen, brauche Hilfe. Allgemeine Java-Themen 7
A brauche schnelle antwort wg. schleife! Allgemeine Java-Themen 3
T Brauche Hilfe bei ClassLoader Allgemeine Java-Themen 2
K Brauche euren Lösungsweg zu einem File/IO-Beispiel Allgemeine Java-Themen 23
G Brauche Hilfe bei Erstellung eines Musters! Allgemeine Java-Themen 3
G packageproblem? brauche rat! Allgemeine Java-Themen 2
S brauche Orientierungshilfe in Java Allgemeine Java-Themen 5
Z Was brauche ich für Servlets? Allgemeine Java-Themen 17
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11
kodela Textfeld nicht rechteckig Allgemeine Java-Themen 10
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
S Eclipse TestNG: Textfeld einbinden? Allgemeine Java-Themen 1
T itext: text in ein textfeld hinzufügen Allgemeine Java-Themen 2
J Hilfe bei Datumsberechnung aus Textfeld Allgemeine Java-Themen 10
L nach form submit textfeld an java übergeben? Allgemeine Java-Themen 2
F In ein Textfeld im Browser schreiben? Allgemeine Java-Themen 4
O Input/Output Textfeld: nur Integer annehmen Allgemeine Java-Themen 9
M Datum/Uhrzeit in ein Textfeld schreiben Allgemeine Java-Themen 28
S Textfeld Parser sinnvoll? Allgemeine Java-Themen 3
S Listener Implentierung bei Eingabe in Textfeld Allgemeine Java-Themen 2
S TextFeld Problem! Allgemeine Java-Themen 4
G Kommazahlen mit Komma in Textfeld darstellen Allgemeine Java-Themen 11
A Textfeld prüfen, ob ein Punkt eingegeben wurde Allgemeine Java-Themen 8
A Problem mit Auslese aus einem Textfeld Allgemeine Java-Themen 3
P Probleme mit Aktualisierung Textfeld im Applet Allgemeine Java-Themen 4
G Textfeld alle 0.5 Sekunden aktualisieren Allgemeine Java-Themen 2
H Datei auslesen und in einem Textfeld ausgeben. Allgemeine Java-Themen 8
M Ein Thread soll ein Textfeld (SWT) ändern Allgemeine Java-Themen 4
A Textfeld soll verschiedene Datumseingaben akzeptieren Allgemeine Java-Themen 5
S Exklusive Sperre auf Dateien: FileChannel, FileLock Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben