Viele Textfield mit Hilfe eines MousListener leeren - möglich?

k3ltis

Mitglied
Hallo,

ich habe ein paar Textfelder, in denen zu Beginn schon was drinsteht. Wenn man mit der Maus draufklickt soll der Text verschwinden. Das ist alles kein Problem.

Ich möchte aber gerne Aufwand und zeilen sparen und einen MouseListener schreiben, der an jedes Textfield übergeben wird und der dann das jeweilige Feld leert.

Zum besseren Verständis meines Problems ein Ausschnitt aus dem Code:

Java:
		eventname = new JTextField("eventname");
		eventname.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent arg0) {}
			@Override
			public void mousePressed(MouseEvent arg0) {}
			@Override
			public void mouseExited(MouseEvent arg0) {}
			@Override
			public void mouseEntered(MouseEvent arg0) {}	
			
			@Override
			public void mouseClicked(MouseEvent arg0) {
				eventname.setText("");
				
			}
		});
// Wie man sieht müsste ich zu jedem Textfield einen eigenen Listener implementieren.
		
datum = new JTextField("Datum [YYYY-MM-DD]");
uhrzeit = new JTextField("Uhrzeit [hh:mm]");
dauer = new JTextField("Dauer in Stunden");
budget = new JTextField("Budget");


Eine andere Möglichkeit wäre die Klasse MouseListener implementieren zu lassen...

Java:
public class Dialog_NeuesEvent extends DefaultJDialog implements MouseListener{



@Override
public void mouseClicked(MouseEvent e) {
if(eventname.getText().equals("bla")){
eventname.setText("");
}
//Vom Gefühl her ist dies der richtige Ansatz,
//dich ich weiß nicht, wie man aus dem MouseEvent e genau die 
//Komponente herausbekommt, auf die man geklickt hat.
}


Kann mir jemand helfen?
Gruß Keltis
 
Zuletzt bearbeitet:
Noch eine Möglichkeit wäre, die MouseListenerImplemenierung als "nested class" zu machen und das Textfeld datin als Objektvariable im Konstruktor zu übergeben.

Eclipse (und viele andere IDEs) kann das automatisch. <ctrl>+<shift>+<t> -> "convert to nested class"

bye
TT
 
Wow erstmal vielen Dank!

Also ich musste grad erstmal nachschlagen 😀 und so... aber ich denke ich hab verstanden was du meinstest:

Sieht jetzt so aus und klappt super:

Java:
		eventname = new JTextField("eventname");
		eventname.addMouseListener(new TextFieldListener(eventname));

//....


	static class TextFieldListener implements MouseListener{
		JTextField textFeld;
		
		public TextFieldListener(JTextField field){
			this.textFeld = field;
		}

		@Override
		public void mouseClicked(MouseEvent e) {
			textFeld.setText("");
			
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
	}


Das ist doch, was du meinstest oder?

Mercy!!!
 
Naja abgesehen davon, dass das Prinzip eines allgemeinen Listeners auf alles mögliche angewendet werden kann ist das, was ich hier konkret erreichen wollte Pflicht, wenn es um Benutzerfreundlichkeit geht.

Stell dir mal vor du bist Angestellter bei einem Eventservice und musst jeden Tag hunderte Daten in eine Software eintragen. Die Textfelder in den Eingabemasken jedesmal von neuem zu leeren ist mehr als nervig...

Sicherlich könnte man die Felder gleich leer lassen und eine entsprechende Beschreibung nebendran setzen... was bei mir aber nicht so ist.

Ich hoffe das konnte dich überzeugen 🙂
 
Stell dir mal vor du bist Angestellter bei einem Eventservice und musst jeden Tag hunderte Daten in eine Software eintragen. Die Textfelder in den Eingabemasken jedesmal von neuem zu leeren ist mehr als nervig...
Das macht normalerweise Das Model, über seine Events. Allerdings mit der selben Technik die Du hier einsetzt. Die Listener sitzen eben am Model, nicht an der Maus.

Sicherlich könnte man die Felder gleich leer lassen und eine entsprechende Beschreibung nebendran setzen... was bei mir aber nicht so ist.)
Schon mal was von ToolTipps gehört? [JAPI]JTextfield[/JAPI] (und auch das dazugehörige [JAPI]JLable[/JAPI] hat eine
Code:
setToolTippText()
Methode. Das ist deutlich besser, als eine Beschreibung direkt in's Textfeld zu schreiben.

Ich hoffe das konnte dich überzeugen 🙂
Nein.

bye
TT
 
jajajaja es gibt bestimmt noch 30 andere möglichkeiten... man kann ja nur froh sein, dass nicht jede gui gleichermaßen programmiert ist... wo bliebe denn da der spaß 😀
 
Wenn ich das richtig verstanden habe, sollen die Textfelder einen Platzhalter beinhalten. Dann ist deine Vorgehensweise falsch, benutzerunfreundlich.

Hier ein paar Gründe, die mir auf die Schnelle einfallen:
  1. Navigiert der Nutzer mithilfe der Tabulator-Taste, wird der Text nicht entfernt (Stichwort: Fokus).
  2. Klickt der Nutzer in ein Feld, das er bereits ausgefüllt hat, um eine Kleinigkeit zu ändern, wird sein Text ebenfalls gelöscht.
  3. Es lässt sich nicht feststellen, ob der aktuell eingetragene Text vom Nutzer stammt oder der Platzhalter ist.
Ist für mich als Nutzer immer wieder ein Ärgernis, auf solch eine Anwendung zu stoßen. 😡
Ich habe dazu auch schon ein wenig [post=892970]herumprobiert[/post].
 

Zurück
Oben