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

          用于文本編輯的control有2個(gè):Text和StyledText.后者可以為文本和control本身設(shè)定顏色,格式等。這兩個(gè)control之間毫無(wú)關(guān)聯(lián),除了都是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() { //每當(dāng)text被改變,任何以注冊(cè)的VerifyListeners便會(huì)被調(diào)用。此處每按一次鍵盤,此方法就被調(diào)用。如果是同時(shí)輸入多個(gè)字符,也調(diào)用一次

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

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

          可以通過(guò)使用一個(gè)StyledText的StyleRanges來(lái)改變顯示的風(fēng)格

          StyleRange
          StyledText通過(guò)使用StyleRange類來(lái)管理當(dāng)前所顯示的不同styles。其所有的欄位都是public的可隨意修改,但是要一直到當(dāng)此StyledText實(shí)例的setStyleRange()被調(diào)用之后才會(huì)生效。

          StyleRanges通過(guò)開始偏移量和長(zhǎng)度來(lái)設(shè)定text的區(qū)域范圍。
          StyleRange可設(shè)定背景和前景色,默認(rèn)為null,還可設(shè)定字體,SWT.NORMAL 或者SWT.BOLD.

          similarTo()可用來(lái)判斷兩個(gè)StyleRange實(shí)例是否有同樣的前景、背景和字體。

          當(dāng)我們保存text之后,可通過(guò)styledText.getStyleRanges()來(lái)獲取style信息,此函數(shù)會(huì)返回an array of StyleRange


          toggleBold()--將已輸入的文本在bold和normal之間切換,是被一個(gè)KeyListener調(diào)用的,此KeyListener會(huì)監(jiān)聽F1是否被按下

          A StyledText example
          復(fù)制、粘貼功能不需要通過(guò)代碼便可使用,是和platform的標(biāo)準(zhǔn)鍵盤快捷方式相關(guān)聯(lián)的

          ExtendedModifyListener和ModifyListener不同,前者提供了關(guān)于what was done的event細(xì)節(jié),而后者只是當(dāng)編輯懂作產(chǎn)生時(shí)notify,不會(huì)去準(zhǔn)確的辨別到底何種修改發(fā)生了。

          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被編輯的時(shí)候,都會(huì)調(diào)用此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中

          }

          }

          }); //關(guān)鍵部分

          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);//把最后的這個(gè)undo的字符加到redoStack中

          }

          }

          private void redo() {

          if( redoStack.size() > 0 ) {

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

          moveCursorToEnd();

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

          moveCursorToEnd();

          }

          }

          private void moveCursorToEnd() {

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

          }

          }

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

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

          常用鏈接

          留言簿(2)

          隨筆分類(23)

          隨筆檔案(22)

          文章檔案(1)

          相冊(cè)

          Neighbor

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 昆明市| 磴口县| 安图县| 尼勒克县| 象山县| 交口县| 隆德县| 克什克腾旗| 班玛县| 高唐县| 昭觉县| 松桃| 辽阳县| 瑞金市| 汤阴县| 晋中市| 涿州市| 青浦区| 鄂伦春自治旗| 永靖县| 大厂| 吴堡县| 兴宁市| 商水县| 扎赉特旗| 大同市| 洪雅县| 阜阳市| 河北省| 称多县| 博爱县| 喀喇| 湘潭县| 阿鲁科尔沁旗| 汉阴县| 陇南市| 教育| 宁化县| 名山县| 无极县| 昌乐县|