콤보박스

콤보박스의 생김새는 초이스박스(ChoiceBox)와 비슷하게 생겼다.

 

약간의 차이를 알아두면 필요에 따라 적당한 콘트롤을 선택할 수 있을 것이다.

 

예제 코드를 확인해보자. 콤포넌트의 예제를 두세가지 실습해봤다면 그리 어렵지 않게 알 수 있을 것이다.

 

블록 쌓기와 이벤트 연결의 반복이다. 한가지 까다로운 점은 이게 나중에 가면 클래스 파일이 여러개가 된다. 그 때는 객체간의 연결이 중요해진다. 객체간의 연결이 미스가 나서 뜨는 에러가 많다.

 

그리고 자바는 좀 코드가 긴 편이다. 엄격하게 객체지향의 규칙을 따라야 하기 때문에 문법이 길어진다. 때로는 C언어 보다 길다는 것은 좀 직관적이지 못하다는 말이다. 인간이 사용하는 언어와 비슷하다.

 

언어는 추상적일 수록 말수가 적어지고 핵심만 가져간다. 가십거리부터 밥상머리의 숫가락 개수까지 미주알 고주알 늘어놓다 보면 이야기의 핵심을 놓치기 마련이다.

 

직관성을 활용하려면 추상적이어야 하는데 문법에 엄격하다 보니 코드가 길어지는 것은 좀 단점으로 보인다.

 

객체간의 연결을 원활하게 하려면 결국 많이 연결해보는 수밖에 없다. 클래스 타이프를 다루는데 익숙해지면 한결 수월할 것이다.


package com;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application  {

    Stage window;
    Scene scene;
    Button button;
    ComboBox<String> comboBox;

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

    @Override
    public void start(Stage primaryStage) throws Exception{
        window = primaryStage;
        window.setTitle("Learning JavaFX");
        button = new Button("전송하기");

        comboBox = new ComboBox<>();
        comboBox.getItems().addAll(
                "기생충",
                "조커",
                "어벤저스",
                "배트맨"
        );

        comboBox.setPromptText("좋아하는 영화를 선택하세요");

        button.setOnAction(e -> printMovie());

        comboBox.setOnAction(e -> System.out.println("선택한 영화 : " + comboBox.getValue()));

        VBox layout = new VBox(20);
        layout.setPadding(new Insets(10,10,10,10));
        layout.getChildren().addAll(comboBox, button);

        scene = new Scene(layout, 300, 200);
        window.setScene(scene);
        window.show();
    }

    private void printMovie() {
        System.out.println(comboBox.getValue());
    }
}

 

메서드 바깥에 변수를 클래스의 속성(attribute) 라고 한다. 클래스 안에서 메소드간에 데이터를 공유해야할 때 바깥으로 빼면된다. 안 그러면 메서드는 하나의 지역이기 때문에 지역변수간 매개변수로 값을 전달해야 한다.

 

ComboBox 클래스를 생성하고 setPromptText에서는 초기 메시지를 설정한다. prompt 는 촉진하다는 뜻이다.

 

버튼 전송으로 이벤트를 실행할 수 있다. 하지만 콤보박스에서도 선택 자체만으로도 액션을 취할 수 있다. setOnAction 으로 메소드 이름이 같다. 이름이 같으면 유사한 기능일 가능성이 높다.

 

JAVAFX 로 프로그래밍을 하면 GUI 에서 나오는 이 반복적인 패턴에 익숙해질 것이다.

 

보여주고 (윈도우 창, 프레임)

 

사용자의 입력을 대기하며,

 

사용자가 액션을 취하면(Action)

 

이벤트처리기가 듣는다(Action Listener)

 

Action Listener 가 이벤트를 해석하고 메서드를 실행시킨다.

 

메서드 처리가 되면 다시 메인 루프로 돌아간다.

 

* GUI는 반복적인 행동의 구현이다.

 

리스트뷰

리스트뷰는 초이스박스나 콤보박스와 다르게 쭈욱 나열하는 방식이다. 오른쪽에는 스크롤바가 있어서 화면밖의 리스트로 이동할 수 있다. 초이스박스와 콤보박스는 한개의 칸으로 많은 데이터를 보여주기 위해 드롭다운메뉴를 사용했다.

 

반면 리스트뷰는 넓게 보여주는 콘트롤이다. 멀티 초이스(위 사진의 파란색 부분)가 가능하다. Shift 와 Ctrl 키를 사용한다.

 

package com;

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    Stage window;
    Scene scene;
    Button button;
    ListView<String> listView;

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("Learning JavaFX");
        button = new Button("전송하기");

        listView = new ListView<>();
        listView.getItems().addAll(
                "돈까스",
                "쌀국수",
                "닭갈비",
                "칼국수",
                "떡갈비",
                "김치찌개",
                "불고기",
                "짜장면",
                "짬뽕"
        );
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        button.setOnAction(e -> buttonClicked());

        VBox layout = new VBox(20);
        layout.setPadding(new Insets(10,10,10,10));
        layout.getChildren().addAll(listView, button);

        scene = new Scene(layout, 250, 200);
        window.setScene(scene);
        window.show();
    }
    private void buttonClicked() {
        String msg = "";
        ObservableList<String> menus;
        menus = listView.getSelectionModel().getSelectedItems();

        for(String m: menus){
            msg += m + " ";
        }
        System.out.println(msg);
    }
}

 

 

아이템을 추가하는 방법은 같다.

 

GUI 컴포넌트들이 다 비슷한 그룹에 들어있기 때문에 같은 다른 클래스로 같은 메서드 처럼 사용가능 한 것이다.

 

리스트뷰의 특징인 멀티 셀렉션이 가능할려면 위의 사각 박스안의 코드가 필요하다.

 

 

 

연결된 메소드는 위와 같다. ObservableList 라는 제너릭이 나오는데 콜렉션 프레임워크 같은 성격에 JavaFX의 클래스형에 특화되어 있다. 메소드에 대하여 아직 완벽하게 이해할 필요는 없다. 우선은 어떤 동작이 가능한지 확인한다.

 

여기서는 리스트의 값을 문자열로 다루기 위해서 사용되었다.

공유하기

facebook twitter kakaoTalk kakaostory naver band