예전에 정리한 Static을 이용해서 Stage를 선언한다면
버튼을 통해서 현재 스테이지를 불러오는 귀찮은 작업을 줄이고 쉽게 참조할 수 있고
Main, Controller 두 개의 자바 파일에서 스테이지를 공유할 수 있고
전에 스테이지를 계속 새로 만들어 메모리가 낭비되는 반면
static으로 선언하면 클래스 영역에 저장되고 다같이 사용할 수 있어 효율적이다.
먼저 프로젝트를 생성하고 src에 StageStore라고 java 클래스 파일을 하나 만든다.
package app;
import javafx.stage.Stage;
public class StageStore {
public static Stage stage = null;
}
스테이지를 Static으로 공유할거고 그 기능 외에는 사용 할 기능이 없다.
다음으로는 Main의 BorderPane과 size 변경 그리고 Static 공유 적용
package app;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.fxml.FXMLLoader;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
// Stage를 따로 class로 만들어 Static 변수로 선언하여 공용으로 사용한다.
StageStore.stage = primaryStage;
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
Scene scene = new Scene(root,200,100);
// 여기까지 변경
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
다음으로 main fxml을 열어 수정
![](https://t1.daumcdn.net/cfile/tistory/99708C425B99B63137)
Border Pane 삭제 후 Anchor Pane Layout Size (200, 100)으로 추가
AnchorPane - Code : fx:id - mainPage
Button - Code : fx:id - mainBtn
On Action - move
Label
컨트롤러 등록 후 메인 위에 띄울 서브 레이아웃을 만든다.
![](https://t1.daumcdn.net/cfile/tistory/9973BA395B99B7160F)
AnchorPane으로 생성하고 사이즈는 메인과 똑같이 (200, 100)으로 만든다.
AnchorPane - Code : fx:id - subPage
Button - Code : fx:id - subBtn
On Action - closeWin
Label
위와 같이 생성 후 컨트롤러를 연결하는데
이번에는 새로운 클래스를 만들어 컨트롤러를 새로 만들어본다.
Java class 파일로 하나 만들어서 Scene Builder에 입력해보자.
Scene Builder를 연채로 클래스를 만들면 리스트에 안나오므로 한 번 껏다 키면 해결된다.
마지막으로 main fxml 파일과 sub fxml 파일의 Anchor Pane의 색상을 변경한다.
![](https://t1.daumcdn.net/cfile/tistory/991C44385B99B54C13)
AnchorPane에 색깔을 입히는 이유는 레이아웃의 기본 색상이 투명이라
Main 위에 sub를 띄우면 다음과 같이 레이아웃이 겹쳐서 보인다.
![](https://t1.daumcdn.net/cfile/tistory/990575385B99B50611)
그러므로 레이아웃 바탕에 색깔을 입혀 아래에 있는 레이아웃을 감춰서 띄운다.
다음은 Main fxml의 컨트롤러 클래스다.
package app;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class MainController implements Initializable {
// Stage를 따로 class로 만들어 Static 변수로 선언하여 공용으로 사용한다.
private Stage stage = StageStore.stage;
@FXML private Button mainBtn;
@Override
public void initialize(URL location, ResourceBundle resources) {
System.out.println("FXML 완");
}
public void move() {
try {
// 서브페이지 불러오기
Parent sub = FXMLLoader.load(getClass().getResource("move.fxml"));
// 메인창 지정
AnchorPane root = (AnchorPane)stage.getScene().getRoot();
// 서브페이지 추가(메인 레이아웃위에 서브 레이아웃을 덮어쓴다.
root.getChildren().add(sub);
} catch (IOException e) {
System.out.println("서브페이지 오류");
}
}
}
다음은 메인 위에 띄울 sub 컨트롤러다.
package app;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
public class SubController implements Initializable{
@FXML private Button subBtn;
@FXML private AnchorPane subPage;
@Override
public void initialize(URL location, ResourceBundle resources) {
System.out.println("FXML 완");
}
public void closeWin() { // 메인 위에 띄운 레이아웃을 닫는다.
// 레이아웃을 가져 와서
// 스테이지를 가져와서 - 씬 추출 - 레이아웃 추출
AnchorPane root = (AnchorPane) StageStore.stage.getScene().getRoot();
// 올려놓은 요소를 삭제 한다.
root.getChildren().remove(subPage);
}
}