Пытаюсь создать фильтр для 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);
}
Накидал пример с фильтрацией списка:
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.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть надобность получать данные, которые приходят в приложение (apk)
Допустим есть таблица пользователей, у которых есть два поля: месяц и год рожденияНеобходимо сделать выборку: показать пользователей в диапазоне...