Как анализировать ввод данных карты с магнитной полосой в текстовом поле Java Swing?

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

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

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


person Eric A. Gravel    schedule 27.09.2011    source источник
comment
Предоставьте ссылку на API устройства и sscce, показывающий, что вы пробовали.   -  person trashgod    schedule 27.09.2011
comment
Что такое текстовое поле? Я не знаю ни одного компонента Swing с таким именем? Будьте конкретны и используйте правильное имя класса, чтобы нам не пришлось догадываться, о чем вы говорите.   -  person camickr    schedule 27.09.2011
comment
@trashgod Для MSR нет API, так как это эмулятор клавиатуры. Еще немного подумав над проблемой, после публикации я решил поставить кнопку с ActionListener, которая анализирует данные, считанные MSR. Это работает, но имеет тот недостаток, что показывает необработанные данные.   -  person Eric A. Gravel    schedule 27.09.2011
comment
Я думаю, что могу обойти эту проблему, выполнив то, что предлагали Раджив и Камикр, использовать DocumentFilter для прослушивания начального символа-стража, начать буферизацию символа и остановиться, когда вы столкнетесь с конечным часовым, и в этот момент я проанализирую данные. Для каждого буферизованного символа я заменю текст поля на пустую строку и установлю его с проанализированным идентификатором только после достижения конечного часового. это должно работать.   -  person Eric A. Gravel    schedule 27.09.2011
comment
Я понимаю. @Rajeev смог предложить подход, даже не зная конкретного API, но ссылка может помочь будущим посетителям. Не забывайте голосовать по мере роста вашей репутации.   -  person trashgod    schedule 27.09.2011


Ответы (2)


Ответ на ваш первый вопрос - установить DocumentFilter в документе текстового поля.

.. как узнать, что это конец строки данных карты, если они вводятся как отдельные символы char?

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

if str == START_CHARACTER
    then clear buffer

if str == EOL_CHARACTER
    then parse and do super.insertString

else
    append string to buffer

Опять же, логика синтаксического анализа может быть реализована с использованием спецификации данных MSR.

(MSR = считыватель магнитных полос)

person Rajeev Sreedharan    schedule 27.09.2011
comment
Раджив, это похоже на то, что я подумал, подумав еще немного об этом. Данные магнитной полосы (если они закодированы аналогично кредитной карте) имеют начальный и конечный сигнальный символ. Просто чтобы проверить это, я поместил кнопку и прикрепил ActionListener для анализа текста. Это работает, но мне просто не нравится видеть необработанные данные в поле ввода. Я знаю, что могу заменить его, как только сработает прослушиватель кнопок, но я бы предпочел даже не показывать необработанные данные. Я пытаюсь посмотреть, есть ли способ перехватить его до того, как он будет отображаться, проанализировать его и вставить в поле только часть идентификатора необработанных данных. - person Eric A. Gravel; 27.09.2011
comment
Думаю, я могу сделать так, как предложили вы и camickr, и иметь DocumentFilter, который будет искать начальный дозорный. После нахождения все последующие символы вместе с дозорным могут быть помещены в буфер до тех пор, пока не будет найден конечный дозорный. Для каждого введенного символа фильтр заменял текст поля пустыми строками. Как только конечный дозорный будет достигнут, он проанализирует данные в объект домена и отобразит в поле идентификатор, полученный из магнитной полосы. Я попробую сегодня вечером. - person Eric A. Gravel; 27.09.2011

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

person camickr    schedule 27.09.2011
comment
Спасибо, camickr, это похоже на то, что предлагал Раджив, и я начал думать, что это будет решением. Мне просто нужно будет слушать начальные и конечные символы-стражи и буферизовать данные между ними. - person Eric A. Gravel; 27.09.2011
comment
@ Эрик, на самом деле я предложил это за час до Раджива. Ваш вопрос касался захвата текста до того, как он был добавлен в текстовое поле, на которое я ответил. Я оставил синтаксический анализ на ваше усмотрение, так как не знаю формата ваших данных. - person camickr; 27.09.2011
comment
Ах! Я только что заметил, что сайт показывает их в хронологическом порядке. Я просто предположил, что первый ответ, с которым я столкнулся, был первым отправленным. Мои извинения. И вы правы, мой вопрос был о том, как показать не необработанные данные, а конкретную часть данных внутри них. Что касается формата данных, то их много, так как я хотел бы найти запись в различных формах: по имени, по штрих-коду, по членскому билету с магнитной полосой или по лицензии DMV. Спасибо еще раз. - person Eric A. Gravel; 27.09.2011