2

제 친구들과 키보드/마우스가없는 터치 스크린 터미널 용 GUI로 Java로 프로그램을 작성했습니다. GUI 내에서 모든 것이 발생하며 대부분의 입력은 버튼 누름입니다. 우리는 마그네틱 카드 리더 (키보드 모드에서)를 부착하고 카드에서 읽은 다음 그 카드의 데이터를 기반으로 처리를 수행하려고합니다. Java : GUI에서 입력 라인을 가져와야하고 콘솔에서만 작동합니다.

나는 콘솔에서 작동하는 클래스를 작성하지만, GUI를 통해 실행할 때 그냥 Alt + Tab을 때까지 중단하고, IDE의 (이클립스) 콘솔 내부를 클릭하고 카드를 스 와이프합니다. 내가 뭘 찾고있는이 입력 승/O를 GUI를 떠나야하는 데 얻을 수있는 방법입니다. 당신은 단순히 어디서나 동일한 라인, TXT 문서, 콘솔, 무엇을 입력 수있는 데이터의 두 트랙을 포함하는 행을 보낼거야 keyboard--의 카드 정보를 입력 한 것처럼

는 MCR 작동합니다.

cardreadbtn.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) 
     { 
      CardRead.main(); 
     } 
    }); 

내가이되는 InputStream 일하는 것이 어쩌면 생각했지만, 난 정말 함께 일한 적이 :

GUI의
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 */ 
    } 
}  

코드는 단순히 다음과 같이

관련 코드는 그들. 다음과 같이 내가 IOUtils에 대한 제안을 통합하는 시도 : 검색 좀이 thread을 발견

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); 

내가 그 권리를하고있어 경우 모르겠지만, 콘솔에서 (에 시도하지 않은 GUI), 이제는 "스캔 카드"라고 말하며 raw_card_data를 인쇄하거나 다른 작업을 수행하지 않습니다. "closeQuietly"나는 here:

에서 가져온 ...하지만 내가 바로 그 일을하고있어 경우 다시, 나는 몰라. 아파치 IOUtils도 사용하지 않았습니다.

그래서 나는 갇혀 있고, 나는 너희들을 찾고있다. GUI에서이 카드 데이터를 가져 와서 어떻게 할 수 있습니까?

중요 사항 : 카드 데이터가 작동하지 않습니다 Scanner.next 같은 변수 (우리가 보존해야하는) 그 공백의 #, 그래서 아무것도()가 있습니다. 카드 판독기는 구분 기호와 캐리지 리턴으로 구분 된 두 트랙이있는 행을 보내도록 설정되어 있으므로 .nextLine()이 작동합니다. 카드 데이터는 가변 바이트 수/문자이기도합니다.

기타 : 첫 번째 코드 블록에서 System.out.println이 do while 루프 앞에 있습니다. raw_card_data = read.nextLine()은 실제로 관련이 없다고 느껴져서 제외되었습니다. 왜 이렇게하는지 궁금해.) GUI에서 JTextArea로 표시하기 위해 println을 setText()로 변경하면 카드 데이터가 콘솔에 입력 된 후에 표시됩니다. do가 실행되기 전에 발생하고 그 전에 실행해야합니다. 나는 이해하지 못한다. 롤.

답변

0

내가 읽은 바에 따르면 Java는 기본적으로 집중된 Window를 제외하고 입력을 위해 키보드를 직접 모니터링하도록 허용하지 않습니다. 나는 당신이 당신의 문제를 해결할 수있는 두 가지 방법을 볼 수 있습니다. 첫 번째는 간단한 키 리스너를 애플리케이션에 추가 한 다음 입력을 스트리밍하고 처리하는 것입니다. 두 번째는 낮은 수준의 키보드 후크를 사용하는 것입니다.

누군가가 여기에 비슷한 일을하려고에 이전 논의가 있었다 : Can Java see activity of my keyboard?

거기에서 나는 낮은 수준의 후크 구현이 문서를 얻을 수있었습니다 : 나는를 실행중인 http://ksquared.de/blog/2011/07/java-global-system-hook/

+0

고마워. 키보드 후크는 제가 함께 할 것입니다,하지만 그것을 구현하는 데 도움이 필요합니다. 둘러 볼게, 또 다른 질문을 올릴거야. – electrickoolaid42

0

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.

이 날 이클립스의 내부 코드를 실행하는 의심한다. IDE 내부에서 코드를 테스트 할 때 Eclipse는 기본적으로 콘솔을 에뮬레이션하므로 IDE에서 콘솔보기를 사용해야합니다.

응용 프로그램을 정상적으로 실행할 때 (예 : IDE가 아닌 경우) 실제 콘솔은 UI 뒤에 열려 있어야합니다. 스윙 앱을 실행할 때 개인적으로 콘솔에서 읽는 것을 테스트하지는 않았지만 작동해야합니다.

+0

Eclipse 내부 코드. 나는 그것을 실행 가능한 .jar로 내 보낸다. 그리고 그 뒤에 진짜 콘솔이있다. 그러나 문제는 같다. GUI에 포커스가 있으면 카드 입력에 멈 춥니 다. Eclipse에서 테스트 할 때와 마찬가지로 콘솔에 alt + tab을 사용하고 카드를 스 와이프해야합니다. 빠른 응답 주셔서 감사합니다 :) – electrickoolaid42

+0

System.in이 콘솔의 표준 입력 스트림을 사용하기 때문에 정보를 입력하려면 실제 콘솔로 이동해야합니다. 해킹 일은 앱에 일종의 키 수신기를 추가하여 포커스를 변경할 필요가없는 것일 수 있습니다. 그렇지 않으면 키보드에서 바로 입력 스트림이 필요합니다. – aoi222

+0

맞아, 나는 원래 문제를 오해했다. 내 대답을 편집 할 수 있도록 더 나은 방법을 생각하려고합니다. – Pedantic

관련 문제