[RESOLVIDO] JComboBox não seleciona item duplicado

só selecionei o 1º Item do Combobox
o Retorno foi esse:

run:
Conexão Fechada//essa primeira conexão é quando eu carrego o combobox, que está num evento do JFRAME
1
2
Conexão Fechada
3 3
4
4.1: 3
4.2: Antonio
4.3: 3-Antonio
4.4: Antonio
4
4.1: 1
4.2: Antonio 01
4.3: 1-Antonio 01
4.4: Antonio
4
4.1: 2
4.2: MARIA DE SOUZA
4.3: 2-MARIA DE SOUZA
4.4: Antonio
CONSTRUÍDO COM SUCESSO (tempo total: 8 segundos)

Oi,

O erro está aqui ó:

4.2: Antonio
4.3: 3-Antonio
4.4: Antonio

Me mostre como seu JCombo está sendo populado.

Tchauzin!

esse é o algorítimo responsavel pela população do jCombobox
Muito obrigado por esta mim ajudando Deus te abençoe, só tenho a agradecer.

[code]String nome2 ="";
ControleCurriculum controle2 = new ControleCurriculum();

for (Curriculum curriculo : controle2.buscarCurriculum(nome2) ){
pesquisar.addItem(curriculo.getNome());

// pesquisar.repaint();
} [/code]

Oi,

Mude para isso:

[code]
String nome2 ="";
ControleCurriculum controle2 = new ControleCurriculum();

for (Curriculum curriculo : controle2.buscarCurriculum(nome2) ){
pesquisar.addItem(curriculo.getCod()+"-"+curriculo.getNome());

// pesquisar.repaint();
} [/code]

Teste novamente o programa. Talvez funcione :wink:

Não precisa agradecer, estamos aqui para isso.

Tchauzin!

FUNCIONOUUUU

eita ele não tava mostrando pq tava sem o codigo kkkk intendi,

olha mais tem outro problema eu uso uma classe para fazer o alto complete no combobox,

e como tem o numero agora ta na frente não tem com eu fazer os filtros no combo…

i agora? kkk

Oi,

Deve ser só adapta-lo. Se quiser postar aqui também …

Tchauzin!

[code]/*

package formularios;
import java.awt.event.;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.Collator;
import java.util.Locale;
import javax.swing.
;
import javax.swing.text.*;

public class AutoCompletion extends PlainDocument {
private static final long serialVersionUID = 5157735565710292356L;
JComboBox comboBox;
ComboBoxModel model;
JTextComponent editor;
// flag to indicate if setSelectedItem has been called
// subsequent calls to remove/insertString should be ignored
boolean selecting=false;
boolean hidePopupOnFocusLoss;
boolean hitBackspace=false;
boolean hitBackspaceOnSelection;

KeyListener editorKeyListener;  
FocusListener editorFocusListener;  

public AutoCompletion(final JComboBox comboBox) {  
    this.comboBox = comboBox;  
    model = comboBox.getModel();  
    comboBox.addActionListener(new ActionListener() {  
        @Override  
        public void actionPerformed(ActionEvent e) {  
            if (!selecting) highlightCompletedText(0);  
        }  
    });  
    comboBox.addPropertyChangeListener(new PropertyChangeListener() {  
        @Override  
        public void propertyChange(PropertyChangeEvent e) {  
            if (e.getPropertyName().equals("editor")) configureEditor((ComboBoxEditor) e.getNewValue());  
            if (e.getPropertyName().equals("model")) model = (ComboBoxModel) e.getNewValue();  
        }  
    });  
    editorKeyListener = new KeyAdapter() {  
        @Override  
        public void keyPressed(KeyEvent e) {  
            if (comboBox.isDisplayable()) comboBox.setPopupVisible(true);  
            hitBackspace=false;  
            switch (e.getKeyCode()) {  
                // determine if the pressed key is backspace (needed by the remove method)  
                case KeyEvent.VK_BACK_SPACE : hitBackspace=true;  
                hitBackspaceOnSelection=editor.getSelectionStart()!=editor.getSelectionEnd();  
                break;  
                // ignore delete key  
                case KeyEvent.VK_DELETE : e.consume();  
                comboBox.getToolkit().beep();  
                break;  
            }  
        }  
    };  
    // Bug 5100422 on Java 1.5: Editable JComboBox won't hide popup when tabbing out  
    hidePopupOnFocusLoss=System.getProperty("java.version").startsWith("1.5");  
    // Highlight whole text when gaining focus  
    editorFocusListener = new FocusAdapter() {  
        @Override  
        public void focusGained(FocusEvent e) {  
            highlightCompletedText(0);  
        }  
        @Override  
        public void focusLost(FocusEvent e) {  
            // Workaround for Bug 5100422 - Hide Popup on focus loss  
            if (hidePopupOnFocusLoss) comboBox.setPopupVisible(false);  
        }  
    };  
    configureEditor(comboBox.getEditor());  
    // Handle initially selected object  
    Object selected = comboBox.getSelectedItem();  
    if (selected!=null) setText(selected.toString());  
    highlightCompletedText(0);  
}  

public static void enable(JComboBox comboBox) {  
    // has to be editable  
    comboBox.setEditable(true);  
    // change the editor's document  
    new AutoCompletion(comboBox);  
}  

void configureEditor(ComboBoxEditor newEditor) {  
    if (editor != null) {  
        editor.removeKeyListener(editorKeyListener);  
        editor.removeFocusListener(editorFocusListener);  
    }  

    if (newEditor != null) {  
        editor = (JTextComponent) newEditor.getEditorComponent();  
        editor.addKeyListener(editorKeyListener);  
        editor.addFocusListener(editorFocusListener);  
        editor.setDocument(this);  
    }  
}  

@Override  
public void remove(int offs, int len) throws BadLocationException {  
    // return immediately when selecting an item  
    if (selecting) return;  
    if (hitBackspace) {  
        // user hit backspace => move the selection backwards  
        // old item keeps being selected  
        if (offs>0) {  
            if (hitBackspaceOnSelection) offs--;  
        } else {  
            // User hit backspace with the cursor positioned on the start => beep  
            comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);  
        }  
        highlightCompletedText(offs);  
    } else {  
        super.remove(offs, len);  
    }  
}  

@Override  
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {  
    // return immediately when selecting an item  
    if (selecting) return;  
    // insert the string into the document  
    super.insertString(offs, str, a);  
    // lookup and select a matching item  
    Object item = lookupItem(getText(0, getLength()));  
    if (item != null) {  
        setSelectedItem(item);  
    } else {  
        // keep old item selected if there is no match  
        item = comboBox.getSelectedItem();  
        // imitate no insert (later on offs will be incremented by str.length(): selection won't move forward)  
        offs = offs-str.length();  
        // provide feedback to the user that his input has been received but can not be accepted  
        comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);  
    }  
    if(item != null)  
        setText(item.toString());  
    else   
        setText("");  
    // select the completed part  
    highlightCompletedText(offs+str.length());  
          
}  

private void setText(String text) {  
    try {  
        // remove all text and insert the completed string  
        super.remove(0, getLength());  
        super.insertString(0, text, null);  
    } catch (BadLocationException e) {  
        throw new RuntimeException(e.toString());  
    }  
}  

private void highlightCompletedText(int start) {  
    editor.setCaretPosition(getLength());  
    editor.moveCaretPosition(start);  
}  

private void setSelectedItem(Object item) {  
    selecting = true;  
    model.setSelectedItem(item);  
    selecting = false;  
}  

private Object lookupItem(String pattern) {  
    Object selectedItem = model.getSelectedItem();  
    // only search for a different item if the currently selected does not match  
    if (selectedItem != null && startsWithIgnoreAccentsAndCase(selectedItem.toString(), pattern)) {  
        return selectedItem;  
    } else {  
        // iterate over all items  
        for (int i=0, n=model.getSize(); i < n; i++) {  
            Object currentItem = model.getElementAt(i);  
            // current item starts with the pattern?  
            if (currentItem != null && startsWithIgnoreAccentsAndCase(currentItem.toString(), pattern)) {  
                return currentItem;  
            }  
        }  
    }  
    // no item starts with the pattern => return null  
    return null;  
}  
private static Collator collator = null;  
private static Collator getCollator() {  
    if (collator == null) {  
        collator = Collator.getInstance (new Locale ("pt", "BR"));  
        collator.setStrength(Collator.PRIMARY);  
    }  
    return collator;  
}  
public static boolean startsWithIgnoreAccentsAndCase(String source,String target) {  
    if (target.length() > source.length())  
        return false;  
    return getCollator().compare(source.substring(0, target.length()),target) == 0;  
}  

} [/code]

eu chamo ele assim no frame:

[code]
private void pesquisa(){
//AutoCompleteDecorator.decorate(this.pesquisar);
AutoCompletion.enable(pesquisar);

}[/code]

Lina tem como fazer o combobox digitar depois do 2º caractere??? axo que isso resolveria.

Oi,

Sim. Isso resolveria. Estava olhando a classe AutoCompletion.java e fiquei realmente impressionada. Vou guarda-la em minha lib (rsrs).

Tudo gira em torno do método lookupItem(String pattern).

Ajustando ele já resolveria. Vou pensar e já respondo.

Tchauzin!

Oi,

Mude o método look para isso ó:

private Object lookupItem(String pattern) { // Object selectedItem = model.getSelectedItem(); // only search for a different item if the currently selected does not match // if (selectedItem != null && startsWithIgnoreAccentsAndCase(selectedItem.toString(), pattern)) { // return selectedItem; // } else { // iterate over all items for (int i=0, n=model.getSize(); i < n; i++) { Object currentItem = model.getElementAt(i); // current item starts with the pattern? if (currentItem != null && currentItem.toString().contains(pattern)) { return currentItem; } } // } // no item starts with the pattern => return null return null; }

Teste e analise se tem um resultado satisfatório.

Tchauzin!

Foi mal a demora mais vc ja teve um ajuda bem melhor da Lina fui.
Ps: achei interessante a classe AutoCompletion vou pegar ela para uso posterior vlw.

Ficou do mesmo jeito lina, o problema é que quando vou digitar o nome que preciso no jcombobox, ele não aceita
nenhuma letra porque todos os itens iniciam com números…

Só para tumultuar. Estava com minha esposa em uma loja de bijuterias - e havia bijuterias da marca chinesa “Li Na” :slight_smile: - talvez fosse referência a uma tenista chinesa, 李娜 (Li Na).

Só para tumultuar. Estava com minha esposa em uma loja de bijuterias - e havia bijuterias da marca chinesa “Li Na” :slight_smile: - talvez fosse referência a uma tenista chinesa, 李娜 (Li Na).
[/quote]

Oi,

Sabe que eu não sei o real significado do meu nome? Vai ver que é esse! rsrs

Então, aproveitando… não consegui uma solução plausível para o nosso amigo! Acho que colocar o código na frente dos itens do Combo pode não ter sido uma boa ideia.

O detalhe é que nesse auto-complete, quando existem nomes como por exemplo: Administrador, Automação a logica está falha.

01-Administrador
02-Automação

O método lookupItem(String) faz uso de startsWithIgnoreAccentsAndCase, e quando o usuário digita A, automaticamente ele pega o índice Administrador. Como ele testa se existe um item selecionado antes, ele não dá a opção do usuário continuar digitando o restante da palavra (que seria utomação).

private Object lookupItem(String pattern) { Object selectedItem = model.getSelectedItem(); // only search for a different item if the currently selected does not match if (selectedItem != null && startsWithIgnoreAccentsAndCase(selectedItem.toString(), pattern)) { return selectedItem; } else { // iterate over all items for (int i=0, n=model.getSize(); i < n; i++) { Object currentItem = model.getElementAt(i); // current item starts with the pattern? if (currentItem != null && startsWithIgnoreAccentsAndCase(currentItem.toString(), pattern)) { return currentItem; } } } // no item starts with the pattern => return null return null; }

Se eu tirar a primeira condição IF do método, implica em outro método insertString:

[code] @Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
// return immediately when selecting an item
if (selecting) return;
// insert the string into the document
super.insertString(offs, str, a);
// lookup and select a matching item
Object item = lookupItem(getText(0, getLength()));
if (item != null) {
setSelectedItem(item);
} else {
// keep old item selected if there is no match
item = comboBox.getSelectedItem();
// imitate no insert (later on offs will be incremented by str.length(): selection won’t move forward)
offs = offs-str.length();
// provide feedback to the user that his input has been received but can not be accepted
comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
}
if(item != null)
setText(item.toString());
else
setText("");
// select the completed part
highlightCompletedText(offs+str.length());

}  [/code]

Se eu remover o código do nome em lookupItem e tirasse o primeiro IF, também não funcionaria:

private Object lookupItem(String pattern) { // Object selectedItem = model.getSelectedItem(); // only search for a different item if the currently selected does not match // if (selectedItem != null && startsWithIgnoreAccentsAndCase(selectedItem.toString(), pattern)) { // return selectedItem; // } else { // iterate over all items for (int i=0, n=model.getSize(); i < n; i++) { Object currentItem = model.getElementAt(i); // current item starts with the pattern? if (currentItem != null && startsWithIgnoreAccentsAndCase(currentItem.toString().replaceAll("[^a-z|A-Z]", ""), pattern)) { return currentItem; } } // } // no item starts with the pattern => return null return null; }

Como estou sem tempo para ficar testando, fiquei numa sinuca de bico =)

Tchauzin!

ha lina não se preocupa eu não tenho muita pressa, só falta isso pra terminar o softzinho, assim que vc tiver um tempo lebre de mim, só tenho a agradecer por toda ajuda com certeza meu banco de dados de inteligencia só aumentou, muito abrigado,

um bom fim de semana,

ae pessoal quem poder ajudar fica a vontade…

abraço

Olá, RESOLVIDO, com a ajuda de Deus e da lina e do douglaskd, o douglas teve a ideia de deixar primeiro o nome e depois o id ex.

NOME - 3

AI TUDO RESOLVIDO

MUITO OBRIGADO LINA, DOUGLAS

vcs são uma bençãoo.

abraço.

[quote=Oesly]Olá, RESOLVIDO, com a ajuda de Deus e da lina e do douglaskd, o douglas teve a ideia de deixar primeiro o nome e depois o id ex.

NOME - 3

AI TUDO RESOLVIDO

MUITO OBRIGADO LINA, DOUGLAS

vcs são uma bençãoo.

abraço.[/quote]

Oi,

Puxa vida. É verdade. Isso poderia ser feito. As vezes estamos tão viciados na tentativa de uma solução e não enxergamos o que está na nossa cara. rsrs

Tchauzin!