체크박스는 네모칸에 중복 체크를 할 수 있는 박스를 말한다.
컴퓨터가 아니더라도 무슨 양식을 작성하거나 설문 조사할 때 등에 사용한다.
체크박스는 웬만한 윈도우 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 면 클릭이 안된 것이다.
이렇듯 체크여부가 손쉽게 확인이 가능하다. 이제 할일은 체크를 받았을 때 실제 동작을 구현하면 된다.
초이스박스는 체크박스와 달리 값을 하나만 선택할 수 있다. 여러개의 선택지에서 하나를 선택하는 것이다.
또한 드롭다운 리스트로 선택할 수 있다. 웹에 보면 라디오버튼이 있는데 그것은 화면에 다 보여주는 방식이고 드롭다운 리스트는 클릭할 때만 펼쳐지니까 공간이 절약된다. 초이스박스는 작은 창을 띄우고 여러가지 기능을 넣어야 할 때 사용한다.
이전부터 순서대로 실습을 했다면 소스코드는 그렇게 어렵지 않을 것이다.
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 에서 선택된 아이템을 콘솔에 출력하는 예제이다.