Ниже приведен код
Код: Выделить всё
import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
public class FilterComboBox extends JComboBox {
private ArrayList entries;
public FilterComboBox(ArrayList entries) {
DefaultComboBoxModel model = (DefaultComboBoxModel) this.getModel();
model.addAll(entries);
model.insertElementAt("", 0);
model.setSelectedItem(model.getElementAt(0));
this.entries = entries;
this.setEditable(true);
final JTextField textfield = (JTextField) this.getEditor().getEditorComponent();
textfield.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
System.out.println("Filtering the elements with " + textfield.getText());
comboFilter(textfield.getText());
}
});
}
public void comboFilter(String enteredText) {
if (!this.isPopupVisible()) {
System.out.println("Showing the popup");
this.showPopup();
}
System.out.println("Filtering the elements");
ArrayList filterArray = new ArrayList();
for(String entry: this.entries){
if(entry.toLowerCase().indexOf(enteredText.toLowerCase()) >= 0){
filterArray.add(entry);
System.out.println(entry);
}
}
DefaultComboBoxModel model = (DefaultComboBoxModel) this.getModel();
model.removeAllElements();
model.addAll(filterArray);
JTextField textfield = (JTextField) this.getEditor().getEditorComponent();
textfield.setText(enteredText);
System.out.println("Filtering the elements: "+ this.isPopupVisible());
}
public static void main(String[] args) throws Exception {
ArrayList entries = new ArrayList();
entries.add("Snowboarding");
entries.add("Knitting");
entries.add("Jane");
entries.add("Pool");
entries.add("None of the above");
entries.add("Rowing");
entries.add("Kathy");
JFrame frame = new JFrame("Adventure in Nepal - Combo Filter Test");
FilterComboBox acb = new FilterComboBox(entries);
JTable table1 = new JTable();
table1.setModel(new DefaultTableModel(new Object[][] {
{"", ""}, {"", ""}},(Object[])new String[] { "Text", "Text"}) {
Class[] columnTypes = new Class[] { String.class, String.class };
boolean[] columnEditable = new boolean[] { true, true};
public Class getColumnClass(int columnIndex) {
return this.columnTypes[columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return this.columnEditable[columnIndex];
}
});
table1.setAutoCreateRowSorter(true);
TableColumnModel cm = table1.getColumnModel();
cm.getColumn(0).setCellEditor(new DefaultCellEditor(new FilterComboBox(entries)));
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table1), BorderLayout.NORTH);
p.add(acb, BorderLayout.SOUTH);
frame.setContentPane(p);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setSize(500, 500);
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
}
Основываясь на грубой отладке, я обнаружил, что model.removeAllElements(); и model. addAll(filterArray); вызывают проблему, поскольку операторы печати указывают правильную последовательность выполнения, если я их удалю. Но, конечно, это противоречит цели этого кода.
Может ли кто-нибудь помочь мне заставить это работать? Я подозреваю, что это неправильная обработка ключевых событий в поле со списком и jtable, а также внутренние события, которые срабатывают при вызове функций модели removeAllElements и addAll.
Подробнее здесь: https://stackoverflow.com/questions/789 ... e-text-typ
Мобильная версия