-2

I am writing code for a search in combo box with AutoSuggest feature but problem is I've to write Exactly same case. If i write "Afghanistan" it shows suggestions but if i write "afghanistan" nothing appears. Below is code. I need to create search which is non case sensitive so users are free to type their search string without any casing in mind.

/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
 */
package autosuggest;
import java.awt.EventQueue;
import java.util.Vector;
import javax.swing.JTextField;
import java.awt.HeadlessException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
/**
 *
 * @author admin
 */
public class NewJFrame extends javax.swing.JFrame {
    
         
    /**
     * Creates new form NewJFrame
     */
    public NewJFrame() {
        initComponents();
        loadCountries();
        autoSuggest();
    }
  private final Vector<String> v = new Vector<String>();
  private JTextField tf;
  private boolean hide_Flag=false;
  
      
void loadCountries() {
String[] countries={"Afghanistan",
"Albania",
"Algeria",
"Andorra",
"Angola",
"AntiguaDeps",
"Argentina",
"Armenia",
"Australia",
"Austria",
"Azerbaijan",
"Bahamas",
"Bahrain",
"Bangladesh",
"Barbados",
"Belarus",
"Belgium",
"Belize",
"Benin",
"Bhutan",
"Bolivia",
"Bosnia Herzegovina",
"Botswana",
"Brazil",
"Brunei",
"Bulgaria",
"Burkina",
"Burundi",
"Cambodia",
"Cameroon",
"Canada",
"Cape Verde",
"Central African Rep",
"Chad",
"Chile",
"China",
"Colombia",
"Comoros",
"Congo",
"Congo Democratic Rep",
"Costa Rica",
"Croatia",
"Cuba",
"Cyprus",
"Czech Republic",
"Denmark",
"Djibouti",
"Dominica",
"Dominican Republic",
"East Timor",
"Ecuador",
"Egypt",
"El Salvador",
"Equatorial Guinea",
"Eritrea",
"Estonia",
"Ethiopia",
"Fiji",
"Finland",
"France",
"Gabon",
"Gambia",
"Georgia",
"Germany",
"Ghana",
"Greece",
"Grenada",
"Guatemala",
"Guinea",
"Guinea-Bissau",
"Guyana",
"Haiti",
"Honduras",
"Hungary",
"Iceland",
"India",
"Indonesia",
"Iran",
"Iraq",
"Ireland",
"Israel",
"Italy",
"Ivory Coast",
"Jamaica",
"Japan",
"Jordan",
"Kazakhstan",
"Kenya",
"Kiribati",
"Korea North",
"Korea South",
"Kosovo",
"Kuwait",
"Kyrgyzstan",
"Laos",
"Latvia",
"Lebanon",
"Lesotho",
"Liberia",
"Libya",
"Liechtenstein",
"Lithuania",
"Luxembourg",
"Macedonia",
"Madagascar",
"Malawi",
"Malaysia",
"Maldives",
"Mali",
"Malta",
"Marshall Islands",
"Mauritania",
"Mauritius",
"Mexico",
"Micronesia",
"Moldova",
"Monaco",
"Mongolia",
"Montenegro",
"Morocco",
"Mozambique",
"Myanmar",
"Namibia",
"Nauru",
"Nepal",
"Netherlands",
"New Zealand",
"Nicaragua",
"Niger",
"Nigeria",
"Norway",
"Oman",
"Pakistan",
"Palau",
"Panama",
"Papua New Guinea",
"Paraguay",
"Peru",
"Philippines",
"Poland",
"Portugal",
"Qatar",
"Romania",
"Russian Federation",
"Rwanda",
"St Kitts Nevis",
"St Lucia",
"Saint Vincent the Grenadines",
"Samoa",
"San Marino",
"Sao Tome Principe",
"Saudi Arabia",
"Senegal",
"Serbia",
"Seychelles",
"Sierra Leone",
"Singapore",
"Slovakia",
"Slovenia",
"Solomon Islands",
"Somalia",
"South Africa",
"South Sudan",
"Spain",
"Sri Lanka",
"Sudan",
"Suriname",
"Swaziland",
"Sweden",
"Switzerland",
"Syria",
"Taiwan",
"Tajikistan",
"Tanzania",
"Thailand",
"Togo",
"Tonga",
"Trinidad Tobago",
"Tunisia",
"Turkey",
"Turkmenistan",
"Tuvalu",
"Uganda",
"Ukraine",
"United Arab Emirates",
"United Kingdom",
"United States",
"Uruguay",
"Uzbekistan",
"Vanuatu",
"Vatican City",
"Venezuela",
"Vietnam",
"Yemen",
"Zambia",
"Zimbabwe"
};
for (int i = 0; i< countries.length; i++){
               v.addElement(countries[i]);        
          
        }
}
  
  
 private void setModel(DefaultComboBoxModel mdl, String str){
     combo.setModel(mdl);
     combo.setSelectedIndex(-1);
     tf.setText(str);
     
 } 
  
 
private static DefaultComboBoxModel getSuggestedModel(List<String> list, String text) {
    DefaultComboBoxModel m = new DefaultComboBoxModel();
    for (String s: list) {
        if (s.startsWith(text)){
        m.addElement((s));
    }
    }
    
    return m;
}
void autoSuggest(){
    combo.setEditable(true);
    tf = (JTextField) combo.getEditor().getEditorComponent();
  tf.addKeyListener(new KeyListener() {
      @Override
      public void keyTyped(KeyEvent e){
       EventQueue.invokeLater(new Runnable() {
          @Override
          public void run() {
             String text = tf.getText();
             if (text.length()==0) {
                 combo.hidePopup();
                 setModel(new DefaultComboBoxModel(v), text);
          }else{
                 DefaultComboBoxModel m = getSuggestedModel(v, text);
                  if (m.getSize()==0 || hide_Flag) {
                      combo.hidePopup();
                      hide_Flag=false;
                  }else{
                      setModel(m, text);
                      combo.showPopup();
                  }     
             }
          }
       });
      }
        @Override
        public void keyPressed(KeyEvent e) {
            String text = tf.getText();
            int code = e.getKeyCode();
            
            if(code==KeyEvent.VK_ENTER){
              if(v.contains(text)){
                  v.addElement(text);
                  Collections.sort(v);
                  setModel(getSuggestedModel(v, text), text);
              }
              hide_Flag = true;
                
            }else if(code==KeyEvent.VK_ESCAPE){
                hide_Flag = true;
            }else if(code==KeyEvent.VK_RIGHT) {
              for (int i = 0; i< v.size(); i++){
              String str = v.elementAt(i);
                  if(str.startsWith(text)){
                      combo.setSelectedIndex(-1);
                      tf.setText(str);
                      return;
                  }
              }
          }} 
            
        
        @Override
        public void keyReleased(KeyEvent e) {
        }
      
  });
    
}
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {
        combo = new javax.swing.JComboBox<>();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(129, 129, 129)
                .addComponent(combo, javax.swing.GroupLayout.PREFERRED_SIZE, 243, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(455, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(71, 71, 71)
                .addComponent(combo, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(371, Short.MAX_VALUE))
        );
        pack();
        setLocationRelativeTo(null);
    }// </editor-fold>                        
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JComboBox<String> combo;
    // End of variables declaration                   
}

2 Answers2

1

Just make the control of the values case insensitive making both in lowercase or in uppercase like this way

private static DefaultComboBoxModel getSuggestedModel(List<String> list,
String text) {
    DefaultComboBoxModel m = new DefaultComboBoxModel();
    for (String s: list) {
        if (s.toLowerCase().startsWith(text.toLowerCase())){
        m.addElement((s));
    }
    }
    
    return m;
}
Romeo Sheshi
  • 901
  • 5
  • 7
-1

I think you can use equalsIgnoreCase in your getSuggestedModel method instead of startsWith:

if (s.equalsIgnoreCase(text))

Same can be done in keyPressed method as well.

Ashish Patil
  • 4,428
  • 1
  • 15
  • 36
  • I tried this but autosuggest stopped working. Anyways i will explore more abou equalsIgonreCase. Thanks for your feedback bro. – user3305642 Aug 19 '22 at 11:09
  • sure, I shared answer because you don't need to do explicit lower case conversions. Also if I am not wrong, you need to do your change in 2 methods as I mentioned in my answer. – Ashish Patil Aug 19 '22 at 11:11
  • 1
    Thanks bro. Sure i hope i can learn a lot from experienced persons like you. – user3305642 Aug 19 '22 at 18:46