Я все еще борюсь с JTable
, который должен автоматически обновляться.
Ситуация следующая:
Я создаю экземпляр MyTable
(расширяет JTable
) и задаю его в своем классе пользовательского интерфейса (MyView
). Класс MyTable
принимает класс пользовательского интерфейса и экземпляр класса, который содержит логику в качестве параметров):
...
private JPanel createTablePanel() {
tablePanel = new JPanel();
myTable = new MyTable(this,mymeth);
setMyTable(myTable);
JScrollPane scrollPane = new JScrollPane(getMyTable());
tablePanel.add(scrollPane);
return tablePanel;
}
MyTable
сам выглядит как ниже. На него установлено расширение AbstractTableModel
(MyTableModel
). Расширение TableModelListener
установлено для модели. И, наконец, расширение ListSelectionListener
установлено на SelectionModel
.
модели.
public class MyTable extends JTable implements TableModelListener
{
public MyTable(MyView myView, MyMethods mymeth)
{
AbstractTableModel tableModel = new MyTableModel(mymeth);
setModel(tableModel);
getModel().addTableModelListener(new MyTableModelListener());
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setCellSelectionEnabled(true);
getColumnModel().getSelectionModel().addListSelectionListener(new MyTableSelectionListener(this, mymeth, myView));
setPreferredScrollableViewportSize(this.getPreferredSize());
}
}
Давайте кратко рассмотрим конструктор модели.
public MyTableModel(MyMethods mymeth) {
dataObject = new MyData(mymeth);
myData = dataObject.getMyData();
colTitles = dataObject.getColTitles();
}
MyData
компилирует данные для таблицы: A Vector<Vector<Object>>
, которая состоит из трех Vector<Object>
s (данные таблицы) и String[]
(заголовки столбцов). Сами данные поступают из графа через mymeth
, экземпляр класса логики.
При каждом нажатии на таблицу столбец создается всплывающий объект (т. Е. JOptionPane
), который представляет выбор значений для 3-й строки в выбранном столбце. Пользователь выбирает значение, и оно устанавливается на модель данных . Примечание способ обновления таблицы после этого.
public MyOptionPane(int i, MyMethods mymeth, MyView myView) {
this.view = myView;
String sourceString = mymeth.getSourceString(i); // Gets a String from a
String[]. In this Array, the order is the same as in the table.
String tag = null;
tag = (String) JOptionPane.showInputDialog(this, "Choose a tag for \"" + sourceString + "\"", "String tagging" , JOptionPane.PLAIN_MESSAGE, null, myView.getTags().toArray(), myView.getTags().get(0));
mymeth.setTag(i, tag);
// This is where fireTableDataChanged() didn't work, but this did
MyTableModel model = new MyTableModel(mymeth); // New model instance
view.getMyTable().setModel(model); // reset new model to table
}
Это работает. Однако из того, что я прочитал, я могу просто позвонить fireTableDataChanged()
на модель, и таблица должна обновиться сама. Тем не менее, это не работает. Пользователь kleopatra оставил комментарий к ответу в предыдущем сообщении:
не вызывать методы fireXX модели из любого кода, внешнего по отношению к модели.
Вместо этого реализуйте модель, чтобы сделать это, когда что-то изменилось
Итак: Можно ли вообще назвать fireTableDataChanged()
внутри такой структуры? И если да, то где и как?
Заранее благодарим за все просветления!