티스토리 뷰

들어가며

 이번 시간에는 JavaFX 에서 popup 창을 띄우는 방법을 알아보겠습니다. 

Pop up

  • PopUp이라고 하면 Window 위에 window를 띄운다고 볼 수 있겠습니다.
  • 용도로는 동적으로 입력을 받거나 메시지를 띄워줄때 등등 여러 상황에 쓰일수가 있겠습니다.\
  • 저희는 Popup 클래스를 사용할 것입니다.
  • 방법은 간단합니다. 우선 Button을 하나 만들어 보겠습니다. 

sample.fxml

<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<GridPane fx:controller="sample.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <Button text="POP UP" fx:id="popupBtn" onAction="#handlePopup"></Button>
</GridPane>
  •  onAction 이벤트 핸들러를 달아줍니다. 이제 Controller 에서 Popup을 만들어주면 되는데요. 
  •  예제코드

Conroller.java

public class Controller implements Initializable{
    @FXML
    Button popupBtn;

    Popup popup;
    TextArea textArea;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        popup = new Popup();
        textArea = new TextArea("이창은 팝업 창 입니다.");

    }
    public void handlePopup(ActionEvent event){
        if(popup.isShowing()){
            popup.hide();
        }else {
            final Window window = popupBtn.getScene().getWindow();
            popup.setWidth(100);
            popup.setHeight(300);

            final double x = window.getX()
                    + popupBtn.localToScene(0, 0).getX()
                    + popupBtn.getScene().getX()
                    ;
            final double y = window.getY()
                    + popupBtn.localToScene(0, 0).getY()
                    + popupBtn.getScene().getY()
                    + popupBtn.getHeight();

            popup.getContent().clear();
            popup.getContent().addAll(textArea);
            popup.show(window, x, y);
        }
    }
}

 

  •  initialize 메소드에서 popup 객체를 생성해주고 TextArea를 생성해줍니다. ( 뭐든 상관없습니다. TextArea를 예시로 해보겠습니다. )
  • 버튼이 눌렸을 때 handlePopup 에서 window 객체와 button의 좌표를 이용해서 popup을 띄울 위치를 구합니다. 
  • 위 계산에 따르면 버튼의 왼쪽 하단에 popup 창이 나타나게 됩니다.
  • Main 같은 경우는 그냥 sample.fxml 을 띄워 주시면 됩니다. 

Main.java

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
 

끝으로

이 글이 도움이 되었다면, Google 광고 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다!

반응형
댓글