2014-10-30 5 views
0

작은 javaFX 창에 서버에 연결됩니다. 새 스레드가 연결합니다. 하지만 연결이 설정되면 창을 닫으려고합니다. 어떻게해야합니까?javafx 다른 클래스의 창 닫기

여기 제가 시도한 내용입니다.

package se.skplay.scaenicos.subWindows.casparConnection; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.stage.Stage; 
import se.skplay.scaenicos.Connections; 

public class CasparConnectonController implements Initializable { 

    @FXML private TextField hostFiled = new TextField(); 
    @FXML private TextField portFiled = new TextField(); 
    @FXML private Button cancel; 
    @FXML private Button connect; 
    @FXML private Label connecting = new Label(); 

    private int port = 5250; 
    private String host = "localhost"; 
    static private Stage stage; 

    @FXML 
    protected void connect() throws IOException { 
      if (!hostFiled.getText().equals("")) { 
       host = hostFiled.getText(); 
      } 
      if (!portFiled.getText().equals("")) { 
       port = Integer.parseInt(portFiled.getText()); 
      } 
      connecting.setText("Connecting..."); 

      stage = (Stage) connect.getScene().getWindow(); 
      Connect conCasp = new Connect(host, port); 
      conCasp.start(); 

     try { 
      if (Connections.getCaspar().isConnected()) { 
       closeWindow(); 
      } 
     } catch (NullPointerException e) { 

     } 

    } 

    private void closeWindow() { 
     stage = (Stage) connect.getScene().getWindow(); 
     stage.close(); 
    } 

    @FXML 
    protected void cancel() { 
     closeWindow(); 
    } 

    public static Stage getStage() { 
     return stage; 
    } 


    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

    } 

} 

당신의 Connect 클래스를 대신 Task<Void>의 서브 클래스 확인 서버

package se.skplay.scaenicos.subWindows.casparConnection; 

import java.io.IOException; 

import se.skplay.scaenicos.Connections; 

public class Connect extends Thread { 

    private String host; 
    private int port; 

    public Connect(String host, int port) { 
     this.host = host; 
     this.port = port; 
    } 

    public void run() { 
     try { 
      connect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void connect() throws IOException { 
     Connections.setCaspar(host, port); 
     CasparConnectonController.getStage().close(); 
    } 

} 

답변

0

에 연결 클래스 :

package se.skplay.scaenicos.subWindows.casparConnection; 

import java.io.IOException; 

import javafx.concurrent.Task ; 

import se.skplay.scaenicos.Connections; 

public class Connect extends Task<Void> { 

    private String host; 
    private int port; 

    public Connect(String host, int port) { 
     this.host = host; 
     this.port = port; 
    } 

    @Override 
    public Void call() { 
     try { 
      connect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void connect() throws IOException { 
     Connections.setCaspar(host, port); 
     // You can never close a stage from a background thread 
     // CasparConnectonController.getStage().close(); 
    } 

} 

을 그리고 당신이 무대를 닫습니다 onSucceeded 핸들러를 사용할 수 있습니다 :

@FXML 
protected void connect() throws IOException { 
     if (!hostFiled.getText().equals("")) { 
      host = hostFiled.getText(); 
     } 
     if (!portFiled.getText().equals("")) { 
      port = Integer.parseInt(portFiled.getText()); 
     } 
     connecting.setText("Connecting..."); 

     stage = (Stage) connect.getScene().getWindow(); 
     Connect conCasp = new Connect(host, port); 

     conCasp.setOnSucceeded(event -> closeWindow()); 

     new Thread(conCasp).start(); 

}