JavaFX 의 객체를 사용해서 메뉴를 쉽게 만들 수 있다.

 

아래는 윈도우10에서 실행한 모습이다.

 

일단 아무 디자인적 요소를 추가하지 않아도 기본 창이 깨끗해서 마음에 든다.

 

여기에 CSS적 요소를 더하면 더 좋은 그래픽 유저 인터페이스가 될 것 같다. (GUI)

 

모든 프로그램이 그렇지만 보기가 좋아야 쓸만한 기분이 나는 것이다.

 

윈도우 초창기에는 참 투박한 창들을 많이 봤는데 이제는 좀 볼만해지는 것 같다.

 

2D 인터페이스와 터치 기술이 언제까지 갈지는 모르겠지만 좋은 시대에 살고 있는 것 같다.

 

메뉴 아이템을 추가하는 것은 쉽다.

 

자바FX의 기본 틀인 start 메소드에서 시작한다. 이것은 기본이니까 자신만의 템플릿을 만들어 놓는게 좋다. 코드 정리가 귀찮다면 Scene Builder 를 사용하는 것도 좋고 인텔리제이에서도 기본 코드를 생성해 주니까 사용에 어려움이 없을 것이다.

 

public void start(Stage primaryStage)

 

우선 첫번째 메뉴를 추가해보자. 자바의 AWT나 스윙을 해봤다면 어렵지 않게 추가할 수 있을 것이다. 메뉴에 해당하는 클래스를 생성하고 메뉴아래에 메뉴 아이템을 붙인다. 그리고 메뉴 아이템에 액션 리스너를 정의한 후 레이아웃에 추가하면 된다. 이번 포스팅에서는 BorderPane 레이아웃을 사용했다.

 

코드는 메뉴아이템을 나열하는 식으로 작성하면 순서대로 추가가 된다. 분리선을 Separator 라 하는데 이것도 메서드로 쉽게 추가가 된다.

 

액션리스너에 sout 을 사용했는데 이는 실제 프로그램에 적용할 동작을 구현하는 곳이다. 콘솔 출력을 사용하는 이유는 프로그램이 제대로된 순서에 따라 동작하고 있는지 확인하기 위해서이다. 어떤 동작을 넣는 것도 프로그래머의 자유다. 여러개의 메뉴가 있지만 동작을 설정하려면 각각 구현해줘야 한다. 예시를 위한 코드라는 것을 감안하고 보며된다.

 

위에 메뉴들이 보통 우리가 텍스트 편집기나 프로그램을 열었을 때 나오는 보통의 메뉴일 것이다. 뭔가 그럴듯하게 보이려고 만들었다. 

 

* 다음은 메뉴에서 alt + 키조합을 사용한 키보드 사용법이다.

 

이는 영문 만들면 사용할 수 있다. 아래와 같이 메뉴이름 앞에 _를 붙이면 alt 와 함께 키보드 바로가기를 사용할 수 있다.

 

창을 실행하고 alt 키를 쿨러 키보드 바로가기를 활성화를 시킨다. S 키를 누르면 ShortCut 메뉴가 활성화되고 거기서 T를 입력하면 Test 메뉴가 실행이 된다. _ 밑줄이 붙어있기 때문이 실행된 것이다.

한편 disabled 된 메뉴아이템이 보이는데 아이템의 메서드로 상태조절이 가능하다. 메서드는 자기 자신을 설명할 만큼 어렵지 않다. setDisable(true) 비활성화(참) 이란 말과 똑같은 것이다. 영어를 열심히 공부하면 이정도는 어렵지 않다. 

 

 

* 다음은 체크 메뉴의 사용이다. 체크 메뉴는 한번 클릭하면 상태가 선택으로 고정되는 속성이 있다. 웹브라우저에서 체크박스, 라디오박스가 그렇듯이 체크 메뉴는 여러개를 선택할 수 있고 라디오 메뉴는 한가지만 선택할 수 있다. 라디오 메뉴는 ToggleGroup 을 설정해야 하는 차이점이 있긴 한데 이것도 그냥 new 로 구현하면 되는 거라서 특별한 설명이 필요는 없을 것 같다.

 

체크 메뉴 여러가지 선택가능

 

라디오 메뉴: 한 가지만 선택된다, 토글그룹 클래스사용

 

 

 

 

* 전체 소스코드를 첨부한다.

package com;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Main extends Application {

    Stage window;
    BorderPane layout;

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

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

        // 파일 메뉴
        Menu fileMenu = new Menu("파일");

        // 메뉴 아이템
        MenuItem newFile = new MenuItem("새파일...");
        newFile.setOnAction( e -> System.out.println("Create a new file..."));
        fileMenu.getItems().add(newFile);

        fileMenu.getItems().add(new MenuItem("열기..."));
        fileMenu.getItems().add(new MenuItem("저장..."));
        fileMenu.getItems().add(new SeparatorMenuItem());
        fileMenu.getItems().add(new MenuItem("설정..."));
        fileMenu.getItems().add(new SeparatorMenuItem());
        fileMenu.getItems().add(new MenuItem("종료"));

        // 단축키 사용법
        Menu shortCutMenu = new Menu("_ShortCut");

        MenuItem shortcut = new MenuItem("_Test");
        shortcut.setOnAction( e -> System.out.println("Short Cut [Alt + S]"));
        shortCutMenu.getItems().add(shortcut);

        // 비활성화 시키기
        MenuItem diabledItem = new MenuItem("Disabled");
        shortCutMenu.getItems().add(diabledItem);
        diabledItem.setDisable(true);

        // 체크메뉴 ON AND OFF
        Menu help = new Menu("도움말");

        CheckMenuItem showLines = new CheckMenuItem("라인 번호 표시");
        showLines.setOnAction(e -> {
            if(showLines.isSelected()){
                System.out.println("라인 번호를 표시합니다");
            } else{
                System.out.println("라인 번호를 숨깁니다");
            }
        });
        CheckMenuItem autoSave = new CheckMenuItem("자동 저장 사용");
        autoSave.setSelected(true);
        help.getItems().add(showLines);
        help.getItems().add(autoSave);


        // 라디오 메뉴 아이템
        Menu level = new Menu("난이도");
        ToggleGroup levelToggle = new ToggleGroup();

        RadioMenuItem easy = new RadioMenuItem("쉬움");
        RadioMenuItem middle = new RadioMenuItem("중간");
        RadioMenuItem hard = new RadioMenuItem("어려움");

        easy.setToggleGroup(levelToggle);
        middle.setToggleGroup(levelToggle);
        hard.setToggleGroup(levelToggle);

        level.getItems().addAll(easy,middle,hard);


       // MenuBar
        MenuBar menuBar = new MenuBar();
        menuBar.getMenus().addAll(fileMenu, shortCutMenu, help, level);

        layout = new BorderPane();
        layout.setTop(menuBar);

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

}

공유하기

facebook twitter kakaoTalk kakaostory naver band