Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализовать Undo/Redo, command pattern 
V
    Опции темы
Dimonius
Дата 17.10.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: 1
Всего: 1



Почитал я про комманд паттерн, но так и не понял как реализовать эти самые Undo/Redo.  Мне нужны эти команды для отмены действий в калькуляторе.
Подскажите с чего начать

Это сообщение отредактировал(а) Dimonius - 17.10.2006, 10:52
PM MAIL   Вверх
Dimonius
Дата 17.10.2006, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: 1
Всего: 1



Короче я уже это сам реализовал. Конечно не без помощи гугл.
Вот код:
Код

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;

import javax.swing.BoxLayout;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

class CalculatorState {

    CalculatorState(String numberDialed) {
    
        this.numberDialed=numberDialed;        
    }
    
    String numberDialed;
    double memoryContent;
    double currentResult;
    
}

abstract class CalculatorCommand {

    protected Calculator calculator;
    
    abstract void execute();
    abstract void undo();
    
}


class CalculationCommand extends CalculatorCommand {

    private String firstOperand;    
    private String operation;
    
    CalculationCommand(String operation, String firstOperand, Calculator calculator) {
        
        this.operation = operation;
        this.firstOperand = firstOperand;
        this.calculator = calculator;
    }
    
    void execute() {
        
        calculator.performOperation(operation,firstOperand);
        
    }

    void undo() {
        
        calculator.undoOperation(operation,firstOperand);
        
    }
    
    String getOperation() {
        return operation;
    }
}

class DialingCommand extends CalculatorCommand{

    private String dialed;
    
    DialingCommand(String dialed, Calculator calculator) {
        
        this.dialed=dialed;
        this.calculator = calculator;
    }
    
    void execute() {
    
        calculator.dial(dialed);
    }

    void undo() {
        
        calculator.undoDial(dialed);
    }
    
}

class ClearCommand extends CalculatorCommand{

    private String dialed;
    
    ClearCommand(String dialed, Calculator calculator) {
        
        this.dialed=dialed;
        this.calculator = calculator;
    }
    
    void execute() {
    
        calculator.clear();
    }

    void undo() {
        
        calculator.undoClear(dialed);
    }
    
}




class NumberButton extends JButton {
    
    private int number;
    
    public NumberButton(int number) {        
        super(Integer.toString(number));
        this.number=number;        
    }
    
    public int getNumber() {
        
        return number;
        
    }

}

class OperationButton extends JButton {
    
    private String operation;
    
    public OperationButton(String operation) {        
        super(operation);
        this.operation=operation;        
    }
    
    public String getOperation() {
        
        return operation;
        
    }

}




public class Calculator extends JApplet{

    private CalculatorState current = new CalculatorState("");
    
    private LinkedList<CalculatorCommand> commands = new LinkedList<CalculatorCommand>();
    
    private CalculationCommand lastOperation;
    
    private JLabel display = new JLabel();
    
    void dial (String todial) {
        
        current.numberDialed=current.numberDialed+todial;
        display.setText(current.numberDialed);
    }

    void undoDial (String dialed) {
                        
        if (current.numberDialed.length()>dialed.length()) {
            current.numberDialed=current.numberDialed.substring(0,current.numberDialed.length()-dialed.length());
        }
        else {
            current.numberDialed="";
        }
            
        display.setText(current.numberDialed);
    }
    
    
    void performOperation(String operation, String firstOperand) {
        
        if (operation == "+") {
            
            current.numberDialed=Double.toString(Double.valueOf(current.numberDialed)+Double.valueOf(firstOperand));
            
        }
        else if (operation == "-") {
            
            current.numberDialed=Double.toString(Double.valueOf(firstOperand)-Double.valueOf(current.numberDialed));
            
        }
        else if (operation == "*") {
            
            current.numberDialed=Double.toString(Double.valueOf(current.numberDialed)*Double.valueOf(firstOperand));
            
        }
        else if (operation == "/") {
            
            current.numberDialed=Double.toString(Double.valueOf(firstOperand)/Double.valueOf(current.numberDialed));
            
        }
                
        display.setText(current.numberDialed);
    }
    
    void undoOperation(String operation, String firstOperand) {
    
        current.numberDialed=firstOperand;
        display.setText(current.numberDialed);
        
    }
    
    void clear() {
        if (current.numberDialed.length()>1) {
            current.numberDialed=current.numberDialed.substring(0,current.numberDialed.length()-1);
        } 
        else {
            current.numberDialed="";
        }
            
        display.setText(current.numberDialed);
    }
    
    void undoClear(String dialed) {
        
        current.numberDialed=dialed;
        display.setText(current.numberDialed);
    }
    
    private ActionListener nbl = new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            CalculatorCommand cc = new DialingCommand(Integer.toString(((NumberButton)arg0.getSource()).getNumber()),Calculator.this);
            commands.add(cc);
            cc.execute();
        }                        
        
    };

    private ActionListener obl = new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            
            if (current.numberDialed.charAt(current.numberDialed.length()-1)=='.') {
                current.numberDialed=current.numberDialed+"0";
            }
            
            CalculationCommand cc = new CalculationCommand(((OperationButton)arg0.getSource()).getOperation(),current.numberDialed,Calculator.this);
            if (lastOperation != null) {
                lastOperation.execute();
            }
            lastOperation=cc;
            commands.add(cc);            
            if (cc.getOperation() != "=") {            
                current.numberDialed="";                
            }    
            display.setText(current.numberDialed);
        }                        
        
    };
    
    private ActionListener pbl = new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            if (! current.numberDialed.contains(".")) {
                CalculatorCommand cc = new DialingCommand(".",Calculator.this);
                commands.add(cc);
                cc.execute();
            }    
        }                        
        
    };

    private ActionListener ubl = new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            if (!commands.isEmpty()) {
                commands.removeLast().undo();
            }
        }                        
        
    };
    

    private ActionListener cbl = new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            ClearCommand cc = new ClearCommand(current.numberDialed, Calculator.this);
            commands.add(cc);            
            cc.execute();    
        }                                
    };
    
    
    public void init() {
        
        JButton nb[] = new NumberButton[10];
                    
        JPanel buttons = new JPanel(new GridLayout(4,4));        
        for (int i=7; i<=9 ; i++){
            nb[i-1]=new NumberButton(i);
            nb[i-1].addActionListener(nbl);
            buttons.add(nb[i-1]);            
        }
        
        OperationButton subb = new OperationButton("-");
        subb.addActionListener(obl);
        buttons.add(subb);
        
        for (int i=4; i<=6 ; i++){
            nb[i-1]=new NumberButton(i);
            nb[i-1].addActionListener(nbl);
            buttons.add(nb[i-1]);            
        }
        
        OperationButton addb = new OperationButton("+");
        addb.addActionListener(obl);
        buttons.add(addb);
        
        for (int i=1; i<=3 ; i++){
            nb[i-1]=new NumberButton(i);
            nb[i-1].addActionListener(nbl);
            buttons.add(nb[i-1]);            
        }                

        OperationButton mulb = new OperationButton("*");
        mulb.addActionListener(obl);
        buttons.add(mulb);

        OperationButton pointb = new OperationButton(".");
        pointb.addActionListener(pbl);
        buttons.add(pointb);    
        
        
        nb[9]=new NumberButton(0);
        nb[9].addActionListener(nbl);
        buttons.add(nb[9]);            
        
        OperationButton equalb = new OperationButton("=");
        equalb.addActionListener(obl);
        buttons.add(equalb);        
        
        OperationButton divb = new OperationButton("/");
        divb.addActionListener(obl);
        buttons.add(divb);        
        
        Container cp = getContentPane();
        cp.setLayout(new BoxLayout(cp,BoxLayout.Y_AXIS));
        
        
        JPanel displaybg = new JPanel();
        
        displaybg.setBackground(new Color((float)1,(float)1,(float)1));
        
        displaybg.add(display);

        JButton clb=new JButton("Clear");
        clb.addActionListener(cbl);
        
        JPanel lowBtnPanel = new JPanel();
        
        lowBtnPanel.add(clb);
        
        JButton undob = new JButton("Undo");
        undob.addActionListener(ubl);
                                
        lowBtnPanel.add(undob);
        
        cp.add(displaybg);
        
        cp.add(buttons);
        
        cp.add(lowBtnPanel);
        
    }    
    
    public static void main(String[] args) {

        JApplet calculator = new Calculator();
        JFrame mainFrame = new JFrame("Simple Calculator");
        
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.getContentPane().add(calculator);
        mainFrame.setSize(200,250);
        
        calculator.init();
        calculator.start();
        
        mainFrame.setVisible(true);
    }

}


На студенческую работу сойдет  smile 
PM MAIL   Вверх
WandM
Дата 24.10.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 20.11.2005
Где: Питер

Репутация: нет
Всего: нет



Для undo/redo придумана была такая структура данных, как стек.
Я бы со стека начал копать...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.