IT/RCP

[JFace] 뷰어와 뷰어 프레임 워크

원창연 2020. 12. 26. 08:46

 

 

뷰어 프레임워크는 MVC(모델-뷰-컨트롤)로 알려진 디자인 패턴으로 구현된다.

Viewer의 하위 클래스인 ContentVier와 StructuredViewer가 있다.

 

ContentViewer는 다양한 인터페이스를 활용해서 도메인 객체 형태를 유지하면서 데이터를 다룬다. 

StructuredViewer는 ContentViewer에게 제공하는 데이터를 구조화 한다. 구조화는 필터링, 정렬 기능 같은 일반적인 작업을 실행하는 메도드들이 이 계층에서 구현된다.

 

각 위젯인 Tree, List, Table 등은 이에 맞는 Viewer의 하위 클래스로 ListViewer나 tableViewer 등이 있다.

 

ㅁ ContentViewer의 프로 바이더

   프로바이더에는 두 개가 존재한다. ContentProvider, LabelProvider

 

   ▶ LabelProvider,TableLabelProvider 보여줄 텍스트랑 이미지를 설정

   ▶ ContentProvider 레이블 프로바이더로 관여하기도 하지만 컨텐트 프로바이더로도 역할을 한다.

     레이블 프로바이더가 요소를 보이기 위한 텍스트이미지를 제공하는 반면에 컨텐츠 프로바이더는 실제적으로 요소를 보이게끔 해준다.

 

※ 내용정리 참고: https://wedul.site/70

 

JFace TreeViewer설명

Viewer Viewer는 MVC 패턴을 가지고 있다. Viewer의 하위 클래스인 ContentVier와 StructuredViewer가 있다. ContentViewer는 다양한 인터페이스를 활용해서 도메인 객체 형태를 유지하면서 데이터를 다룬다. 이들..

wedul.site

 

ㅁ TableViewer의 예제

   1) 일단 모델부터  

package com.dicws.mydays.model;

import java.util.ArrayList;
import java.util.List;

public class MyDaysModel {
	
	//모델요소
	String part;
	String title;
	String conetents;
	String writer;
	String wDate;

	//table모델시
	public MyDaysModel(String part, String title, String conetents, String writer, String wDate) {
        super();
        this.part = part;
        this.title = title;
        this.conetents = conetents;
        this.writer = writer;
        this.wDate = wDate;
    }

	/*Getter/Setter 정의*/
	public String getPart() {
		return part;
	}

	public void setPart(String part) {
		this.part = part;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getConetents() {
		return conetents;
	}

	public void setConetents(String conetents) {
		this.conetents = conetents;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getwDate() {
		return wDate;
	}

	public void setwDate(String wDate) {
		this.wDate = wDate;
	}
}

   2) 실행모듈정의 및 설명 

package com.dicws.mydays.test;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

import com.dicws.mydays.model.MyDaysModel;

public class TableSnippet extends ApplicationWindow {

	List<MyDaysModel> input = new ArrayList<MyDaysModel>();
	
	public TableSnippet() {
		super(null);
	}

	public void run() {
		// Don't return from open() until window closes
		setBlockOnOpen(true);
		// Open the main window
		open();
		// Dispose the display
		Display.getCurrent().dispose();
	}

	/**
	 * Configures the shell
	 * 
	 * @param shell
	 *            the shell
	 */
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		shell.setText("Team Tree");
	}

	/**
	 * Creates the main window's contents
	 * 
	 * @param parent
	 *            the main window
	 * @return Control
	 */
	protected Control createContents(Composite parent) {

		//table data 생성
		for (int i = 1; i < 10; i++) {
			input.add(new MyDaysModel("상환전화 i:" + i, "입금상환", "내용", "나야나1", "aa"));
		}

		TableViewer tableViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
		Table table = tableViewer.getTable();
		
		/*
		 * Header Column 생성
		 */
		String[] COLUMN_HEADER = new String[]{"타이틀","제목","내용","작성자","작성일"};
		for(String header : COLUMN_HEADER ) {
			new TableColumn(tableViewer.getTable(), SWT.NONE).setText(header);
		}
		
		//table.layout(); // 레이아웃을 수동으로 갱신해야할 경우에 사용
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		tableViewer.setUseHashlookup(true);    // table 렌더링 속도 향상
		
		
        // Column Properties 지정 : ICellModifier 동작시 필수
        tableViewer.setColumnProperties(COLUMN_HEADER);
        tableViewer.setContentProvider(new IStructuredContentProvider() {
			
			@Override
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
				// TODO 자동 생성된 메소드 스텁
			}
			
			@Override
			public void dispose() {
				// TODO 자동 생성된 메소드 스텁
			}
			
			@Override
			public Object[] getElements(Object inputElement) {
				return ((ArrayList<MyDaysModel>)input).toArray();
			}
		});
        
		tableViewer.setLabelProvider(new ITableLabelProvider() {
			
			@Override
			public void removeListener(ILabelProviderListener listener) {
				// TODO 자동 생성된 메소드 스텁
			}
			
			@Override
			public boolean isLabelProperty(Object element, String property) {
				// TODO 자동 생성된 메소드 스텁
				return false;
			}
			
			@Override
			public void dispose() {
				// TODO 자동 생성된 메소드 스텁
			}
			
			@Override
			public void addListener(ILabelProviderListener listener) {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public String getColumnText(Object element, int columnIndex) {
				MyDaysModel myDays = (MyDaysModel)element;
		        switch (columnIndex) {
		        case 0:
		            return myDays.getPart();
		        case 1:
		            return myDays.getTitle();
		        case 2:
		            return myDays.getConetents();
		        case 3:
		            return myDays.getWriter();
		        case 4:
		            return myDays.getwDate();
		        }
		        return "";
		    }
			
			@Override
			public Image getColumnImage(Object element, int columnIndex) {
				// TODO 자동 생성된 메소드 스텁
				return null;
			}
		});
		
		tableViewer.setInput(input);
		tableViewer.refresh();
		
		for (int i = 0, n = table.getColumnCount(); i < n; i++) {
		  table.getColumn(i).pack();
		}
		table.pack();
	
        /*
         * Cell Modify 기능추가
         */
//        // Column Properties 지정 : ICellModifier 동작시 필수
//        tableViewer.setColumnProperties(COLUMN_HEADER);
//        
//        // CellEditor 생성 
//        CellEditor[] CELL_EDITORS = new CellEditor[COLUMN_HEADER.length];
//        for(int i=0; i < CELL_EDITORS.length ; i++) {
//            CELL_EDITORS[i] = new TextCellEditor(tableViewer.getTable());
//            // or CheckboxCellEditor, ComboBoxCellEditor 등 사용
//        }        
//        tableViewer.setCellEditors(CELL_EDITORS);
        
		return table;
	}
	
	  /**
	   * The application entry point
	   * 
	   * @param args
	   *            the command line arguments
	   */
	  public static void main(String[] args) {
	    new TableSnippet().run();
	  }	

}

 

ㅁ TreeViewer의 예제

   1) 일단 모델부터  

package com.dicws.mydays.model;

import java.util.ArrayList;
import java.util.List;

public class MyDaysModel {
	
	
	String part;
	String title;
	String conetents;
	String writer;
	String wDate;
	
	//tree모델시
	public MyDaysModel parent; // 부모노드
	public List<MyDaysModel> child = new ArrayList(); // 자식노드
	public int counter;
	
	//tree모델시
	public MyDaysModel(int counter, MyDaysModel parent) {
        this.parent = parent;
        this.counter = counter;
    }
	
	//tree모델시 : 데이터만 set
	public void setTreeData(String part, String title, String conetents, String writer, String wDate) {
        
        this.part = part;
        this.title = title;
        this.conetents = conetents;
        this.writer = writer;
        this.wDate = wDate;
    }

    public String getPart() {
		return part;
	}

	public void setPart(String part) {
		this.part = part;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getConetents() {
		return conetents;
	}

	public void setConetents(String conetents) {
		this.conetents = conetents;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getwDate() {
		return wDate;
	}

	public void setwDate(String wDate) {
		this.wDate = wDate;
	}


}


   2) 실행모듈정의 및 설명 

package com.dicws.mydays.test;

import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;

import com.dicws.mydays.model.MyDaysModel;
import com.dicws.mydays.provider.MyDaysTreeContentProvider;
import com.dicws.mydays.provider.MyDaysTreeLblProvider;

public class TreeSnippet1 extends ApplicationWindow {

	MyDaysModel input;
	
	public TreeSnippet1() {
		super(null);
	}

	public void run() {
		// Don't return from open() until window closes
		setBlockOnOpen(true);
		// Open the main window
		open();
		// Dispose the display
		Display.getCurrent().dispose();
	}

	/**
	 * Configures the shell
	 * 
	 * @param shell
	 *            the shell
	 */
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		shell.setText("Team Tree");
	}

	/**
	 * Creates the main window's contents
	 * 
	 * @param parent
	 *            the main window
	 * @return Control
	 */
	protected Control createContents(Composite parent) {

		TreeViewer treeViewer = new TreeViewer(parent, SWT.BORDER);
		Tree tree = treeViewer.getTree();
		tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 6, 1));
		// tree.setLayout(new TreeColumnLayout());
		tree.setHeaderVisible(true);
		tree.setLinesVisible(true);

		treeViewer.setContentProvider(new ITreeContentProvider() {
			
			@Override
			public void inputChanged(Viewer viewer, Object obj, Object obj1) {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public void dispose() {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public boolean hasChildren(Object obj) {
				// TODO 자동 생성된 메소드 스텁
				return false;
			}
			
			@Override
			public Object getParent(Object obj) {
				// TODO 자동 생성된 메소드 스텁
				return null;
			}
			
			@Override
			public Object[] getElements(Object inputElement) {
				return ((MyDaysModel)inputElement).child.toArray();
			}
			
			@Override
			public Object[] getChildren(Object parentElement) {
				return getElements(parentElement);
			}
		});
		
		treeViewer.setLabelProvider(new ILabelProvider() {
			
			@Override
			public void removeListener(ILabelProviderListener ilabelproviderlistener) {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public boolean isLabelProperty(Object obj, String s) {
				// TODO 자동 생성된 메소드 스텁
				return false;
			}
			
			@Override
			public void dispose() {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public void addListener(ILabelProviderListener ilabelproviderlistener) {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public String getText(Object element) {
				return ((MyDaysModel)element).getPart();
			}
			
			@Override
			public Image getImage(Object obj) {
				// TODO 자동 생성된 메소드 스텁
				return null;
			}
		});

		TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
		column1.setText("Column 1");
		TreeColumn column2 = new TreeColumn(tree, SWT.LEFT);
		column2.setText("Column 1");

		setTree();
		treeViewer.setInput(input);
		treeViewer.refresh();
		
		
		for (int i = 0, n = tree.getColumnCount(); i < n; i++) {
			tree.getColumn(i).pack();
		}
		tree.pack();
		return treeViewer.getTree();
	}
	
	private void setTree() {

		// new LabelView();
		MyDaysModel root = new MyDaysModel(0, null);
		MyDaysModel tmp;
		for (int i = 1; i < 10; i++) {
			tmp = new MyDaysModel(i, root);
			tmp.setTreeData("상환전화 i:" + i, "입금상환", "내용", "나야나1", "aa");
			root.child.add(tmp);

			for (int j = 1; j < i; j++) {
				MyDaysModel tmp1 = new MyDaysModel(j, tmp);
				tmp1.setTreeData("상환전화 j:" + j, "입금상환", "내용", "나야나1", "aa");
				tmp.child.add(tmp1);
			}
		}

		input = root;

	}	

	/**
	 * The application entry point
	 * 
	 * @param args
	 *            the command line arguments
	 */
	public static void main(String[] args) {
		new TreeSnippet1().run();
	}

}

 

 

 

 

참고 사이트 : wiki.eclipse.org/JFaceSnippets#Snippet002_-_Tree_Viewer

 

JFaceSnippets - Eclipsepedia

JFace-Snippets are small and easy understandable programming examples of how to use the JFace API. To browse the examples, navigate to the examples GIT repository. Copy Paste The header section of each snippet is a link to the plain source. You can copy th

wiki.eclipse.org

참고 사이트 : www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm

 

SWT JFace Eclipse « Java

java2s.com  | © Demo Source and Support. All rights reserved.

www.java2s.com