JavaFX | 주요 컨트롤러 이용 | 콤보 박스(ComboBox)


여러 항목 중 하나를 선택하는 GUI는 여러 가지가 있다. 그 대표는 “콤보 상자"이다. 이것은 javafx.scene.control 패키지 “ComboBox"라는 클래스로 되어 있다.

new ComboBox()
new ComboBox("표시 내용")

콤보 상자는 드롭 다운 메뉴처럼 항목을 표시한다. 이것은 미리 메뉴로 표시 할 내용을 설정해야 한다. new ComboBox에 표시 내용을 인수에 전달하여 그 내용을 메뉴로 표시하게 된다.

문제는 “표시 내용을 어떻게 준비 하느냐” 것이다. 이것은 javafx.collections 패키지 “ObservableList"인스턴스로 준비해야 한다.

이 인스턴스의 생성에는 여러 가지가 있지만, 가장 알기 쉬운 것은 javafx.collections 패키지 “FXCollections"클래스에 있는 메소드를 이용하는 방법이다.

ObservableList 변수 = FXCollections.observableArrayList(값1, 값2, ...);

이렇게 해서 ObservableList 인스턴스를 생성할 수 있다. 인수에는 메뉴로 표시하는 값을 제공한다. 가장 일반적인 것은 String 값을 지정하여 표시 시키는 것이다. ObservableList로 표현한다면 아래와 같다.

ObservableList<String> 변수 = FXCollections.observableArrayList(...);

이렇게 하여 인스턴스를 생성할수 있다.. 이를 new ComboBox의 인수로 넘기면 된다.

ComboBox에서 얻은 값에 대해

이렇게 설정된 값은 ComboBox가 선택이 되면, 다음과 같이 얻을 수 있다.

Object 변수 = comboBox.getValue();

getText 등이 아니라 “getValue"인 점에 주의하시기 바란다. 꺼내오는 것은 텍스트가 아니다. 선택된 개체이다. ObservableList<String>으로 데이터를 제공하는 경우에는 String가 얻어진다. 다른 예로, ObservableList<Integer>로 데이터 설정 했더라면 Integer가 얻지는 것이다.

편집 가능 설정에 대해

또한, ComboBox는 직접 텍스트를 입력할 수 있도록 설정할 수도 있다. 여기에는 “setEditable"라는 메소드를 이용합니다.

comboBox.setEditable(boolean);

이제 true로 설정하면 편집 가능하며, 메뉴를 선택할 뿐만 아니라 직접 텍스트를 입력 할 수 있다. 직접 입력의 경우 getValue에서 얻을 수있는 것은 String이다. 표시 데이터로 String 이외의 값을 설정하지 않았다면 메뉴 선택 및 텍스트 입력에서 다른 유형의 인스턴스가 getValue된다는 점에 주의하자.

아래와 같이 ComboBox 대한 간단한 사용 예제가 있다.

package com.devkuma.javafx;
 
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
 
public class App extends Application {
    Label label;
    ComboBox<String> combo;
     
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage stage) throws Exception {
        label = new Label("This is JavaFX!");
        ObservableList<String> data = FXCollections.observableArrayList("One", "Two","Three");
        combo = new ComboBox<String>(data);
        combo.setOnAction((ActionEvent)->{
            label.setText(combo.getValue());
        });
        BorderPane pane = new BorderPane();
        pane.setTop(label);
        pane.setCenter(combo);
        Scene scene = new Scene(pane, 320, 120);
        stage.setScene(scene);
        stage.show();
    }
 
}

ComboBox에서 항목을 선택하면 그것을 Label에 표시한다. ComboBox도 setOnAction에서 액션 이벤트 처리를 설정할 수 있기에 이를 이용하여 처리를 하고 있다.