Interface Eingabe wird doppelt angezeigt

Sin137

Mitglied
Hallo liebe Com,

ich schreibe gerade an einem Programm, dass mit einer Benutzereingabe über editierbaren JComboBoxen gesteuert werden kann. In die jeweilige Combobox sollen Chars/Strings eingegeben werden, die dann die Datenbank ansprechen sollen. Soweit klappt alles.

Mein Problem liegt nun darin, dass sofern ich z.B. ein 'O' eingebe, zeigt die Combobox mir "OO" an anstatt ein einzelnes 'O'. Tätige ich die nächste Eingabe ein 't', so wird aus "OO" ein "Ott".

Dadurch ist die Abfrage auf die Datenbank sehr behindert. Im nachfolgenden zeige ich wie ich die Eingabe handhabe:

Der Algorithmus ist noch nicht Perfekt mit dem Löschen etc.
Aber das Doppelschreib Problem ist mir da auch ein Dorn im Auge. Da ich immer mich auf den aktuellen Eintrag bezieh, übernimmt er logischerweise die doppelten Zeichen.


Java:
public void autoComplete(JComboBox<String> cb){
        show = cb;
        show.getEditor().getEditorComponent().addKeyListener(new KeyListener(){
           
            @Override
            public void keyTyped(KeyEvent e){
               
            }
           
            @Override
            public void keyReleased(KeyEvent e){
               
            }
           
            @Override
            public void keyPressed(KeyEvent e){

               
                if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE){
                    match = show.getEditor().getItem().toString();
                    System.out.println("1 "+match);
               
                    if(match.length() - 1 < 0){
                        model = new DefaultComboBoxModel<String>(_model.searchCUST());
                        show.setModel(model);
                        show.showPopup();
                    }else{
                        match = match.substring(0, match.length()-1);
                        System.out.println("2 "+match);
                        i-=2;
                        System.out.println(i);
                        if(i%2 == 0){
                            model = new DefaultComboBoxModel<String>(comboBoxItems);
                            show.setModel(model);
                            show.showPopup();
                        }
                       
           
                        if(i%2 == 1){
                            model= new DefaultComboBoxModel<String>(comboBoxItemsStore);
                           
                            show.setModel(model);
                            show.showPopup();
                        }
                    }
                    if(i%2 == 0){
                        System.out.println(comboBoxItems.size());
                    }else{
                        System.out.println(comboBoxItemsStore.size());
                    }
                    System.out.println();
                    System.out.println();
                    show.getEditor().setItem(match);
                    System.out.println(match);
                }
               
                if(e.getKeyCode() == KeyEvent.VK_ENTER && (!show.getEditor().getItem().equals(""))){
                    show.getEditor().setItem(show.getSelectedItem());
                    match = show.getEditor().getItem().toString();
                    i = match.length();
                }
               
                if((e.getKeyCode() >= 65 && e.getKeyCode() <= 90) ||
                        (e.getKeyCode() >= 96 && e.getKeyCode() <= 120) ||
                        (e.getKeyCode() >= 48 && e.getKeyCode() <= 57) ||
                        (e.getKeyChar() == 'ö') || (e.getKeyChar() == 'ä') ||
                        (e.getKeyChar() == 'ü') || (e.getKeyCode() == 32)){
                    char c = e.getKeyChar();
                    System.out.println(c);
                    System.out.println(i);
                    match+= c;
                    System.out.println(match);
                    System.out.println();
                   
                    if(i%2 == 0){
                        comboBoxItems.clear();
                        for(int j = 0; j < comboBoxItemsStore.size();j++){
                            if(((String)comboBoxItemsStore.get(j)).contains(match)){
                                comboBoxItems.add(comboBoxItemsStore.get(j));
                            }
                        }
                   
                        model = new DefaultComboBoxModel<String>(comboBoxItems);
               
                        show.setModel(model);
                        show.showPopup();
                    }
               
                    if(i%2 == 1){
                        comboBoxItemsStore.clear();
                        for(int j = 0; j < comboBoxItems.size();j++){
                            if(((String)comboBoxItems.get(j)).contains(match)){
                                comboBoxItemsStore.add(comboBoxItems.get(j));
                            }
                        }
                   
                        model= new DefaultComboBoxModel<String>(comboBoxItemsStore                                );
                   
                        show.setModel(model);
                        show.showPopup();
                    }

                    if(i%2 == 0){
                        System.out.println(comboBoxItems.size());
                    }else{
                        System.out.println(comboBoxItemsStore.size());
                    }
                    System.out.println();
                    System.out.println();
                    show.getEditor().setItem(match);
                    i++;
                }
            }
        });
    }
 
Hey Sin137,
ich habe gerade leider keine Zeit um deinen Quellcode komplett zu durchsteigen, was mir aber auffällt ist, dass du ganz oft die selben Abfragen und Aufrufe machst.

Versuche doch deinen Code ein wenig besser zu strukturieren, zum Beispiel indem du Dinge in Methoden auslagerst und den Variablen passende Namen gibst. Was ist zum Beispiel "i" besser wäre irgendwas wie countOfXXX oder numberOfXXX.

Wenn du das gemacht hast findest du den Fehler auch besser und vor allem kannst du das viel besser automatisiert Testen.

Beste Grüße,
Jar
 
Danke für den Ratschlag.
Habe jetzt mein Programmcode geordnet und siehe da der Fehler ist mir ins Gesicht gesprungen ^^
Wie ich diesen jetzt behebe weiß ich allerdings noch nicht.

Der Fehler liegt darin, dass ich in einer "match"-Variable den richtigen String speicher, sofern ich diesen mir auf die Combobox mittels .setModel(); anzeigen lassen will, hat er die Eingabe, die ich getätigt habe noch drin.

Beispiel:
Ich gebe ein H ein:
Das H wird in der match-Variable gespeichert am ende wird diese dann angezeigt, da aber noch das eingegebene H da steht wird es nur addiert und nicht ersetzt.
 

Neue Themen


Zurück
Oben