본문 바로가기

JavaFX

[JavaFX] JavaFX Scene Builder FXML button 사용

Button ID추가 및 버튼 이벤트 호출 방법

 

JavaFX에서 scene builder xml로 만든 UI를 javafx에서 사용하기

javafx에서 버튼을 생성하는 방법은 총 세가지가 있는 듯 하다

 

첫째, javafx에서 Button객체를 생성하는 방법

둘째, fxml을 FXMLLoader로 로드해서 Button을 컨트롤 하는 방법

셋째, fxml을 FXMLLoader로 로드해서 javafx에서 생성한 객체를 추가하는 방법

 

 

 

javafx에서 Button객체를 직접 생성하고 추가하는 방법

 

BorderPane 에 Button객체를 추가해서 scene에 올린다.

 

@Override
public void start(Stage primaryStage) {
  try{
  	BorderPane pane = new BorderPane();
    pane.setTop(new Button("btn"));
    Scene scene = new Scene(pane);
    primaryStage.setScene(scene);
    primaryStage.show();
  } catch(Exception e) {
    e.printStackTrace();
  }
}

 

 

 

fxml을 FXMLLoader로 로드해서 Button 이벤트를 호출하는 방법

 

fxml파일에 button을 만들어 준 다음 button에 fx:id 값과 onAction="" 값을 넣어준다.

 AnchorPane에 fx:controller 값은 fxml을 컨트롤 할 class객체를 지정해 준다. Main 화면에 호출은 하지만 따로 controller클래스 파일을 만들어서 사용할 수도 있다.

 

<AnchorPane fx:controller="application.Main" prefHeight="200" prefWidth="200">
  <Button fx:id="btn" onAction="#clickEvt" layoutX="43" layoutY="80" prefHeight="30" prefWidth="100" text="off" />
</AnchorPane>

 

fxml 객체를 컨트롤 하려면 @FXML 어노테이션으로 Button 객체를 만들어줘야 한다.

여기서 주의할 점은 fxml의 fx:id값과 명칭을 똑같이 맞춰줘야 한다.

fx:id="btn"   == @FXML private button btn;   // btn의 이름을 똑같이 맞춰줘야 error가 발생하지 않는다.

이벤트도 @FXML어노테이션을 사용하여 사용한다.

여기서도 fxml의 onAction 값과 똑같이 해줘야 한다.

 

public class Main extends Application {
  @FXML
  private Button btn;
  
  @FXML
  public void clickEvt() {
    System.out.println("click on event");
    btn.setText("off");
  }
}

 

fxml파일을 scene에 로드하는 방법

FXMLLoader로 fxml파일을 로드한후 스테이지에 올려준다.

 

 @Override
 public void start(Stage primaryStage) {
   try{
     Parent root = FXMLLoader.load(getClass().getResource("buttonTest.fxml"));
     Scene scene = new Scene(root);
     primaryStage.setScene(scene);
     primaryStage.show();
   } catch(Exception e) {
     e.printStackTrace();
   }
 }

 

 

 

fxml을 FXMLLoader로 로드해서 javafx에서 생성한 객체를 추가하는 방법

 

FXML 을 initialize 로 초기화 하는 방법으로 fxml에 객체를 추가한다.

fxml 변수를 start 메소드에서 실행하게 되면 에러가 발생하여 initialize에서 초기화로 객체를 생성해서 추가해 줘야 할 것 같다.

아마도 내 생각에는 FXML의 객체들은 @FXML어노테이션을 사용한 메소드나 이벤트를 통해서만 컨트롤이 가능한 것 같은데 정확히는 모르겠다.

 

@FXML
private Pane pane;

@FXML
private void initialize() {
  Button btn = new Button("버튼");
  pane.getChildren().add(btn);
}

@Override
public void start(Stage primaryStage) {
  Parent root = FXMLLoader.load(getClass().getResource("button.fxml");
  Scene scene = new Scene(root);
  primaryStage.setScene(scene);
  primaryStage.show();
}

 

 

버튼 이벤트 호출 방법

 

JavaFX에서는 컨트롤러가 이벤트를 직접 처리하지 않고 이벤트 발생 시 이벤트 핸들러에게 이벤트 처리를 위임하는 위임방식을 사용한다.

Button 이벤트가 발생 시 ActionEvent 가 발생하고 Button에 등록된 EventHandler 가 이 이벤트를 처리하는 순서이다.

initialize에서 객체를 만들고 setOnAction이벤트를 추가하였다.

btn 버튼을 사용자가 클릭하면 ActionEvent 가 발생하고 handler에서 이벤트를 처리한다.

 

@FXML
private void initialize() {
  Button btn = new Button("버튼");
  btn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
      System.out.println("JavaFX Button Event");
    }
  }
}

 

 

FXMLFXML