JAVA Swing MVC model

MVC(Model/View/Control)는 Xerox에서 개발된 사용자 인터페이스를 개발하는데 사용되는 패턴이다.


  • A model that represents the data for the application.
  • The view that is the visual representation of that data.
  • A controller that takes user input on the view and translates that to changes in the model.

Model은 View로 표현되어서 사용자에게 보여지고, View를 통한 사용자의 입력등은 Control등으로 들어와서 제어가능한 표현으로 바뀌여지고 Model로 영향을 주게 된다.(화살표방향)

이러한 MVC모델은 많은 사용자 인터페이스 개발에 쓰이고 있다.
스윙도 기본적으로는 MVC모델을 따르고 있지만, 스윙을 개발하면서 MVC모델을 그대로 적용하기에는 실제적인 어려움이 많아. 조금 변형한 모델을 개발하게 된다. 
(모델 개발에 관련해 더 자세한 내용은 여기 참고)

Model과 UI delegate(View + Control)로 나뉜다.



 
여기서 UI Manager는 실행중인 UI클래스를 변경가능하게 함으로써 스윙의 Plugger Look & Feel을 지원한다. 

JButton의 구조도 이런 구조를 채택하고 있다. 아래 자세한 그림을 살펴보자.(상속관계 화살표가 없어서 못그림.ㅠㅠ)
JComponent를 상속받은 JButton을 Model부분과 UI부분으로 나누어 표현해보았다. 
버튼을 기존 방식에서 조금 다른 방식으로 바꾸어보고 싶다면,
Model부분에서는 DefaultButtonModel대신 다른 클래스를 구현해서 setModel()메서드를 이용하여 바꿔달아주면 된다.
UI부분에서는 BasicButtonUI부분을 다른 클래스로 구현 후 setUI()메서드를 이용해서 바꿔 달아주면 된다. 

예제를 살펴보자. 클릭하는 횟수에 따라 색깔이 변하는 버튼을 만들어보자. 
기본적인 버튼의 UI등은 그대로 사용하고, 클릭에 따라서, 버튼의 배경색만 변화하도록 설정만 해주면된다. 

버튼의 기본적인 조작기록과 data는 Model에 존재한다. 따라서,기존의 DefaultButtonModel을 상속받은 CountButton클래스를 구현한다. 
그리고 구현한 모델을 JComponent의 setModel()를 이용하여 모델을 바꿔 달아준다.

CountButtonModel.java
  1. import java.awt.*;
  2. import javax.swing.*;
  3.  
  4. public class CountButtonModel extends DefaultButtonModel {
  5.     private int count;
  6.     private JButton btn;
  7.    
  8.     public CountButtonModel(JButton btn){
  9.         this.btn=btn;
  10.         btn.setModel(this);
  11.     }
  12.    
  13.     public void setPressed(boolean b){
  14.         if(b){
  15.             count = ++count % 4;
  16.             switch(count){
  17.             case 0:
  18.                 btn.setBackground(Color.lightGray);
  19.                 break;
  20.             case 1:
  21.                 btn.setBackground(Color.green);
  22.                 break;
  23.             case 2:
  24.                 btn.setBackground(Color.red);
  25.                 break;
  26.             case 3:
  27.                 btn.setBackground(Color.pink);
  28.             }
  29.         }
  30.     }
  31.  
  32. }

ButtonModelTest.java

  1.  
  2. import javax.swing.*;
  3. public class ButtonModelTest extends JFrame{
  4.     JButton ok;
  5.    
  6.     public ButtonModelTest(){
  7.         super("Button Model Test");
  8.         ok=new JButton("OK");
  9.         CountButtonModel model = new CountButtonModel(ok);
  10.        
  11.         getContentPane().add("North",ok);
  12.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13.         setSize(400,300);
  14.         setVisible(true);
  15.     }
  16.     public static void main(String[] args) {
  17.         new ButtonModelTest();
  18.  
  19.     }
  20.  
  21. }

JButton을 제외하고 전혀 다른 컴포넌트를 개발하고 싶다면, JComponent를 상속받아 마찬가지로 Model의 기본적인 속성을 가진 interface를 만들고 그것을 상속받은 클래스를 구현하면 된다. UI 부분도 마찬가지로 ComponentUI를 상속받은 UI클래스를 구현하면 된다. 



Reference site:http://www.javastudy.co.kr/docs/b612/swing/mvc.html
MVC model에 대한 더 자세한 이야기 : http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html

댓글

이 블로그의 인기 게시물

[Win32 API] WINAPI - 함수호출규약

JAVA Frame Icon setting

JAVA Spinner