JTable, расширенный от AbtractTableModel, не обновляет графический интерфейс, когда я добавляю строку - PullRequest
1 голос
/ 18 января 2011

Это мой новый MyJtable

public void addWidget(Book w) {
    datalist.add(w);
    fireTableRowsInserted(datalist.size()-1, datalist.size()-1);

   }

вызывающий класс

  MyJtable tv = new MyJtable(a);
        table = new JTable(tv);
        //tv.addWidget(b3);
        JScrollPane pane2 = new JScrollPane(table);

кнопка CLICK функция

 public void actionPerformed(ActionEvent e)
   {
    MyJtable tv1 = new MyJtable();
    Book b3 = new Book ("Java nutshell-299", "Ajfdfdfdingya2") ;
    if("Add".equals(e.getActionCommand()))
  {
  JOptionPane.showMessageDialog(null,"Add button is clicked");
  tv1.addWidget(b3);
  }

когда я нажимаю кнопку, то я не вижу никакихГрафический интерфейс изменен, но если до этого звонить

tv1.addWidget(b3);

   }

, я имею в виду загрузку, то я могу видеть новую книгу, но не по нажатию кнопки

Ответы [ 4 ]

3 голосов
/ 18 января 2011

Я вижу, что вы добавляете строку в новую таблицу, которую вы только что создали в методе actionPerformed.Обычно мы используем действия для изменения / изменения уже существующих компонентов графического интерфейса.Это может быть причиной, по которой вы не видите никаких изменений в графическом интерфейсе.

Я думаю, таблица, отображаемая на панели прокрутки, создается с помощью

MyJtable tv = new MyJtable(a);
table = new JTable(tv);

Попробуйте добавить строку к table (через tv, который должен быть сначала сделан переменной экземпляра) вместо вновь созданной таблицы.

1 голос
/ 19 января 2011

Это мой новый MyJtable

Это неправильно.Таблица НЕ должна иметь метод addWidget ().

Все обновления данных должны выполняться непосредственно через TableModel.Затем TableModel уведомит таблицу о необходимости перекрасить себя при изменении данных.

Вы никогда не должны обращаться к хранилищу данных, используемому TableModel, вне самой TableModel.Я дал вам полное решение, когда вы задали другой вопрос вчера.

1 голос
/ 18 января 2011

Я думаю, что Andreas_D идентифицировал основную проблему. У вас также могут быть проблемы, потому что вы переопределяете AbstractTableModel вместо DefaultTableModel. В DefaultTableModel уже есть много методов запуска событий.

1 голос
/ 18 января 2011

Убедитесь, что вы переопределяете setValueAt в вашей конкретной реализации AbstractTableModel. Реализация по умолчанию пуста.

...