2013-03-02 2 views
0

Итак, я думаю, что название - это все, что мне нужно задать здесь.Я добавляю пустую строку в JTable (реализуя AbstractTableModel). Как обновить модель в режиме реального времени?

Мой AbstractTableModel отлично работает, когда я хочу, чтобы добавить пустую строку, я использую следующий код, чтобы сделать это:

public void addRow() { 
    Object[][] oldData = data; 
    data = new Object[oldData.length + 1][3]; 

    // Copy old data to new data 
    for (int x = 0; x < oldData.length; x++) { 
     data[x] = oldData[x]; 
    } 

    // Append new row 
    data[oldData.length] = new Object[] {"", "", false}; 

    fireTableRowsInserted(data.length - 2, data.length - 1); 
} 

Теперь, так как я показываю пустую строку, я хочу, чтобы пользователь отредактируйте его, и я предполагаю, что пользователь будет. Теперь, как я могу убедиться, что данные сохраняются в моем массиве, когда пользователь вносит изменения? Или, если это невозможно, какая лучшая альтернатива?

Ok, так что я, вероятно, следует объяснить, что я хочу сделать:

enter image description here

Я загрузки содержимого из файла и отображения в виде таблицы. Теперь пользователь может добавить новые строки в таблицу при нажатии кнопки Add Row. Это добавит 1 пустую строку за клик. (На этом изображении выше пример, когда кнопка дважды нажата.

Теперь я хочу, чтобы пользователь мог редактировать ячейки, а затем, возможно, удалять некоторые строки (возможно), но при нажатии кнопки Save Database обновленные данные в таблице хранит

+0

Некоторые вопросы, чтобы уточнить, что вы хотите сделать: вы хотите сохранить * только * те строки, которые были изменены/добавлены или все таблицы? что ты уже испробовал? У вас, похоже, довольно хорошее понимание того, что вы делали до сих пор, но мне непонятно, в какой части вы точно застряли: 3 – asermax

+0

Просто используйте 'DefaultTableModel'. Вы можете использовать метод addRow (...) 'для добавления пустой строки. У DefaultTableModel также есть метод 'removeRow (...)'. – camickr

+0

@asermax Я хочу сохранить полную обновленную таблицу, означающую все в таблице после добавления/удаления. –

ответ

2

Вы можете получить лучшее понимание того, сравнивая несколько подходов:.

  • в этом example, либо фоновый поток или кнопка может добавить новую строку в таблицу фон. последовательности последовательностей потоков Runnable на EDT через invokeLater() , Это концептуально легче понять, но также легче ошибиться.

  • SwingWorker инкапсулирует последовательность доступа к общим данным. В API и tutorial показан базовый подход к обновлению модели компонента с использованием publish()/process(). Этот предпочтительный механизм является более надежным и масштабируемым.

  • В этом более продвинутых example, качели Timer шагает в Executor, который контролирует ряд SwingWorker экземпляров.

Во всех случаях таблицы остаются функциональными. Вы можете использовать любой в качестве основы для sscce.

Приложение: Не могли бы вы немного подробнее рассказать о стратегиях, которые вы предложили?

Я обновил список примеров и предложил некоторые вещи, которые нужно искать в контексте.

+0

Я не так хорош с 'Thread'. Не могли бы вы объяснить немного больше о стратегиях, которые вы предложили? –

+2

@ user2059238. Ответ предоставил ссылки на рабочие примеры, чтобы вы могли посмотреть и попробовать. – camickr

+0

Как предлагает @camickr, вы можете сравнить подходы. Я обновил ответ, чтобы включить некоторый промежуточный материал. Поскольку в первом примере используются флажки, подумайте о том, чтобы преобразовать его в 'SwingWorker'. – trashgod