삶 가운데 남긴 기록 AACII.TISTORY.COM
SWT JFace 주요 위젯 본문
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 실행결과:
'DEV&OPS > Java' 카테고리의 다른 글
Jasypt(Java Simplified Encryption) 사용 방법 (0) | 2024.05.08 |
---|---|
JAVA Visitor 패턴 - 자료구조를 돌아다니면서 처리 (0) | 2024.05.08 |
MyBatis 동적 쿼리의 기본 (0) | 2024.05.08 |
Singleton Pattern 과 DeadLock (21) | 2024.01.21 |
[SWT/JFace] 이벤트 처리 (45) | 2024.01.21 |