체크박스 CheckBox

체크박스는 네모칸에 중복 체크를 할 수 있는 박스를 말한다.

 

컴퓨터가 아니더라도 무슨 양식을 작성하거나 설문 조사할 때 등에 사용한다.

 

체크박스는 웬만한 윈도우 GUI 에는 항상 포함되는 콘트롤로 프로그래머는 사용자가 때에 따라 여러개의 체크박스를 클릭할 수 있도록 윈도우를 만들어야 한다.

 

GUI 프로그래밍을 하다 보면 단순 반복하는 부분들이 좀 있다. 그런데 반복은 GUI 프로그래밍의 특징으로 프로그램의 로직이나 알고리즘 보다는 GUI의 디자인적 요소에 가깝기 때문이다.

 

학습이 좀 지루해질 수 있지만 그럴 필요는 없다. GUI 프로그래밍을 몇개를 해보면 공통점을 알 수 있다.

 

윈도우를 생성하고, 메인루프를 돌면서, 이벤트를 처리한다. 컴퓨터게임의 원리와도 별반 차이가 없다.

 

그래서 GUI 프로그램을 사용할 때 비슷한 모드가 되는 것이다. 단지 게임은 재미가 주된 목적인 차이가 있을 뿐.

 

 

다음 예제 코드는 체크박스예제이다. VBox 레이아웃을 사용했다.

 

package com;

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

public class Main extends Application  {

    Stage window;
    Scene scene;

    @Override
    public void start(Stage primaryStage) throws Exception{
        window = primaryStage;
        window.setTitle("JavaFX Layout");

        VBox vBox = new VBox(20);
        vBox.setPadding(new Insets(20));

        CheckBox box1 = new CheckBox("JAVA BOOK");
        CheckBox box2 = new CheckBox("C PLUS BOOK");
        CheckBox box3 = new CheckBox("PYTHON BOOK");
        box3.setSelected(true);

        Button submit = new Button("Order NOW!");
        submit.setOnAction(e -> handleOptions(box1, box2, box3));

        vBox.getChildren().addAll(box1, box2, box3, submit);

        scene = new Scene(vBox, 350, 200);
        window.setScene(scene);
        window.show();
    }

    private void handleOptions(CheckBox box1, CheckBox box2, CheckBox box3) {
        String msg = "User order: \n";

        if(box1.isSelected())msg += "* JAVA\n";
        if(box2.isSelected())msg += "* C PLUS\n";
        if(box3.isSelected())msg += "* PYTHON\n";

        System.out.println(msg);
    }

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

 

형식을 보면 스윙때와 큰 차이는 없다. setSelected 는 해당 컴포넌트에 체크 선택한 것을 의미한다.

 

setOnAction 의 람다식이 코드를 간결하게 한다. 코드가 길어질 것 같으면 별도의 함수를 사용한다.

 

VBox에 컴포넌트를 모두 추가한다. VBox 는 세로로 내려온다.

 

* 버튼을 클릭하면 아래 코드를 실행한다. isSelected 메서드로 true 면 클릭이 되인것이고 false 면 클릭이 안된 것이다.

 

이렇듯 체크여부가 손쉽게 확인이 가능하다. 이제 할일은 체크를 받았을 때 실제 동작을 구현하면 된다.

 

 

초이스박스 ChoiceBox

초이스박스는 체크박스와 달리 값을 하나만 선택할 수 있다. 여러개의 선택지에서 하나를 선택하는 것이다.

 

또한 드롭다운 리스트로 선택할 수 있다. 웹에 보면 라디오버튼이 있는데 그것은 화면에 다 보여주는 방식이고 드롭다운 리스트는 클릭할 때만 펼쳐지니까 공간이 절약된다. 초이스박스는 작은 창을 띄우고 여러가지 기능을 넣어야 할 때 사용한다.

 

 
드롭다운 리스트

이전부터 순서대로 실습을 했다면 소스코드는 그렇게 어렵지 않을 것이다.

package com;

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

public class Main extends Application  {

    Stage window;
    Scene scene;
    Button button;

    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("전송하기");

        ChoiceBox<String> choiceBox = new ChoiceBox<>();

        choiceBox.getItems().add("오렌지");
        choiceBox.getItems().add("사과");
        choiceBox.getItems().addAll("귤", "키위", "수박");

        choiceBox.setValue("귤");


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

        button.setOnAction(e -> getChoice(choiceBox));

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

    private void getChoice(ChoiceBox<String> choiceBox) {
        String food = choiceBox.getValue();
        System.out.println(food);
    }

}

초이스박스는 제너릭이다. 보통 화면표시를 위한 것은 문자열을 사용한다.

 

다른 부분은 위의 CheckBox 와 별반 다르지 않다.

 


* 이벤트 리스너 초이스박스

 

초이스박스의 이벤트 리스너이다.

 

아래 코드 한줄을 추가하면 리스트의 선택은 곧바로 이벤트를 발생시킨다.

choiceBox.getSelectionModel().selectedItemProperty().addListener( (v, oldValue, newValue) -> System.out.println(newValue));

전송버튼을 누르지 않아도 초이스박스의 요소를 클릭하는 자체로 이벤트를 발생시킨다.selectedItemProperty 에서 선택된 아이템을 콘솔에 출력하는 예제이다.

공유하기

facebook twitter kakaoTalk kakaostory naver band