2011년 7월 9일 토요일

스윙으로 스피너 만들기(JSpinner)


위의 그림은 Object Management Group에 의해서 만들어진 모델링 기법으로 안정적인 소프트웨어를 구상하고 이에 따른 디자인 표준을 제시하기 위해 만든 것인데 우리는 이를 UML이라 부른다. 한번쯤 들어는 보았을 것이다.^^ JSpinner에 관한 UML인데 이런것도 구경(?)하라고 필자가 특별히 올려보았다.ㅎㅎ 사실 오늘 단원이랑 관련된 부분이 꽤 있으니 너무 구경만 하지는 말고 화살표가 어디로 가는지 프로그램의 흐름이 어떤지 한번쯤 생각해보면서 쭈욱 훓어보고 계속해서 본 단원을 읽기 바란다. 은근히(?) 도움이 될것이다.^^ (잘 안보이면 위의 그림을 클릭~)

오늘은 자바의 스윙으로 구현하는 스피너를 공부해 볼텐데 스피너가 뭘까? ㅎㅎ 궁금해하는 여러분들을 위해 오늘 배울 예제의 결과를 먼저 공개한다. 아래 그림을 보면 아하~ 이거였군! 이라는 탄성이 나올 것이다. 그럼 어디볼까? ^^


프로그래밍에 관심을 가지고 있는 이들이라면 누구나 한번쯤 이런 기능을 어떻게 구현할수 있을까? 라는 의문을 품을 것이다. 저거 일일히 날짜 30일이나 31일까지 배열만들고 시분초도 60 단위로 멈추게 하는 제어문 써서 알고리즘 만들고 이래야 하나? ㅎㅎ 물론 아무것도 없는 상태에서 제작한다면 그런식으로 해야될 것인데 맨상단에 올린 JSpinner 클래스에 관한 UML(Unified Modeling Language)을 보면 알수 있듯이 자바에서는 이렇게 자주 쓰이는 기본적인 기능을 필요할때 바로 불러다 쓸수 있도록 Java API에 잘 모셔놓았으니 우리는 필요할때 마음껏 쓰기만 하면 된다. 우리의 예제는 스윙으로 구현해야되는 날짜이니 SpinnerDateModel 클래스를 사용해서 위의 결과물을 뽑아낼 것이다. 한편의 드라마(?)같은 예제를 통해 스피너 클래스(JSpinner)에 대해서 습득하는 시간을 갖기 바란다.^^


오늘 새롭게 배울 스피너에 관련된 코드는 아래와 같다.

    SpinnerModel model = new SpinnerDateModel();
    JSpinner spinner = new JSpinner(model);

    JLabel label = new JLabel(" 날짜/시간 "); //날짜: 년/월/일
    JPanel panel = new JPanel();
    panel.add(label,BorderLayout.WEST);
    panel.add(spinner,BorderLayout.EAST);
    frame.add(panel);

필자의 충고(?)데로 맨상단에 있는 UML을 그래도 다시한번 관심있게 쳐다본 이들은 위의 코드 두줄이 어떤 의미인지 이해가 쏙쏙 될것이다.^^ 스피너에서 날짜를 사용하기 위해 객체생성을 하고 있는데 이런 방법으로 기본적인 바탕을 깔아놓는구나라는 정도로 알면 된다. JLabel은 스피너에 제목 붙일려고 만든 것이고 JPanel은 프레임안에 스피너 제목과 날짜 스피너를 예쁘게(?) 배치하기 위해 add( ) 메소드를 이용해서 써먹었다. 스윙을 접하다보면 BorderLayout이라는 클래스를 상당히 많이 보게되는데 이게 뭐냐면 경계선을 레이아웃하려고 있는 클래스다.ㅎㅎ 너무 설명이 부족한감? 경계선 나눠서 아이템 배치할때 도움되라고 있는 기능인데 아래의 간단한 애플릿 예제를 통해서 이 부분은 공부하면 이해가 쉽게 될것이다.



애플릿이야 필자가 따로 강좌를 한게 있으니 위의 소스를 어떻게 실행하는지 모른다면 관련 강좌를 찾아서 공부한 후에 이곳으로 다시 와서 해보기 바란다. 그림보고 소스보면 어지간하면 다 이해가 될것이다.^^ 이렇게 해서 BorderLayout도 때우는구나.ㅎㅎ

다시 예제로 돌아가서 패널에서 레이블과 스피너를 넣어주고 프레임에서 방금 준비된 패널을 넣어주면 여러분이 기대하던 결과물(?)을 위처럼 얻을수 있을 것이다. 중간중간에 강의가 삼천포(?)로 빠진 관계로 내용이 길어진 측면이 없진 않지만 그로 인해 여러분의 프로그래밍 날리쥐(?)가 상당히 향상되었으리라 기대하면서 오늘 강의는 여기서 마치겠다.^^

댓글 2개:

  1. panel.add(label,BorderLayout.WEST);
    panel.add(spinner,BorderLayout.EAST);
    이부분은 무엇을 위해 쓰는건가요?

    답글삭제
    답글
    1. 라벨은 왼쪽 스피너는 오른쪽에 배치

      삭제