팝업창을 새로 띄우기 위해서는 여태껏 별로 건들지 않았던 Main을 수정해야 한다.


BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("main.fxml"));


기존의 BorderPane인데 이것을 주석 처리하고 다음 코드처럼 추가해준다.


package app;
	
import javafx.application.Application;
import javafx.stage.Stage;
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 {
//			BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("main.fxml"));
//			FXMLLoader.load() <- static, 복사 ㄴㄴ
			// 기존 방식과 다르게 instance 방식을 사용, 복사 가능, 복수의 화면 사용이 가능해진다.
			// 여기부터
			FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
			BorderPane root = loader.load();
			
			/* Stage 취득방법1 (화면제어방법) - Controller에 Stage 전달
			MainController con = loader.getController();
			con.setStage(primaryStage);
			*/
			
			// 여기까지 추가
			
			Scene scene = new Scene(root,200,200); // 창 크기는 마음대로
			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을 씬 빌더로 열어 다음과 같이 수정한다.


Stage를 받는 방법이 두가지가 있는데 주석 부분을 통해서 확인해보자. (2번째 방법은 Controller 클래스에서)


다음으로 씬 빌더를 열어 fxml 파일을 수정하자







Border Pane Center에 Pane을 올리고


버튼 하나 추가


버튼의 코드는 사진과 같이 설정





이번에는 FXML 파일을 하나 더 추가하여 그걸 팝업으로 띄운다.


추가하는 방법은 다음과 같다.





사진 순서대로 따라서 진행하고 


마지막 화면에서


Source folder는 저장될 경로


Package는 소스 폴더 안의 파일을 만들 패키지


Name은 파일 이름


Root Element는 디자인 할 때 어떤 Pane을 사용할건지 정한다.


Dynamic Root는 생략


Finish를 눌러 생성하고 Scene Builder로 열어서 수정 (필자는 popup이라고 이름을 설정)






popup.fxml을 다음과 같이 배치


HBox - Layout size pref 를 200, 40


Label - Layout size pref 를 200, 40


  - Properties를 아래로 내리면 CSS를 수정할 수 있는데 첫번째 스타일을 캡쳐와 같이 수정


컨트롤러 클래스는 따로 기능을 넣지 않으므로 설정하지 않아도 된다.


원래 CSS는 다루지 않지만 이번에만 색깔 입히는식으로 해보자.


다음으로는 처음 수정한 fxml 파일의 컨트롤러 클래스이다.


컨트롤러에서는 버튼을 눌렀을때 팝업창이 뜨게끔 하고 다른 곳을 눌렀을때 사라지는 설정을 추가한다.


특히 Stage의 정보를 얻는 방법 2번째가 나오니 주의깊게 보자.



package app;

import java.io.IOException;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.stage.Popup;
import javafx.stage.Stage;

public class MainController {
	private Stage Stage;
	@FXML private Button btn;
	
	/* Main에서 Stage 가져오는 방법
	public void setStage(Stage Stage) {
		this.Stage = Stage;
	}
	*/
	
	public void popUp() {
		/* Stage 취득방법2 - Control로 부터 소속 스테이지 취득
		 * 여기서는 버튼을 통해서
		 */
		Stage = (Stage)btn.getScene().getWindow();
		
		
		// 팝업 객체
		Popup pop = new Popup(); // 투명한 틀을 하나 선언한다고 이해하면 된다.
		
		// 레이아웃 생성(팝업)
		try {
			// 아래 코드를 입력하면 try catch문이 필요하다고 나온다.
			Parent root = FXMLLoader.load(getClass().getResource("popup.fxml")); // 저번에 설명한 경로 땡겨오기
			
			// 팝업 객체에 레이아웃 추가
			pop.getContent().add(root);
			pop.setAutoHide(true); // 포커스 이동시 창 숨김
			
			// 팝업 객체에서 스테이지를 보여줌
			pop.show(Stage);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}
}




'JavaFX > 01.Node 추가' 카테고리의 다른 글

[JAVA FX]01-18.여러가지 레이아웃 전환 방법  (2) 2018.09.12
[JAVA FX]01-17.Popup 띄우기2 (방법2)  (0) 2018.09.12
[JAVA FX]01-15.AudioPlayer  (0) 2018.09.12
[JAVA FX]01-14.Media Player  (0) 2018.09.11
[JAVA FX]01-13.BarChart  (0) 2018.09.11

+ Recent posts