【问题标题】:How can we do undo and redo functionality for a swt texteditor我们如何为 swt 文本编辑器执行撤消和重做功能
【发布时间】:2014-12-25 05:19:15
【问题描述】:

我创建了一个 swt 文本框并尝试执行撤消和重做功能,但是当我按“ctrl+z”时,侦听器本身不起作用。所以我们如何进行撤消和重做操作。实现撤消和重做的代码如下

private  static class CTabItemControl extends Composite {

     private static class UndoRedoStack<T> { 

         private Stack<T> undo; 
         private Stack<T> redo; 

         public UndoRedoStack() { 
            undo = new Stack<T>(); 
            redo = new Stack<T>(); 
        } 

         public void pushUndo(T delta) { 
             undo.add(delta); 
         } 

         public void pushRedo(T delta) { 
           redo.add(delta); 
         } 

         public T popUndo() { 
             T res = undo.pop(); 
             return res; 
         } 

         public T popRedo() { 
             T res = redo.pop(); 
             return res; 
         } 

         public T peekUndo() { 
             T res = undo.peek(); 
             return res; 
         } 

         public void clearRedo() { 
             redo.clear(); 
         } 

         public void clearUndo() { 
             undo.clear(); 
         } 

         public boolean hasUndo() { 
             return !undo.isEmpty(); 
         } 

         public boolean hasRedo() { 
             return !redo.isEmpty(); 
         } 

     } 

     //private StyledText editor; 

     private UndoRedoStack<ExtendedModifyEvent> stack; 

     private boolean isUndo; 

     private boolean isRedo; 



    public CTabItemControl(Composite parentComposite,final CTabItem tabitem){
        super(parentComposite, SWT.NONE);
        setLayout(new GridLayout(1, false));



        editor = new StyledText(this, SWT.MULTI | SWT.V_SCROLL);
        editor.setLayoutData(new GridData(GridData.FILL_BOTH));
        editor.setFont(new Font(Display.getDefault(),"Cambria", 10, SWT.NORMAL));
        editor.addListener(SWT.KeyDown, new Listener(){
            public void handleEvent(Event event) {
                event.doit = true;
                if(!tabitem.getText().contains("*"))
                {
                    tabitem.setText('*'+tabitem.getText());
                     System.out.println("inserted *");
                }

            }
        });




        editor.addExtendedModifyListener(new ExtendedModifyListener(){ 
                 //editor.addKeyListener(this); 
             public void modifyText(ExtendedModifyEvent event) { 
                 if (isUndo) { 
                     stack.pushRedo(event); 
                 } else { // is Redo or a normal user action 
                     stack.pushUndo(event); 
                     if (!isRedo) { 
                         stack.clearRedo(); 

                     } 
                 } 
             } 



         });


          editor.addKeyListener(new KeyListener() {

                 public void keyPressed(KeyEvent e) { 
                     // Listen to CTRL+Z for Undo, to CTRL+Y or CTRL+SHIFT+Z for Redo 
                     boolean isCtrl = (e.stateMask & SWT.CTRL) > 0; 
                     boolean isAlt = (e.stateMask & SWT.ALT) > 0; 
                     if (isCtrl && !isAlt) { 
                         boolean isShift = (e.stateMask & SWT.SHIFT) > 0; 
                         if (!isShift && e.keyCode == 'z') { 
                             {
                                 System.out.println("call undo");
                             undo();
                             }
                         } else if (!isShift && e.keyCode == 'y' || isShift 
                                 && e.keyCode == 'z') { 
                             redo(); 
                         }  
                     } 

                     if(e.stateMask == SWT.CTRL && e.keyCode == 'a'){      
                         editor.selectAll(); 
                       } 
                 } 

                 public void keyReleased(KeyEvent e) { 
                     // ignore 
                 } 
            });

                 //this.editor = editor; 
                 stack = new UndoRedoStack<ExtendedModifyEvent>(); 

    }   


     private void revertEvent(ExtendedModifyEvent event) {

         System.out.println("calling revertevent");
         editor.replaceTextRange(event.start, event.length, event.replacedText); 
         // (causes the modifyText() listener method to be called) 

         editor.setSelectionRange(event.start, event.replacedText.length()); 
     } 

     private void undo() { 
         System.out.println("calling undo");
         if (stack.hasUndo()) { 
             isUndo = true; 
             revertEvent(stack.popUndo()); 
            isUndo = false; 
         } 
     } 

     private void redo() { 
         if (stack.hasRedo()) { 
             isRedo = true; 
             revertEvent(stack.popRedo()); 
             isRedo = false; 
         } 
     } 



     public void clearUndoRedo() { 
    stack.clearUndo(); 
    stack.clearRedo(); 
     } 

     public boolean hasUndo() { 
    return stack.hasUndo(); 
     } 

     public String peekUndo() { 
    return stack.peekUndo().toString(); 
     } 

}

【问题讨论】:

    标签: java swt keylistener e4 undo-redo


    【解决方案1】:

    当您按下 Ctrl + Z 或 Ctrl + Y 时,您将获得 2 个按键事件,一个用于 Ctrl,一个用于另一个按键。所以最好检查一下第二个事件的性质

    e.character == 0x1a

    对于 Ctr + Z,并且

    e.character == 0x19

    对于 Ctrl + Y

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-29
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2010-10-16
      相关资源
      最近更新 更多