Java: нужно получить строку ввода в графическом интерфейсе, работает только в консоли - PullRequest
2 голосов
/ 17 января 2012

Мои друзья и я написали программу на 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 и должно выполняться до нее. Я не понимаю, лол.

Ответы [ 2 ]

0 голосов
/ 18 января 2012

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

Было предыдущее обсуждение с кем-то, кто пытался сделать что-то подобное здесь: Может ли Java видеть активность моей клавиатуры?

и оттуда я смог добраться достатья с низким уровнем реализации хука: http://ksquared.de/blog/2011/07/java-global-system-hook/

0 голосов
/ 17 января 2012

I wrote a class that works in the console, but when run through the GUI it just hangs until I alt+tab and click inside the IDE's (Eclipse's) console and swipe the card.

Это заставляет меня подозревать, что вы запускаете код внутри Eclipse. Когда вы «тестируете» код внутри IDE, Eclipse в основном эмулирует консоль, поэтому вам нужно использовать представление консоли в IDE.

При нормальном запуске приложения (т. Е. Не из среды IDE) реальная консоль должна оставаться открытой за пользовательским интерфейсом. Я лично не тестировал чтение с консоли при запуске приложения Swing, но оно должно работать.

...