Мои друзья и я написали программу на Java с графическим интерфейсом, созданную для сенсорных терминалов без клавиатуры / мыши. Все происходит в графическом интерфейсе, и большая часть ввода - это нажатия кнопок. Мы хотим подключить устройство чтения магнитных карт (в режиме клавиатуры) и прочитать данные с карты, а затем выполнить обработку на основе данных с нее.
Я написал класс, который работает в консоли, но при запуске через GUI он просто зависает, пока я не нажму alt + tab и не щелкну внутри консоли IDE (Eclipse) и проведу по карте. То, что я ищу, это способ получить этот ввод без необходимости выходить из графического интерфейса.
MCR работает так, как если бы вы просто набирали информацию о карте на клавиатуре - она отправит строку, содержащую обе дорожки данных, куда бы вы не набрали одну и ту же строку: текстовый документ, консоль и т. Д.
Соответствующий код выглядит следующим образом:
import java.util.Scanner;
public class CardRead {
public static void main()
{
String raw_card_data = "";
Scanner read = new Scanner( System.in );
System.out.println("Scan card"); // changed to an outputArea.setText for GUI
raw_card_data = read.nextLine(); // works in console, not within GUI
/* insert processing here */
}
}
в графическом интерфейсе, код просто:
cardreadbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
CardRead.main();
}
});
Я думал, что, возможно, InputStream сработает, но я никогда не работал с ними. Я гуглил и нашел это
нить :
Я попытался интегрировать предложение о IOUtils следующим образом:
InputStream is = System.in;
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, null);
raw_card_data = writer.toString();
System.out.println(raw_card_data);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(writer);
Я не знаю, правильно ли я это делаю, но в консоли (еще не пробовал в графическом интерфейсе) теперь написано «Scan Card» и никогда не печатается raw_card_data или что-либо еще. "closeQuietly" я получил от здесь:
... но опять же, я не знаю, правильно ли я это делаю. Никогда не работал с apache IOUtils.
Так что я застрял и смотрю на вас, ребята. Как я могу получить данные этой карты без выхода из графического интерфейса для этого?
Важное примечание: в данных карты есть переменное число пробелов (которое мы должны сохранить), поэтому что-то вроде Scanner.next () не будет работать. Устройство чтения карт настроено на отправку строки с обоими дорожками, разделенными разделителями, а затем возврат каретки, поэтому .nextLine () работает. Данные карты также являются переменной # байтов / символов.
Кроме того: в первом блоке кода System.out.println находится перед циклом do while, в котором на самом деле находится raw_card_data = read.nextLine () (я его пропустил, потому что чувствовал, что это неактуально, но теперь я Мне любопытно, почему он это делает). Когда println изменяется на setText () для отображения на JTextArea в графическом интерфейсе, он не отображается, пока ПОСЛЕ ввода данных карты в консоль, даже если это происходит до операции do и должно выполняться до нее. Я не понимаю, лол.