2013-02-22 3 views
1

다른 클래스에서 JavaFX GUI 응용 프로그램을 시작하고 있습니다 (즉, StartClient). 다른 스레드에서 JavaFX 액세스 GUI 버튼 동작

public class StartClient extends Application { 

private Table gui; 

@Override 
public void start(Stage stage) throws Exception { 
    gui = new Table(); 
    gui.start(stage); 

는 I 내가 Platform.runLater를 사용하여 GUI에서 설정 서버에 의해 할당 된 교대하는 서버에 연결하고받는 통해 Task 시작.
if(networkClientID == gui.getState().getTurn()){ 
    do { 
     action = Table.getAction(); //static getAction returns the move from the table if there was one 
    } while (action == -1); 

    outputStream.writeObject(action + ""); // write out turn 
} 

내가 할 수행 내 문제는 내가 그것을 자신의 차례 인 경우 플레이어에 의해 이동을 얻을이 같은 일을하고 다시 서버로 보낼 것인지 무엇

Task<Void> task = new Task<Void>() { 
    @Override 
    protected Void call() throws Exception { 
     connectToServer(); // connect to server, set up socket, i/o streams 
     Object read = inputStream.readObject(); 

     if (read instanceof String) { 
      turn = //parseInt from read 
      Platform.runLater(new Runnable() { 
       public void run() { 
        gui.setPlayerID(turn); 
       } 
      }); 
     } 
    } 
}; //end of task 

이 배경에 Thread (내가 GUI에서 정적 변수를 읽고 오전 또는 내가 javaFX 스레드 즉 Platform.runLater 안에 그것을해야합니까, 나는 그것을 시도했지만 어디서나, 내 프로그램이 붙어지고있다.)

어떤 제안, h elp,이 문제를 해결하는 방법을 환영합니다. 감사!

답변

1

IMHO이 작업을 수행하는 가장 좋은 방법은 데이터를 별도의 클래스로 만드는 것입니다 (예 : 전환).

기억 JavaFX는 MVC 모델입니다. Model 클래스를 사용하여이 정보를 유지하고이 정보를 참조 할 수 있습니다. 모델 클래스에 대한 참조를 다른 스레드에 전달하는 경우이 스레드를 동기화해야합니다.

이렇게하면 별도의 작업을 수행 할 수 있습니다. 컨트롤러는 장면이하는 일만 제어합니다. 모델에 정보가 저장됩니다.

This answer은이를 구현하는 방법과 관련하여 매우 좋은 출발점을 제공합니다.

예를 들어 나는 작업 (파일 감시자)이 있으며 아래에 표시된대로 호출합니다. 내 컨트롤러의 간단한 스냅 샷은 다음과 같습니다.

public class myController { 
    private Context context; 
    private Executor executor; 

    ... 

    myBtn.setOnAction(new EventHandler<ActionEvent>() { 
     public void handle(ActionEvent event) { 
      task = new ResultFileWatcher(context); //context is my singleton model class 
      executor.execute(task); 
     } 
    } 

    ... 

} 

그리고 클래스를 확장하는 클래스는 이와 유사합니다. 여기에 내 Task (이것은 Task 클래스를 확장 함)이며 다른 Thread에서 실행됩니다.

public class ResultFileWatcher extends Task<Object> { 
    private Context context; 

    public ResultFileWatcher(Context context) { 
     this.context = context; 
    } 

    ... 

    @Override 
    protected Object call() throws Exception { 
     //... 
    } 
} 

희망이 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 이것을 줄 것이다. @ blo0p3r –

+0

FXML이 없어도 MVC 모델을 구현할 수 있습니까? 응용 프로그램을 확장하여 JavaFX GUI를 간단히 작성합니다. –

+0

ResultFileWatcher가 컨트롤러입니까? 나는 약간 혼란 스럽다. 아니면 변화를 청취하는 일뿐입니다. –

관련 문제