Recent Posts
Recent Comments
Link
12-08 02:58
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

[SWT/JFace] 주요 위젯 본문

DEV&OPS/Java

[SWT/JFace] 주요 위젯

ALEPH.GEM 2024. 11. 27. 21:48

SWT Text 위젯

org.eclipse.swt.widgets.Text 위젯은 간단한 텍스트를 입력받을 때 사용하는 위젯입니다.

  • addModifyListener() : 텍스트를 수정했음을 알리기 위한 리스너를 추가
  • addSelectionListener() : 컨트롤이 선택되었음을 알리기 위한 리스너를 추가
  • addVerifyListener() : 텍스트에 변화가 일어났는지 검증하기 위한 리스너를 추가
  • append() : 현 텍스트에 주어진 문자열을 추가
  • insert() : 현 텍스트를 주어진 문자열로 대체
  • copy(), cut(), paste() : 선택된 문자들을 클립보드로 옮기거나 클립보드의 내용으로 대체
  • setSelection(), selectAll() : 코드 상에서 직접 선택 영역을 설정
  • setEchoCharacter() : 사용자가 타이핑하는 문자 대신 보여줄 다른 문자를 지정(비밀번호)
  • setEditable() : 편집을 가능하게 하거나 불가능하게 한다.
  • setFont() : 전체 폰트 설정. 부분적으로 폰트를 설정할 수는 없다. 

 

아래 예제는 Text위젯에 소문자를 입력하면 대문자로 바꾸는 예제입니다.

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;

public class Capital extends Composite {
	public Capital(Composite parent) {
		super(parent, SWT.NONE);
		buildControls();
	}
	
	public void buildControls() {
		this.setLayout(new FillLayout());
		Text text = new Text(this, SWT.MULTI | SWT.V_SCROLL);
		text.addVerifyListener(new VerifyListener() {

			@Override
			public void verifyText(VerifyEvent e) {
				//대문자로 변경
				e.text = e.text.toUpperCase();
			}
			
		});
	}
}

 

 

 

SWT StyledText 위젯

org.eclipse.swt.custom.StyledText 은 텍스트 위젯에서 제공하는 메서드에 좀 더 다양한 스타일을 수정할 수 있는 기능이 추가되어 있습니다.

setKeyBinding() 메소드는 Shift 키, Ctrl 키 같은 기능키를 사용할 수 있습니다.

이 기능키들은 SWT 상수로 정의되어 있어서 단축키 기능을 구현할 때 유용하게 사용할 수 있습니다.

단, 운영체제 디폴트 단축키(잘라내기, 복사하기, 붙여 넣기)는 되지 않습니다.

명시적으로 지정하지 않아도 기본적으로 제공되기 때문입니다.

 

StyleRange 클래스는 텍스트 범위에 대한 스타일 정보를 보유하고 있는데 모든 필드가 public 이므로 자유롭게 수정할 수 있습니다. 

수정한 스타일은 setStyleRange()를 호출해야 적용이 됩니다.

StyleRange는 텍스트의 영역을 관리하기 위해 시작(오프셋) 지점과 길이를 통해 관리합니다.

import java.util.LinkedList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ExtendedModifyEvent;
import org.eclipse.swt.custom.ExtendedModifyListener;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

public class UndoRedo extends Composite {
	public static final int MAX_STACK_SIZE = 100;	//변경 사항을 저장하는 스택의 크기
	public List undoStack;	
	public List redoStack;
	public StyledText styledText;

	/** 
	* @date        : 2024-01-26  
	* @description : 생성자에서 초기화 작업을 수행합니다.
	**/
	UndoRedo(Composite parent) {
		super(parent, SWT.NONE);
		undoStack = new LinkedList();
		redoStack = new LinkedList();
		buildControls();
	}

	public void buildControls() {
		this.setLayout(new FillLayout());
		styledText = new StyledText(this, SWT.MULTI | SWT.V_SCROLL);
		
		//텍스트가 편집될 때마다 이벤트를 처리
		styledText.addExtendedModifyListener(new ExtendedModifyListener() {

			@Override
			public void modifyText(ExtendedModifyEvent event) {
				String currText = styledText.getText();
				//편집을 되돌리기 위해 저장합니다.
				String newText = currText.substring(event.start, event.start + event.length);
				//undo 스택 처리
				if(newText != null && newText.length() > 0) {
					if(undoStack.size() == MAX_STACK_SIZE) {
						undoStack.remove(undoStack.size() - 1);
					}
					undoStack.add(0, newText);
				}
			}
		});
		
		//F1 펑션키를 누르면 undo동작을 하고 F2 펑션키를 누르면 redo 동작을 수행합니다.
		styledText.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent ke) {
				switch(ke.keyCode) {
				case SWT.F1:
					undo();
					break;
				case SWT.F2:
					redo();
					break;
				default:		
				}
			}
		});		
	}
	
	/** 
	* @date        : 2024-01-26  
	* @description : 커서를 끝으로 이동 시킴
	**/
	public void moveCursorToEnd() {
		styledText.setCaretOffset(styledText.getText().length());
	}
	
	/** 
	* @date        : 2024-01-26  
	* @description : 다시 실행 동작 정의
	**/
	public void redo() {
		if(redoStack.size() > 0) {
			//스택에서 꺼낸 뒤 append 합니다.
			String text = (String)redoStack.remove(0);
			moveCursorToEnd();
			styledText.append(text);
			moveCursorToEnd();
		}
	}
	
	/** 
	* @date        : 2024-01-26  
	* @description : 되돌리기 동작 정의 
	**/
	public void undo() {
		if(undoStack.size() > 0) {
			//실행 취소를 위해 스택에서 하나 꺼냅니다. 
			String lastEdit = (String)undoStack.remove(0);
			int editLength = lastEdit.length();
			String currText = styledText.getText();
			int startReplaceIndex = currText.length() - editLength;
			//버퍼에서 사라져야 할 문자열을 삭제합니다.
			styledText.replaceTextRange(startReplaceIndex, editLength, "");
			redoStack.add(0, lastEdit);
		}
	}
	
}
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;

public class WidgetWindow extends ApplicationWindow {

	public WidgetWindow() {
		super(null);
	}
	
	public Control createContents(Composite parent) {
		UndoRedo undoRedo = new UndoRedo(parent);
		parent.setSize(800, 600);	
		getShell().setText("Undo Redo");
		return parent;
	}

	public static void main(String[] args) {
		WidgetWindow wwin = new WidgetWindow();
		wwin.setBlockOnOpen(true);
		wwin.open();
		Display.getCurrent().dispose();
	}

}

 

 

JFace 텍스트 패키지

JFace 텍스트 패키지는 text.jar와 jfacetext.jar 파일입니다.

이클립스 경로/plugins/org.eclipse.text~~~ 패지지에 text.jar 파일이 있습니다.

이클립스 경로/plugins/org.eclipse.jface.text~~~ 패키지에 jfacetext.jar 파일이 있습니다.

 

IDocument 인터페이스

AbstractDocument는 일부만 구현되어 있고 Document 클래스가 IDocument 인터페이스의 구현체입니다.

IDocument는 아래 처럼 고급 텍스트 기능을 지원합니다.

  • Position : 텍스트 영역에 Position을 저장해 두는 기능입니다. 북마크 기능이나 TODO 주석 찾아가기 기능 등을 구현할 수 있습니다. 
  • Content 타입을 구분: 일반 text외에 HTML 등 Content 타입을 구분합니다. 
  • search() :  정규표현식이나 패턴 검색은 지원하지 않지만, 시작 위치 검색, 방향, 대소문자 구분, 단어 검색을 할 수 있습니다.

 

ITextViewer 인터페이스

TextViewer 클래스가 구현체이며 StyledText를 이용해서 데이터를 보여줍니다.

텍스트 수정 이벤트와 스타일 이벤트 양쪽에 대한 리스너를 지원합니다.

원할 때 StyledText에 접근하는 것을 허용하지만, 대신 TextPresentation을 권장합니다.

IUndoManager 인터페이스를 통해 undo 기능을 구현할 수 있습니다.

 

org.eclipse.jface.text 하위 패키지
  • contentassist : 자동 완성 기능을 지원합니다.
  • formatter : 텍스트의 서식을 설정하는 기능을 제공합니다. 
  • presentation : 문서의 시각적인 효과를 업데이트 할 때 사용하는 패키지입니다. 
  • reconciler : 문서를 텍스트의 외부 저장소와 동기화 하는데 사용합니다. 
  • rules : 텍스트를 스캔하고 매치하기 위한 클래스를 지원합니다. 
  • source : 텍스트에 시각적인 표시를 추가해줍니다. 예를 들어 이클립스에서 빨간색 X로 컴파일 에러를 표시하는 기능이 그 예입니다. 

 

Combo 위젯

콤보 박스의 스타일은 Simple, Drop-down, Read-only 세 가지 스타일이 있습니다.

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;

public class ComboComposite extends Composite {

	public ComboComposite(Composite parent) {
		super(parent, SWT.NONE);
		buildControls();
	}
	
	public void buildControls() {
		setLayout(new RowLayout());
		int[] comboStyles = {SWT.SIMPLE, SWT.DROP_DOWN, SWT.READ_ONLY};
		for(int idx = 0; idx < comboStyles.length; ++idx) {
			Combo combo = new Combo(this, comboStyles[idx]);
			combo.add("Option 1");
			combo.add("Option 2");
			combo.add("Option 3");
		}
	}
}
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

public class WidgetWindow extends ApplicationWindow {

	public WidgetWindow() {
		super(null);
	}
	
	public Control createContents(Composite parent) {
		TabFolder tf = new TabFolder(parent, SWT.NONE);
		TabItem combos = new TabItem(tf, SWT.NONE);
		combos.setText("Combos");
		combos.setControl(new ComboComposite(tf));
		getShell().setText("위젯 윈도우");
		return parent;
	}

	public static void main(String[] args) {
		WidgetWindow wwin = new WidgetWindow();
		wwin.setBlockOnOpen(true);
		wwin.open();
		Display.getCurrent().dispose();
	}

}

WidgetWindow.java 실행결과:

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90