2012-01-18 3 views
2

2D 다각형 및 물리 편집기를 작성 중이지만 하나의 기능은 관절의 회전 제한을 설정하는 것입니다.GUI 코드 외부에서 사용자 입력을 요청하는 경우,이 경우 GUI와 통신하려면 이벤트 또는 조치가 필요합니까?

사용자는이 기능을 사용하기 위해 제한을 수신해야하는 접합점 사이의 선을 클릭하고 드래그합니다.

선택이 유효한지를 결정하는 논리는 GUI 코드 외부에서 발생합니다.

선택이 발견되면 사용자가 제한을 입력 할 수있는 JOptionPane.showInputDialog을 팝업하고 싶습니다.

내가 직접 해보면 프로그램이 응답하지 않게되고, 스레딩 때문인 것으로 판단됩니다.

GUI가 실제 GUI 구성 요소를 필요로하지 않는 이벤트 리스너를 정의 할 수있는 방법이 있습니까?

해당 구성 요소에 대한 대상 개체에 대한 참조가 포함 된 이벤트를 보낸 다음 올바른 선택이 이루어지고 사용자 입력이 필요하다는 것을 알리고 해당 이벤트의 메서드를 통해 값을 다시 보냅니다. 대상 개체.

저는 Swing에 익숙하지 않습니다. 필자의 직감은 메인 윈도우에 ActionListener을 추가 할 수는 있지만 그 리스너를 어떻게 구체적으로 처리 할 수 ​​있는지 모른다. 에서와 같이 특정 청취자 만 처리하는 Action을 어떻게 정의해야합니까? 실제로 가능하다면 물론 가능합니다.

지금까지 난 단지 논리가 아닌 다른 방법으로 주위에 GUI 이야기 ...

편집 할 리스너를 사용했다 :이 프로그램은 운동을 응답하지 내가 result = JOptionPane.showInputDialog(this,"Enter Limit.");

전화를 그 그냥 깨뜨린거야. 심지어 텍스트 상자에 아무 것도 입력하거나 닫을 수 없습니다.

일부 스레드를 일시 중지하는 모달 대화 상자를 생성하고 비 GUI 코드의 어딘가에서 호출하는 것이 그 이유입니다. 내가해야 할 일이 있지만 다른 방법을 알기에는 너무 익숙하지 않다. ...

Edit2 : 버튼을 클릭 한 후와 같이 내가 스폰하면 아무런 문제없이 JOptionPane.showInputDialog를 사용할 수 있다는 것을 추가해야한다. 또는 팝업 메뉴 옵션을 선택하십시오. 사실 그것은 내가 작업하고있는 항목의 이름을 바꾸는 방법입니다.

하지만이 시점에서 대화 상자는 GUI 스레드 또는이 이벤트 디스패처 큐에 생성되는 것으로 가정합니다.

그러나이 문제는 표시되는 대화식 GUI 구성 요소를 사용하여 해당 이벤트를 발생시키는 문제입니다. 그러나, JOptionPane.showInputDialog를 생성하는 일종의 구성 요소는 클릭 한 단추 나 컨텍스트 메뉴와 같지만 사용자와 상호 작용하지 않고 코드 대신 사용할 수 있습니다. 는 내가 보이지 않는 버튼을 사용하여 마우스 클릭 이벤트를 에뮬레이션 할 수도 있겠죠,하지만 내가 JOptionPane.showInputDialog을 산란 산란 스레드와보다 Runnable을 시도 ... 또한

꽤 해키,하지만 그건 도움이되지 않았다. GUI 소스에서 JOptionPane을 생성하지 않으면 모든 것이 멈추고 대화 상자가 작동하지 않습니다.

+0

그래서 순서가 1) 사용자가 한 점을 클릭하고 다른 점으로 드래그합니다. 2) 모델 코드는이 두 점이 연결점을 정의하는지 확인합니다. 3) 그렇다면 UI에 숫자를 묻는 대화 상자가 표시됩니다. 4) 모델이 업데이트되고 UI가 다시 표시됩니다. 나는 그것을 정확하게 이해 했는가? UI가 반응이없는 단계는 무엇입니까? –

+0

@Russell Zahniser가 내 게시물을 업데이트했는데, 그 내용이 어느 정도 지워졌는지 모르지만, 실제로는 거기에 속하지 않는 함수 호출처럼 보일뿐입니다. – Erius

답변

1

당신의 배경 스레드가 invokeAndWait()있는 대화를 생성하는 것이 가능해야한다 :

final double[] result = new double[1]; 
SwingUtilities.invokeAndWait(new Runnable() { 
    public void run() { 
     try { 
     result[0] = Double.parseDouble(
      JOptionPane.showInputDialog("Enter value:")); 
     } catch(NumberFormatException e) { 
     result[0] = -1; 
     } 
    } 
} 
// ... do something with result[0] 

여기서는 result을 배열로 만들었으므로 최종적으로 익명 클래스에 액세스 할 수 있으며 변경할 수도 있습니다.

+0

invokeAndWait()가 작동하지 않아 이상하게 예외가 발생하여 "이벤트 디스패처 스레드에서 invokeAndWait를 호출 할 수 없습니다"라고 알려주었습니다. 그러나 invokeLater는 작동했습니다. 왜 그 코드가 Event Dispatcher 스레드의 일부로 간주되었는지, 나는 잘 모른다. 나는 Libgdx를 사용하고 있으며 glcanvas는 코드를 인자로 사용하여 응용 프로그램을 가져 와서 Swing 구성 요소에 바인딩합니다. 그럴 수도 있습니다. 어 ... 어쨌든, 고마워. – Erius

2

게시자는 게시자의 EventListenerList에 구독자가 추가되거나 다른 채널을 통해 추가되는 공용 추가/제거 수신기가 있습니다.

EventListener를 확장하는 자체 수신기 인터페이스와 이벤트를 촬영하는 함수를 만들 수 있습니다. 아래의 예는 다음과 같습니다 (

import java.util.EventObject; 

public class MyEvent extends EventObject { 
    // customer fields and methods here 
    public MyEvent(Object source) //more possible args here { 
    super(source); 
    //other things here to do what you want 
    } 
} 

지금 당신은 당신의 가입자가 MyEventListener을 구현하고 myEventOccurred를 오버라이드 (override) 할 수 있습니다 :

import java.util.EventListener; 

public interface MyEventListener extends EventListener { 
    public void myEventOccurred(MyEvent event); 
} 

당신은 다음과 같은 위의 예에서 사용자 정의 이벤트 클래스 "myEvent가"를 만들 수 있습니다 ..) 메소드.

+0

MyEventListener를 GUI에 어떻게 추가합니까? 주 창 클래스는 JFrame이며 addActionListener 메서드가 없습니다 ... – Erius

+0

게시자 (이벤트를 보내는 클래스)가 MyEventListener를 인수로 사용하는 public 추가 및 제거 메서드를 포함해야합니다. 그런 다음 게시자는 해당 수신기를 EventListenerList 유형 목록에 추가합니다. 구독자 (이벤트 발생을 청취해야하는 클래스)는 MyEventListener를 구현하고 public 추가 메서드를 통해 게시자 목록에 자신을 추가해야합니다. 게시자가 이벤트를 게시해야하는 경우 게시자는 구독자를 반복하고 각 구독자에게 이벤트를 보냅니다. – OnResolve

+0

흠, 방금 시도했지만 결국 JOptionPane.showInputDialog에 대한 직접 호출을 에뮬레이트 한 것처럼 보였습니다. 내가 여기에있는 진짜 문제는 스레드와 관련된 것입니다. 비 GUI 코드는 입력 대화 상자가 생성되고 대화 상자 자체가 사용할 수 없게되어 외부에서 응용 프로그램을 강제 종료합니다. 게임을 작성했다고 상상해보십시오. 물리학 적 통합 내부에 GUI 레이어뿐만 아니라 모든 것을 막아주는 모달 대화 상자가 생성됩니다. 그게 범인 인 것 같습니다. – Erius

2

또 다른 방법은 SwingWorker 클래스를 사용하여 GUI 디스패치 스레드를 차단하지 않고 전용 스레드에서 선택을 결정하는 논리를 실행하고 해당 콜백 메소드를 사용하여 GUI 작업 (입력 대화 상자 열기)을 실행하는 것입니다.

참조 : http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

(이 페이지는 내가 쓸 수있는 것보다 개념을 더 잘 설명이 있습니다.)

관련 문제