Text vorblenden

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Hi,

dieses Feature ist sicherlich bekannt. Man muss jede Menge Wörter/Sätze/Befehle eingeben welche u. U. auch mehrmals vorkommen sollen. Dabei merkt sich das Programm welche Wörter/Sätze/Befehle bereits eingegeben wurden und überprüft bei jedem neuen Buchstaben ob ein Wort/Satz/Befehl schonmal eingetippt wurde, welches genauso beginnt. Ist ein solches gefunden wird der fehlende Teil an den bereits getippten Bruchteil selektiert (also dass man beim weiterschreiben den selektierten Text überschreibt) angehängt.

Ist ja eigentlich auch kein Problem das zu programmieren nur bei meiner Methode ist das Programm ein wenig überfordert sobald der User ein schneller 10-Finger-Schreiber ist (Text wird deselektiert, hässliches blinken des selektierten Textes, ...). Deswegen wollte ich mal fragen ob es dafür evtl. schon etwas vorgefertigtes gibt oder jemand eine Idee hat wie man das performant realisieren kann.

Ich benutze zum Speichern der bereits eingegebenen Text momentan ein DefaultListModel, ist aber auch kein Problem den Inhalt in eine andere Collection zusätzlich auszulagern.

Dankö ...
 
B

Beni

Gast
Wenn du die Anzeige um ein paar Millisekunden verzögerst? Wer schnell schreibt kriegt nichts aufgepoppt, wer wartet sieht was.
 

The_S

Top Contributor
Sry, ich versteh gerade nicht inwiefern mir das was bringt bzw. wie ich das einsetze, dass es mir was bringt. Vielleicht hab ich ja auch nur ne Denkblockade oder das ganze falsch verstanden!?

Weil, wenn ich jetzt meinetwegen nachdem ein key gedrückt wurde z. B. 20 Millisekunden (kA was da realistisch ist) warte und schau ob noch was nachkommt und wenn nichts nachkommt meine Methode aufruf bin ich doch genauso blöd dran wenn er dann anfängt "wild was zu drücken"!? Oder hab ich das jetzt falsch verstanden?

Ich hab mal eben eine BeispielKlasse geschrieben:

Code:
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

public class TextFieldFind extends JTextField implements KeyListener {
	
	private Vector<String> data = null;
	
	public TextFieldFind() {
		
		addKeyListener(this);
		data = new Vector<String>();
	}
	
	public void setData(Vector<String> data) {
		
		this.data = data;
	}
	
	public void addData(String str) {
		
		data.add(str);
	}
	
	private boolean quickSearch() {
		
		String start = getText();
		for (String str : data) {
			if (str.startsWith(start)) {
				try {
					setText(str);
					select(start.length(), str.length());
				}
				catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return true;
	}
	
	public void keyTyped(KeyEvent key) {
	}
	
	public void keyPressed(KeyEvent key) {
	}
	
	public void keyReleased(KeyEvent key) {
		
		if (Character.isLetter(key.getKeyChar()) || key.getKeyChar() == ' ') {
			quickSearch();
		}
	}
}
 

Leroy42

Top Contributor
So etwas ähnliches habe ich früher mal mit Turbo-Pascal implementiert.
Je feinfühliger sich dein Programm auf den Benutzer einstellen soll, umso
mehr Friemelarbeit mußt du in die Implementierung stecken.

Beni hat schon Recht bzgl. der Verzögerung vor Aufruf deiner Ergänzungsinfo.

Aber das ist nur die halbe Wahrheit. Es geht nicht (nur) um die Anfangsverzögerung.
Wenn das Ergebnis für verschiedene User flüssig und angenehm zu bedienen sein soll,
mußt du auch während der Eingabe sensibel reagieren.

Ich weiß noch, daß ich damals ziemlich lange dafür brauchte und zeitweise
frustriert war, aber, nachdem alles fertig war, es doch (für damalige Verhältnisse)
richtig was hermachte.

Also viel Vergnügen bei der Realisierung :D
 

The_S

Top Contributor
OK, werd mich mal daran versuchen. Wenn ich was brauchbares hab kann ich es ja hier veröffentlichen. Für weitere Tipps bin ich natürlich trotzdem dankbar ;)
 

The_S

Top Contributor
So, war eigentlich gar net so schwer wenn man weiß wie :cool: . Das TextFeld funktioniert, ist aber auf die nötigsten Funktionen beschränkt aber das kann man ja erweitern ;)

Code:
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

import javax.swing.JTextField;

import java.util.Vector;

public class SuggestionTextField extends JTextField implements KeyListener { 
	 
	private Vector<String> data = null; 
	private boolean doNothingElse = false;
	
	public SuggestionTextField() { 
		 
		addKeyListener(this); 
		data = new Vector<String>(); 
	} 
	 
	public void setData(Vector<String> data) { 
		 
		this.data = data; 
	} 
	 
	public void addData(String str) { 
		 
		data.add(str); 
	} 
	
	public void deleteData(String str) {
		
		data.remove(str);
	}
	
	private void quickSearch(String start) { 
		 
		for (String str : data) { 
			if (str.startsWith(start)) {
				setText(str); 
				select(start.length(), str.length()); 
				doNothingElse = true;
				break;
			} 
		} 
	}
	
	private void handleKey(char key) {
		
		String selection = getSelectedText();
		if (selection != null && selection.charAt(0) == key) {
			doNothingElse = true;
			setSelectionStart(getSelectionStart() + 1);
		}
		else if (selection != null) {
			String nonSelected = getText().substring(0, getText().length() - selection.length()) + key;
			quickSearch(nonSelected);
		}
		else {
			quickSearch(getText() + key);
		}
	}
	 
	public void keyTyped(KeyEvent key) { 
	
		if (doNothingElse == true) {
			key.consume();
			doNothingElse = false;
		}
	} 
	 
	public void keyPressed(KeyEvent key) { 
	
		if (Character.isLetter(key.getKeyChar()) || key.getKeyChar() == ' ') {
			handleKey(key.getKeyChar());
		}
	} 
	 
	public void keyReleased(KeyEvent key) {} 
}
 

Mark110

Bekanntes Mitglied
hmm wie implementiere ich so eine komponnente denn?

ich erzeuge ein ojekt und kann ja dann auf die methdoen zugriefen.

aber um z.b. keypressed zu benutzen muss ich dann einen listener imlementieren?!
kann mal jemand ein kleines beispiel mit dieser komponente schrieben. Wäresehr nett stehe gerade auf dme schlauch
 

The_S

Top Contributor
Z. B. einfach eine main dazu schreiben

Code:
package de.stkiese.test;

import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JTextField;

import java.util.Vector;

public class SuggestionTextField extends JTextField implements KeyListener {
   
   private Vector<String> data = null;
   private boolean doNothingElse = false;
   
   private static final long serialVersionUID = 1L;
   
   public SuggestionTextField() {
      
      addKeyListener(this);
      data = new Vector<String>();
   }
   
   public void setData(Vector<String> data) {
      
      this.data = data;
   }
   
   public void addData(String str) {
      
      data.add(str);
   }
   
   public void deleteData(String str) {
      
      data.remove(str);
   }
   
   private void quickSearch(String start) {
      
      for (String str : data) {
         if (str.startsWith(start)) {
            setText(str);
            select(start.length(), str.length());
            doNothingElse = true;
            break;
         }
      }
   }
   
   private void handleKey(char key) {
      
      String selection = getSelectedText();
      if (selection != null && selection.charAt(0) == key) {
         doNothingElse = true;
         setSelectionStart(getSelectionStart() + 1);
      }
      else if (selection != null) {
         String nonSelected = getText().substring(0, getText().length() - selection.length()) + key;
         quickSearch(nonSelected);
      }
      else {
         quickSearch(getText() + key);
      }
   }
   
   public void keyTyped(KeyEvent key) {
   
      if (doNothingElse == true) {
         key.consume();
         doNothingElse = false;
      }
   }
   
   public void keyPressed(KeyEvent key) {
   
      if (Character.isLetter(key.getKeyChar()) || key.getKeyChar() == ' ') {
         handleKey(key.getKeyChar());
      }
   }
   
   public void keyReleased(KeyEvent key) {
   }
   
   public static void main(String[] args) {
	   
	   JFrame frame = new JFrame();
	   SuggestionTextField stf = new SuggestionTextField();
	   
	   stf.addData("Test Eintrag");
	   stf.addData("Noch ein Test Eintrag");
	   stf.addData("Test Eintrag 2");
	   stf.addData("Juhuuu");
	   
	   frame.add(stf);
	   frame.setSize(200, 75);
	   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	   frame.setVisible(true);
   }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Text und Backgroundcolor im Label geht nicht AWT, Swing, JavaFX & SWT 7
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C JToggleButton disabled Text Color AWT, Swing, JavaFX & SWT 11
H JavaFX Label.Text mit bind an DoubleProperty binden AWT, Swing, JavaFX & SWT 3
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
FrittenFritze Text in Flying Saucer selectierbar machen AWT, Swing, JavaFX & SWT 0
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
I Rich Text drucken AWT, Swing, JavaFX & SWT 0
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
N In Textdatei Text anfügen per GUI AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
R Swing JTextField nicht-kopierbarer Text AWT, Swing, JavaFX & SWT 1
S Text-Info in der Taskbar anzeigen AWT, Swing, JavaFX & SWT 15
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
C JCheckBox disabled text color AWT, Swing, JavaFX & SWT 9
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
L JavaFX Anderer Text, wenn kein Platz ist. AWT, Swing, JavaFX & SWT 1
K JavaFX TextInputDialog Button Text ändern AWT, Swing, JavaFX & SWT 1
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
C Swing Spinner als TableCellEditor - Text zu klein AWT, Swing, JavaFX & SWT 2
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
I JavaFX formatierter Text in PDF speichern AWT, Swing, JavaFX & SWT 4
T JavaFX Text des ProgressIndicators ändern AWT, Swing, JavaFX & SWT 2
E Swing Text verschwindet AWT, Swing, JavaFX & SWT 1
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
G Rectangle Breite richtet such an die Breite vom Text AWT, Swing, JavaFX & SWT 1
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
K Rich Text FX von TomasMikula AWT, Swing, JavaFX & SWT 0
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
S JAVAFX HTMLEditor wrap text AWT, Swing, JavaFX & SWT 1
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
A JavaFX HTMLEditor in Text umwandeln AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
javampir Java FX Text verschwindet nicht AWT, Swing, JavaFX & SWT 9
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
E To get a color text on the TextArea AWT, Swing, JavaFX & SWT 4
E To get color text on the TextArea AWT, Swing, JavaFX & SWT 5
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JPanel "zeichnet" keinen Text AWT, Swing, JavaFX & SWT 14
U WYSIWYG Text-Editor für JFrames AWT, Swing, JavaFX & SWT 8
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
T MausClick soll TExt ändern AWT, Swing, JavaFX & SWT 6
J Text bei Eingabe löschen AWT, Swing, JavaFX & SWT 5
A SWT Auto completion in text box AWT, Swing, JavaFX & SWT 5
C Geloest: JTextfield: Titel automatisch entfernen, sobald Text eingegeben wird AWT, Swing, JavaFX & SWT 1
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
B Text auf Display ausgeben [LWJGL] AWT, Swing, JavaFX & SWT 2
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
S TextArea get Selected row(Text) AWT, Swing, JavaFX & SWT 6
A Radio Buttons sollen den Text der text Area bestimmen AWT, Swing, JavaFX & SWT 9
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
J LayoutManager Text Spielerein GUI AWT, Swing, JavaFX & SWT 2
H Javafx - Styled Text AWT, Swing, JavaFX & SWT 5
M Text Area 1. Zeile oben AWT, Swing, JavaFX & SWT 4
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
R JavaFX Automatischer Zeilenumbruch in Text AWT, Swing, JavaFX & SWT 13
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
F Dialog mit Titel, Text und Ok Button AWT, Swing, JavaFX & SWT 2
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
TheJavaKid DocumentListener soll Text in JTextField ändern AWT, Swing, JavaFX & SWT 4
K JEditorPane Text einfügen AWT, Swing, JavaFX & SWT 4
A Text (String) zu einer Box hinzufügen AWT, Swing, JavaFX & SWT 16
B SWT Text - zeilenumbruch AWT, Swing, JavaFX & SWT 2
TheWhiteShadow Swing Document Text Position in Pixel AWT, Swing, JavaFX & SWT 2
J Swing Text kürzendes JLabel AWT, Swing, JavaFX & SWT 12
J Swing TextArea mit nicht-editierbarem Text AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben