Проблемы с фильтром для jList

223
28 апреля 2018, 19:07

Пытаюсь создать фильтр для jList в котором присутствуют элементы из базы данных SQLite в своих попытках и не без помощи гугла продвинулся на половину. Удалось найти метод который убирает из списка лишние слова, но когда я удаляю из jTextField всё что я в него ввел, то прежний список не возвращается, а те слова которые остались дублируются. И я догадываюсь почему так происходит, и возможно этот метод можно заставить работать в обратном направлении. Я уже много чего перепробовал, и только это дало хоть какой-то результат.

    public DefaultComboBoxModel dcb = new DefaultComboBoxModel();
    private  DefaultListModel dlm = new DefaultListModel();
    private DefaultListModel fm = new DefaultListModel();
     PreparedStatement pst;


   public void DLm(String sa){
     // Запись в jList  
                try{
    String qry = "Select * from '"+sa+"' ;";
    pst = c.prepareStatement(qry);
    ResultSet rs = pst.executeQuery();
    DefaultListModel dlm = new DefaultListModel();
    while(rs.next()){
    dlm.addElement(rs.getString("word"));
    }
    jList1.setModel(dlm);
    pst.close();
    rs.close();
}catch(Exception e){
    System.out.println(e);
}
  //Конструктор TextField
  jTextField1.addKeyListener(new KeyAdapter(){
  public void keyReleased(KeyEvent ke){
      int fl = jTextField1.getText().length();
      if(fl>jTextField1.getText().length()){
          jList1.setModel(dlm);
          filterList();
      }else{
      filterList();// Надо заставить его работать в обратную сторону.
      }
  }                 
  });

   }
   private void filterList() {
                        int start =0;
                        int it=0;
                        Set rs=new HashSet();
                        String prf = jTextField1.getText();
                        javax.swing.text.Position.Bias direction = javax.swing.text.Position.Bias.Forward;
//Это я тоже пробовал   javax.swing.text.Position.Bias direction2 = javax.swing.text.Position.Bias.Backward; 
                        for (int i=0; i<jList1.getModel().getSize(); i++){
                            it=jList1.getNextMatch(prf, start, direction);
                            try{
                            rs.add(jList1.getModel().getElementAt(it));
                            }catch(ArrayIndexOutOfBoundsException e){
                            jTextField1.setText(" ");
                            return;
                            }
                            start++;
                        }
                        Iterator itr = rs.iterator();
                        while (itr.hasNext()){
                            fm.addElement(itr.next());
                        }
                        jList1.setModel(fm);
                    }
Answer 1

Накидал пример с фильтрацией списка:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;
    public class JListExample {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new JFrame();
                    JPanel panel = new JPanel(new BorderLayout());
                    JTextField textField = new JTextField();
                    JList list = new JList();
                    MyListModel myListModel = new MyListModel("Peter", "Mike", "Gary");
                    list.setModel(myListModel);
                    textField.addKeyListener(new KeyAdapter() {
                        @Override
                        public void keyReleased(KeyEvent e) {
                            myListModel.find(textField.getText());
                        }
                    });
                    panel.add(textField, BorderLayout.NORTH);
                    panel.add(new JScrollPane(list), BorderLayout.CENTER);
                    frame.add(panel);
                    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                    frame.setSize(300, 400);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    class MyListModel extends DefaultListModel<String> {
        private List<String> original;
        public MyListModel(String... strings) {
            original = Arrays.asList(strings);
            fillList(original);
        }
        public void find(String text) {
            List<String> search = new ArrayList<>();
            if ("".equals(text)) {
                search = original;
            } else {
                search.removeAll(search);
                for (String s : original) {
                    if (s.toLowerCase().trim().contains(text.toLowerCase().trim())) {
                        search.add(s);
                    }
                }
            }
            fillList(search);
        }
        private void fillList(List<String> list) {
            removeAllElements();
            for (String s : list) {
                addElement(s);
            }
            fireContentsChanged(this, 0, list.size());
        }
    }

Чтоб Вам брать данные из БД, достаточно загрузить их в список original.

READ ALSO
Получить данные в приложении android

Получить данные в приложении android

Есть надобность получать данные, которые приходят в приложение (apk)

252
Laravel Запрос с условием

Laravel Запрос с условием

Допустим есть таблица пользователей, у которых есть два поля: месяц и год рожденияНеобходимо сделать выборку: показать пользователей в диапазоне...

168