예전에 정리한 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을 열어 수정
Border Pane 삭제 후 Anchor Pane Layout Size (200, 100)으로 추가
AnchorPane - Code : fx:id - mainPage
Button - Code : fx:id - mainBtn
On Action - move
Label
컨트롤러 등록 후 메인 위에 띄울 서브 레이아웃을 만든다.
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의 색상을 변경한다.
AnchorPane에 색깔을 입히는 이유는 레이아웃의 기본 색상이 투명이라
Main 위에 sub를 띄우면 다음과 같이 레이아웃이 겹쳐서 보인다.
그러므로 레이아웃 바탕에 색깔을 입혀 아래에 있는 레이아웃을 감춰서 띄운다.
다음은 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);
}
}