2009-04-30 8 views
7

일부 이벤트는 Swing의 구성 요소에 보내야하므로 모든 사용자 생성 표준 Swing 이벤트와 마찬가지로 처리됩니다.스윙 : 이벤트를 만들고이를 구성 요소로 전달하는 방법은 무엇입니까?

기본적으로 매크로 레코더와 비슷하며 JEditorPane의 실행 프로그램입니다. 그러나 생성 된 이벤트에 대해 더 많은 제어가 필요합니다.

SO는, 내가 원하는, 내가 편집기가 가정이 보낸

  1. 캡처 모든 이벤트, 그리고 그 시점에서, 나는 ..
  2. 디스크 또는 whatver에, 목록에 저장할 수 있습니다 나중에
  3. 이상적인 상황을 해당 이벤트를 재생할 수
  4. , 사용자가 같은 것들을 포함하는 명령을 편집 할 수 있도록하는 것입니다 :
    "형 키 A, 선택 라인, 삭제, 선택, 커서 업, 라인 시작을 .. . "
+0

질문이 명확하지 않습니다. –

답변

3

표준 GUI 이벤트를 찾고 있다면 원하는 것 java.awt.Robot

자신 만의 이벤트를 정의하려면 해당 이벤트를 수신해야하는 GUI 클래스를 서브 클래스 화해야합니다. 더 나은, 그들을 위해 외부 컨트롤러를 생성), 이벤트 클래스를 정의하고, 이벤트를 디스패치한다. java.beans.EventHandler을 사용하여 디스패치하거나, ​​자신의 핸들러 클래스를 만들거나 (나는 그보다 더 유용한 것으로 나타났습니다) 또는 시스템 이벤트 대기열에 이벤트를 삽입 할 수 있습니다 (클래스를 찾을 수 없음). ... 나는 툴킷이라고 생각했다.)

그러나 나는 이들 중 아무 것도하지 않을 것입니다. 당신이 묘사하는 것 (매크로 레코더)은 일련의 어플리케이션 - 특정 액션 메시지를 생성/공급하는 컨트롤러를 사용하여 구현되어야한다 (Command 패턴을 보라).

+0

나는 당신의 명령 팁을 좋아합니다. 그러나 실제로 그것을하는 방법에 아무것도 찾을 수 없습니다. – Ayman

+0

정확히 무엇을하고 싶은지 몰라도 구체적인 조언을하는 것은 어렵습니다. 그러나 JEditorPane이 javax.swing.text.Document를 사용하여 내용을 관리하고 DocumentListener를 첨부하여이 문서에 대한 모든 변경 사항을 수신 할 수 있다고 가정합니다. Listener의 이벤트를 List에 저장하면 언제든지 해당 목록을 재생하고 변경 사항을 적용하거나 취소 할 수 있습니다. – kdgregory

+0

적어도 지금은 편집기에서 매크로를 기록하고 재생하는 간단하면서도 프로그래밍 방식이 필요합니다. 문서에 첨부 할 때의 문제점은 캐럿 이동이 문서로 전송되지 않는다는 것입니다. 따라서 GUI 구성 요소가 수신/처리 한 이벤트에 연결해야합니다.액션은 매우 적합하게 보입니다. 나는 기록 된 액션을보고 나서 레코딩/처리 된 액션을 컴포넌트로 다시 주입하는 방법을 알아야합니다. MAny 감사합니다. – Ayman

2

난 당신이 이벤트의 인스턴스를 생성하고

java.awt.EventQueue.dispatchEvent(event) 

원하는 구성 요소에 대한 이벤트의 소스를 설정 호출 할 필요가 있다고 생각합니다.

+1

EventQueue.dispatchEvent는 보호 된 인스턴스 메서드입니다. 현재 이벤트 대기열을 가져 와서 해당 메소드를 사용하도록 서브 클래스를 푸시해야한다. –

+0

대신에 postEvent()는 어떻습니까? –

+0

죄송합니다. 예, postEvent()는 올바른 답과 같습니다. –

6

분명히 할 일은 EventQueue을 가져 와서 이벤트를 게시하는 것입니다. 그러면 EDT에서 차례대로 전달 될 대기열에 이벤트가 추가됩니다.

java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event); 

누군가가 오페라와 사파리가 자신의 일을하고 신뢰할 수없는 코드에 필요한 권한을 부여하지 않는 어제 주장했다.

직접 할 방법은 Component.dispatchEvent입니다.

+0

'Component.dispatchEvent'를 사용하는 코드를 추적 해 본 적이 있는데, 실수하지 않는다면 현재 스레드에서 실제로 리스너를 호출 할 것입니까? EventQueue 스레드에서 처리기를 호출하기 때문에 'postEvent'메서드가 더 좋지 않습니까? – Jeach

+0

EDT의 구성 요소로 모든 작업을 수행해야합니다. (AWT는 스레드로부터 안전하다고 주장하지만 실제로는 그렇지 않습니다.) 물론 앞서 언급했듯이 사용 권한이 있습니다. –

관련 문제