Как постепенно синхронизировать JTable и графическую модель - PullRequest
1 голос
/ 07 ноября 2011

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

Мое приложение обрабатывает текст, который приходит из файла и может иметь неограниченную длину (в моем текущем примере у меня есть 8000 слов в текстовом файле).Для нового проекта текст (String) загружается, токенизируется (слова), токены записываются в модель графа и отображаются в JTable (где они могут быть помечены).График может быть сохранен в XML (и должен быть, если проект будет загружен).

Таблица состоит из 3 строк (индекс токена, текст токена, тег).

Проблема в том, что процесс записи каждого токена в модель графа занимает много времени (~ 7 минут для 8000 wds.).Поэтому мне нужно отобразить JTable до завершения этого процесса записи и сделать его доступным для тегирования.Не большая проблема: поскольку фактическая токенизация (clean & split String) быстрая, я могу отображать таблицу на основе String, а не заполнять ее из графовой модели (для токенов и tags).

Проблема заключается скорее в том, что а) процесс записи в график должен быть завершен до того, как модель может быть сохранена, и б) что мне нужно написать теги длятокены, которые могут еще не существовать (когда пользователь быстрее, чем приложение / процесс записи токенов, например, когда он выбирает тег для последнего из большого числа слов, в то время как процесс записи только начинается).Поэтому я хочу иметь возможность проверить таблицу для вновь установленных тегов как можно скорее после действия тегирования, проверить график , существует ли токен для тега, напишите тег , если это произойдет, и проверьте позже , если этого не произойдет.

Вот примерный план того, как я думал, что это можно сделать, и я быбудьте благодарны, если вы взглянули на это и дайте мне знать, видите ли вы возможность для оптимизации и / или скрытых ошибок.Позволит мне сэкономить много времени и перефакторинг позже.

Большое спасибо!

Подготовка

  1. Загрузка текста из файла
  2. Очисткаи разбить текст на токены
  3. Показать таблицу на основе очищенного и разбитого текста
  4. Начать процесс записи токенов в график (Thread) + обновить int (например, int lastWritten) с помощьюиндекс последнего записанного токена

Действие тегирования пользователем

  1. Проверьте, существует ли токен на теге на графике (через lastWritten)
    • Да : записать тег в график, отобразить тег в таблице
    • Нет : сохранить индекс токена в списке (например, taggedTokenNotWritten), отобразить тег в таблице
      • Начните новый Thread, который проверяет, были ли токены в taggedTokenNotWritten записаны.Если это так - напишите тег в токен + удалите из списка;если нет - держать в списке.Периодически запускайте Thread (например, всякий раз, когда установлен тег *? *).

Сохранить действие пользователя

  1. Проверить, завершен ли процесс токенизации + проверить, пусто ли taggedTokenNotWritten.
    • Если да - сохранить;если нет - отобразить сообщение и сохранить только после того, как указано выше.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Возможно, вы сможете использовать этот пример , который использует SwingWorker для асинхронной обработки BlockingQueue ожидающих записей в фоновом потоке.

2 голосов
/ 07 ноября 2011

не ответил на ваш вопрос

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

1) предположение, что File I/O должен быть перенаправлен на Background Task

  • Runnable#Thread

  • SwingWorker

2) вам нужно реализовать Paginations

  • для движка SQL (лучше и удобнее)

  • для JTable

3) загрузка данных из File I/O может быть приостановлена ​​(Thread#sleep(10-25)), чтобы избежать более высокой производительности процессора

4) это лучший выбор DefaultTableModel

5) проблема будет в том, что если вам нужно отобразить данные из конца файла, то вам нужно выполнить два DefaultTableModel и две отдельные фоновые задачи,

  • первый. только загрузка необходимых данных из конца файла и немедленное отображение этих данных в JTable,
  • второй. для загрузки данных во встроенную базу данных

6) что очень странно тратить время на загрузку данных ~ 7 мин. для 8000 шв. существуют (должны быть) другие проблемы (не для обсуждения, на мой взгляд)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...