У меня проблема с моей JTable. Мой JTable отображает содержимое базы данных. Одна таблица базы данных имеет категорию имен. Каждая категория отображается в JComboBox. Если я нажму на категорию, она должна обновить содержимое таблицы.Изменение/обновление содержимого JTable с помощью JComboBox (категория)
Вот короткий код моего кода для вас, поэтому мне легче помочь. Код должен быть runable:
(TestClass - Main)
package test;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TestClass implements ActionListener{
String[] header = {"head", "head", "head"};
Object[][] data = {{Boolean.FALSE, "text", "text"}, {Boolean.FALSE, "text", "text"}, {Boolean.FALSE, "text", "text"}};
LinkedList<String> newdata = new LinkedList<String>();
String[] combolist = {"apple", "banana", "cranberry"};
JComboBox<String> combobox = new JComboBox<String>(combolist);
JTable table = new JTable(new TestTableModel(data, header));
JFrame frame = new JFrame();
JPanel panel = new JPanel(new GridLayout(1, 0, 1, 0));
public TestClass() {
combobox.addActionListener(this);
panel.add(combobox);
frame.add(panel, BorderLayout.NORTH);
frame.add(new JScrollPane(table), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
frame.pack();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == this.combobox) {
JComboBox<String> combobox = this.combobox;
newdata.add("Test1");
newdata.add("Test2");
TestTableModel model = (TestTableModel) table.getModel();
int i = 0;
for (String text : newdata) {
data[i][0] = Boolean.TRUE;
data[i][1] = text;
data[i][2] = text;
i++;
}
model.setData(data);
}
}
public static void main(String[] args) {
new TestClass();
}
}
(TestTableModel - AbstractTableModel при необходимости (вам это нужно, чтобы выполнить код)!)
package test;
import javax.swing.table.AbstractTableModel;
public class TestTableModel extends AbstractTableModel {
private static final long serialVersionUID = 5044877015250409328L;
private String[] header;
private Object[][] data;
public TestTableModel(Object[][] data, String[] header) {
this.header = header;
this.data = data;
}
public void setData(Object[][] data) {
this.data = data;
fireTableDataChanged();
}
@Override
public Class<?> getColumnClass(int column) {
if (column == 0) {
return Boolean.class;
}
return super.getColumnClass(column);
}
@Override
public int getColumnCount() {
return header.length;
}
@Override
public String getColumnName(int column) {
return header[column];
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public Object getValueAt(int row, int column) {
return data[row][column];
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 0;
}
@Override
public void setValueAt(Object value, int row, int column) {
data[row][column] = value;
}
}
С помощью этого короткого кода при изменении категории таблица замерзает. Во всем моем коде он тоже замораживается, но я могу видеть обновленную таблицу в фоновом режиме при изменении размера окна (изменение размера стола до того же размера, что и рамка). Я не знаю, почему это не на отрыве.
EDIT: Проблема с изменением содержимого была решена. Источник обновлен. Но проблема в том, чтобы получить правильный размер таблицы hasent еще не решена. Вначале я использую массив из 3 строк, а затем массив из 2 строк. Я хочу удалить старую таблицу и создать новую, поэтому размер строки правильный.
В принципе, я просто хочу обновить таблицу новым контентом.
- Благодарим за помощь!
Я не вижу таблицу классов, код не может быть компилируемым table = new JTable (новая таблица (данные, заголовок)); – mKorbel
Woops Мне жаль, что подожди минутку – Gerret
в дополнение к ответу: ваш model.setValueAt неправильно реализован, он _must_ уведомляет своих слушателей об изменении! – kleopatra