JTable со столбцом в виде JCombobox, модель которого обновляется на основе текста, введенного пользователем в компонентеJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 JTable со столбцом в виде JCombobox, модель которого обновляется на основе текста, введенного пользователем в компоненте

Сообщение Anonymous »

Мне нужен JTable, в котором есть столбец в виде JCombobox. Редактор JCombobox будет обновлен, чтобы обеспечить фильтрацию содержимого JCombobox. Я нашел несколько ответов и код для фильтрации JCombobox, он хорошо работает для поля со списком, но как только я добавляю его в столбец JTable в качестве редактора ячеек, он работает не очень хорошо.
Ниже приведен код

Код: Выделить всё

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");
}
}
В приведенном выше коде acb FilterComboBox работает, т. е. когда я печатаю в ComboBox, записи в ComboBox обновляются в зависимости от результата поиска. Поле со списком, добавленное в таблицу1, работает некорректно, т. е. когда я ввожу любую строку в столбце 1, раскрывающийся список не появляется сам по себе, а также не содержит надлежащего содержимого ( т. е. на основе результатов поиска из comboFilter).
Основываясь на грубой отладке, я обнаружил, что model.removeAllElements(); и model. addAll(filterArray); вызывают проблему, поскольку операторы печати указывают правильную последовательность выполнения, если я их удалю. Но, конечно, это противоречит цели этого кода.
Может ли кто-нибудь помочь мне заставить это работать? Я подозреваю, что это неправильная обработка ключевых событий в поле со списком и jtable, а также внутренние события, которые срабатывают при вызове функций модели removeAllElements и addAll.

Подробнее здесь: https://stackoverflow.com/questions/789 ... e-text-typ
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Jcombobox заполнен столбцом базы данных и задачей jcombobox jtextfields
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Jcombobox заполнен столбцом базы данных и задачей jcombobox jtextfields
    Anonymous » » в форуме JAVA
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Jcombobox заполнен столбцом базы данных и задачей jcombobox jtextfields
    Anonymous » » в форуме JAVA
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Очистка данных из одной JTable также удаляет другую JTable.
    Anonymous » » в форуме JAVA
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Очистка данных из одной JTable также удаляет другую JTable.
    Anonymous » » в форуме JAVA
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»