# Automatischer Vervollständigung einer Texteingabe



## Sin137 (20. Nov 2015)

Hallo liebe Com,

ich suche schon den ganzen Tag finde aber nichts.
Mein Vorhaben:

Ich will eine Texteingabe in ein JTextField tätigen. Sofern ich etwas eingetragen habe, soll unter dem TextField eine Liste (Änlich einer ComboBox) erscheinen mit möglichen Eingaben. 
Alle Möglichen Eingaben habe ich in einem String[] abgespeichert.

Ich habe schon eine Idee aber der gewisse startkick fehlt mir grade. Ich dachte an eine art TextArea die unter dem TextField erscheint. 

Ein selbstgeschriebener Algorithmus soll nach jedem Input über das Array laufen und mögliche Strings in eine ArrayList speichern.
Danach soll eine Liste erscheinen mit allen möglichkeiten.

Nach der nächsten Eingabe, soll der Algorithmus von vorne beginnen.


Ich bedanke mich schon einmal für Vorschläge und Ideen.


----------



## strußi (20. Nov 2015)

du kannst nach jedem keyEvent das Textfeld auslesen und schaune ob es einen eindeutigen eintrag in deinem array gibt.


----------



## Sin137 (20. Nov 2015)

Ich arbeite bis jetzt mit einem DocumentListener. 
Ich habe Strings die im vorfelt gleich sind sich hinten aber vverändern.

z.B:

0001 Haustür
0002 Dach
0003 Toilette
0004 Bügelbrett
0005 Ziegel
(Das sind lediglich Beispiele keine echten Werte: Der Aufbau ist jedoch ähnlich)

Mein Vorhaben liegt jetzt darin, wenn ich in das JTextField 000 eingebe, 
sollen mir alle Strings angezeigt werden die eine 000 beinhalten. Mir geht es hier nicht um den suchalgorythmus. 

Meine Frage liegt darin, wie ich diese unter dem JTextField auflisten kann, ohne ein festes Element dafür einzubauen, dass immer sichtbar ist.


----------



## Khal Drogo (20. Nov 2015)

EDIT: Ersten Post bitte ignorieren, habe die Frage nicht direkt verstanden.

Hast du mal darüber nachgedacht, einfach die Funktion setVisible(boolean) zu benutzen (sofern du mit JComponents o. ä. arbeiten willst)?

Mit freundlichen Grüßen
Xelsarion


----------



## strußi (20. Nov 2015)

wie wäre es mit einem tooltip


----------



## Sin137 (20. Nov 2015)

Tooltip ist hier das Falsche. Ich beschreib es nochmal genauer:

Ich habe eine Maske, in die Werte eingetragen werden können.
Je nach dem welche Werte eignetragen werden, soll eine spezifische SQL-Abfrage getätigt werden.
Da es sich um eine DB mit verschiedenen Porduktgruppen handelt würde ich gerne folgendes als Funktion programmieren.

In dem JTextField für Produktgruppen will ich etwas eingeben. 



Sin137 hat gesagt.:


> 0001 Haustür
> 0002 Dach
> 0003 Toilette
> 0004 Bügelbrett
> 0005 Ziegel



meine Produktgruppen.

Jetzt fange ich an zu schreiben:

000 <- so würde es bis dahin im Jtextfield stehen!

zu der zeit will ich eine art Liste unterhalb des JTextField anzeigen lassen wo alle Produktgruppen drinstehen, die man auch auswählen kann um den Text in das Feld zu verschieben. (Vorstellbar wie bei Google)

würde dann die 1 folgen:

0001 

sollte dann wirklich nur noch 0001 Haustür vorgeschlagen werden.


Zu der Lösung mit Visible:

Da müsste ich in mein Panel trozdem die JTextArea einfügen und diese würde auch ihren Platz verbrauchen (auch wenn nicht sichtbar). Und dies siet mehr als bescheiden aus.



LG

Sin


----------



## strußi (21. Nov 2015)

dann schau mal die editable Combox an, in die kannst du oben reinschreiben und sollte dir eine liste mit allen möglichen antworten, die du über den entsprechenden Listender manipulieren kannst.


----------



## Sin137 (27. Nov 2015)

Ich hab noch keine Lösung für mein Problem gefunden.


----------



## strußi (27. Nov 2015)

Dann zeig uns doch, was du bis jetzt an code hast, damit wir dir helfen können
hab sowas ähnliches mit verbindung eines focuslisteners gemacht


Spoiler: db -abfrage





```
//    Gibt den Kontennamen zurück der in dem Textfeld neben der Kontonummer geschrieben wird
    public static String kontoGetKurzname(Connection conn, String knr){
        String kname = "";
        int count = 1;
        try{
            Statement sql = conn.createStatement();
            ResultSet rs = sql.executeQuery( "SELECT Kurzname FROM Stammdaten WHERE Kontonr LIKE '"+knr+"'");
            while(rs.next()){
                 kname = rs.getString(count);
                 count++;
            }
            if( kname.equals("")){
                kname = "";
            }
            sql.close();
        } catch( SQLException e){}
        return kname;
    }
```


----------



## Sin137 (27. Nov 2015)

Okay also der Code ist bestimmt schrecklich für euch, ich kann es leider noch nicht besser.


```
package de...._....controller;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.DefaultBoundedRangeModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;

import de...._....view.QueryNewView;

public class QueryNewController implements KeyListener{

    private JComboBox cb;
    private QueryNewView _view;
    private String match = "";
    private int i;
    private Vector comboBoxItems, comboBoxItems2;
    private DefaultComboBoxModel model;
   
    public QueryNewController(QueryNewView _view){
        this._view = _view;
        i = 1;
       
        //Beispieleinträge
        comboBoxItems = new Vector();
        comboBoxItems.add("0001 Test1");
        comboBoxItems.add("0002 Test2");
        comboBoxItems.add("0003 Test3");
        comboBoxItems.add("0004 Test4");
       
        comboBoxItems2 = new Vector();
      

    }
   
    public void controll(){
       
    }
   
    public void autoCompleteHWG(JComboBox cb){
        this.cb = cb;
        cb.getEditor().getEditorComponent().addKeyListener(this);
    }

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

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

     // An dieser Stelle verzweifel ich
    @Override
    public void keyTyped(KeyEvent e) {
        char c = e.getKeyChar();                       // der Buchstabe/Zahl der eingabe
        match += c;                                         // gesamte Eingabe
        System.out.println(match);                     // testausgabe
        JComboBox show = (JComboBox)e.getComponent().getParent();  //ich greife hier auf das objekt zu, dass aktiv ist
       
         //hier kommt der Algorithmus rein:
        for(int i = 0; i < comboBoxItems.size();i++){
            if(((String)comboBoxItems.get(i)).contains(match)){
                comboBoxItems2.add(comboBoxItems.get(i));
            }
        }
       
        //hier versuch ich das Model mit den neuen Daten zu aktualisieren
        model = new DefaultComboBoxModel(comboBoxItems2);
        show.removeAllItems();
        show.insertItemAt(match, 0);
        show.setModel(model);
       
    }       

       
}
```

Hab jetzt als schon rumprobiert. Was ich nicht herausgefunden habe:

Kann ich das aktuelle Objekt in der BomboBox fixieren sodass erst der ganze eintrag erschein wenn ich es mit Enter bestätige.

wie sag ich, dass die Auswahl ständig angezeigt wird.


----------



## Sin137 (30. Nov 2015)

Ich hab es jetzt fast!


```
package de.....controller;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;

import de.....view.QueryNewView;

public class QueryNewController implements KeyListener{

    private JComboBox cb;
    private QueryNewView _view;
    private String match = "";
    private int i;
    private ArrayList<String> hwg1, hwg2;
    private Vector comboBoxItems, comboBoxItems2;
    private DefaultComboBoxModel model;
   
    public QueryNewController(QueryNewView _view){
        this._view = _view;
        i = 1;
       
        comboBoxItems = new Vector();
        comboBoxItems.add("0001 Gewindefittings / Gussfittings");
        comboBoxItems.add("0002 Armaturen");
        comboBoxItems.add("0003 Rohrbogen");
        comboBoxItems.add("0004 Schweißfittings");
       
        comboBoxItems2 = new Vector();
               
    }
   
    public void controll(){
       
    }
   
    public void autoCompleteHWG(JComboBox cb){
        this.cb = cb;
        cb.getEditor().getEditorComponent().addKeyListener(this);
    }

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

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

    @Override
    public void keyTyped(KeyEvent e) {
        char c = e.getKeyChar();
        match += c;
        JComboBox show = (JComboBox)e.getComponent().getParent();

        if(i%2 == 0){
            System.out.println("test0");
            comboBoxItems.clear();
            for(int j = 0; j < comboBoxItems2.size();j++){
                if(((String)comboBoxItems2.get(j)).contains(match)){
                    comboBoxItems.add(comboBoxItems2.get(j));
                }
            }
           
            model = new DefaultComboBoxModel<>(comboBoxItems);
       
            show.setModel(model);
            show.showPopup();
        }
       
        //Fehler ausgabe nicht perfekt 435
        if(i%2 == 1){
            comboBoxItems2.clear();
            for(int j = 0; j < comboBoxItems.size();j++){
                if(((String)comboBoxItems.get(j)).contains(match)){
                    comboBoxItems2.add(comboBoxItems.get(j));
                }
            }
           
            model = new DefaultComboBoxModel(comboBoxItems2);
           
            show.setModel(model);
            show.showPopup();
        }
           
        show.getEditor().setItem(match);
        i++;
    }       

       
}
```

Mein einziges Problem ist, dass wenn ich etwas eintippe, zuerst das zeichen doppelt dargstellt wird, tippe ich aber weiter ein ist es von der Struktur richtig. Weiß jemand wie man das richtig darstellt ?

Habe dazu leider keine Idee. Und Herr Google kennt leider auch nicht die Antwort.


LG

Sin


----------

