The Goal
          Keep walking……
          posts - 23,  comments - 1,  trackbacks - 0

          用于文本編輯的control有2個:Text和StyledText.后者可以為文本和control本身設定顏色,格式等。這兩個control之間毫無關聯,除了都是Composite的子類之外。

          • The basic Text widget

          package com.swtjface.Ch5;

          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 Ch5Capitalizer extends Composite {

          public Ch5Capitalizer(Composite parent) {

          super(parent, SWT.NONE);

          buildControls();

          }

          private void buildControls() {

          this.setLayout(new FillLayout());

          Text text = new Text(this, SWT.MULTI | SWT.V_SCROLL);

          text.addVerifyListener(new VerifyListener() { //每當text被改變,任何以注冊的VerifyListeners便會被調用。此處每按一次鍵盤,此方法就被調用。如果是同時輸入多個字符,也調用一次

          public void verifyText(VerifyEvent e) {

          if( e.text.startsWith("1") ) {

          e.doit = false;

          } //如果文本以1開頭,即不允許編輯

          else {

          e.text = e.text.toUpperCase();

          }

          }

          });

          }

          }

          Text的重要方法,見下圖

          insert()--doesn’t allow you to insert text into the existing content.

          • The StyledText widget

          StyledText包含了一系列的應用到該小部件的預定義的動作,這些是常規的東西如:剪切、粘貼、移動至下一個詞、移動至文末。代表這些動作的常量在org.eclipse.swt.custom程序包中的ST類中有定義。這些常量在兩種情況下發揮功效:首先,你可以使用它們程序性地使用invokeAction()方法調用任一的這些方法;其次,你也可以使用setKeyBinding()方法來將它們綁定于鍵擊行為。setKeyBinding()選定一個鍵(可以通過諸如Shift或是Ctrl之類的編輯鍵來修改SWT常量之一)綁定于指定的動作。如下的例子中組合鍵Ctrl-Q綁定于粘貼動作。引起注意的是這并不意味著會將默認鍵的綁定清除,該兩個綁定都會生效。

          相對于Text而言,還添加了drawing line backgrounds and line styles的事件,可以通過此事件來改變整行的style或背景顏色。注意:如果使用了LineStyleListener,就不能在StyledText實例上調用get/setStyleRange(), 如果使用了LineBackgroundListener,那你就不能調用getLineBackground() or setLineBackground().

          可以通過使用一個StyledText的StyleRanges來改變顯示的風格

          StyleRange
          StyledText通過使用StyleRange類來管理當前所顯示的不同styles。其所有的欄位都是public的可隨意修改,但是要一直到當此StyledText實例的setStyleRange()被調用之后才會生效。

          StyleRanges通過開始偏移量和長度來設定text的區域范圍。
          StyleRange可設定背景和前景色,默認為null,還可設定字體,SWT.NORMAL 或者SWT.BOLD.

          similarTo()可用來判斷兩個StyleRange實例是否有同樣的前景、背景和字體。

          當我們保存text之后,可通過styledText.getStyleRanges()來獲取style信息,此函數會返回an array of StyleRange


          toggleBold()--將已輸入的文本在bold和normal之間切換,是被一個KeyListener調用的,此KeyListener會監聽F1是否被按下

          A StyledText example
          復制、粘貼功能不需要通過代碼便可使用,是和platform的標準鍵盤快捷方式相關聯的

          ExtendedModifyListener和ModifyListener不同,前者提供了關于what was done的event細節,而后者只是當編輯懂作產生時notify,不會去準確的辨別到底何種修改發生了。

          package com.swtjface.Ch5;

          import java.util.LinkedList;

          import java.util.List;

          import org.eclipse.swt.SWT;

          import org.eclipse.swt.custom.*;

          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 Ch5Undoable extends Composite {

          private static final int MAX_STACK_SIZE = 25;

          private List undoStack;

          private List redoStack;

          private StyledText styledText;

          public Ch5Undoable(Composite parent) {

          super(parent, SWT.NONE);

          undoStack = new LinkedList();

          redoStack = new LinkedList();

          buildControls();

          }

          private void buildControls() {

          this.setLayout(new FillLayout());

          styledText = new StyledText(this, SWT.MULTI | SWT.V_SCROLL);

          styledText.addExtendedModifyListener(

          new ExtendedModifyListener() { //每次text被編輯的時候,都會調用此listener

          public void modifyText(ExtendedModifyEvent event) {

          String currText = styledText.getText();

          String newText = currText.substring(event.start,

          event.start + event.length); //獲得新插入的文本

          if( newText != null && newText.length() > 0 ) {

          if( undoStack.size() == MAX_STACK_SIZE ) {

          undoStack.remove( undoStack.size() - 1 );

          }

          undoStack.add(0, newText);//將新插入的文本保存到undoStack中

          }

          }

          }); //關鍵部分

          styledText.addKeyListener(new KeyAdapter() {

          public void keyPressed(KeyEvent e) {

          switch(e.keyCode) {

          case SWT.F1:

          undo(); break;

          case SWT.F2:

          redo(); break;

          default: //ignore everything else

          }

          }

          });

          }

          private void undo() {

          if( undoStack.size() > 0 ) {

          String lastEdit = (String)undoStack.remove(0);//得到要undo的字符

          int editLength = lastEdit.length();

          String currText = styledText.getText();

          int startReplaceIndex = currText.length() - editLength;

          styledText.replaceTextRange(startReplaceIndex, editLength, ""); //將最后輸入的字符替換成空

          redoStack.add(0, lastEdit);//把最后的這個undo的字符加到redoStack中

          }

          }

          private void redo() {

          if( redoStack.size() > 0 ) {

          String text = (String)redoStack.remove(0);//得到要恢復的字符

          moveCursorToEnd();

          styledText.append(text);//將要恢復的字符加至文本的最后

          moveCursorToEnd();

          }

          }

          private void moveCursorToEnd() {

          styledText.setCaretOffset(styledText.getText().length());

          }

          }

          posted on 2006-03-29 17:42 JOO 閱讀(1004) 評論(0)  編輯  收藏 所屬分類: SWT & JFace IN ACTION
          Hit the target!

          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(2)

          隨筆分類(23)

          隨筆檔案(22)

          文章檔案(1)

          相冊

          Neighbor

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平阴县| 德阳市| 乌拉特中旗| 新安县| 阿鲁科尔沁旗| 神池县| 新田县| 康马县| 楚雄市| 霍邱县| 洛宁县| 绥芬河市| 龙海市| 普兰县| 永州市| 闽清县| 沈阳市| 永寿县| 年辖:市辖区| 云龙县| 吉水县| 微博| 韶山市| 乾安县| 云林县| 会泽县| 高碑店市| 广河县| 香河县| 治县。| 汉阴县| 定襄县| 周宁县| 珠海市| 二手房| 孝义市| 四子王旗| 谷城县| 马山县| 大关县| 宜良县|