Back to slide -- Keyboard shortcut: 'u'  next  next  DivModApplication.java - Kalkulator applikationen i Swing.Lecture 13 - slide 9 : 30
Program 2

/* DivMod eksemplet som Swing applikation */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class DivModApplication {
  public static void main (String[] args){

      JFrame f = new JFrame("Div Mod Application");
      Container contentPane = f.getContentPane();

      f.addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
              System.exit(0);
            }
        });

      DivModPresenter presenter = new DivModPresenter();
      presenter.init();
      contentPane.add("Center", presenter);
      f.pack();
      f.setVisible(true);
  }
} // end DivModApplication


// THE VIEW CLASS
class DivModPresenter extends JPanel{

   private DivModCalculator modelObject;
   private DivModListener listener;

   private JLabel title;
   private JTextField dividend, divisor;
   private JLabel quotient,rest;

   public DivModPresenter(){
     modelObject = new DivModCalculator (this);
     listener = new DivModListener (modelObject, this);

     title = new JLabel ("Div Mod Calculator");
     dividend = new JTextField ("0",5);
     divisor = new JTextField ("0",5);
     quotient = new JLabel ("Kvotient:");
     rest = new JLabel ("Rest:") ;
    }

   public int getDividend(){
     String strResult = dividend.getText();
     return Integer.parseInt(strResult);
   }

   public int getDivisor(){
     String strResult = divisor.getText();
     return Integer.parseInt(strResult);
   }

   public void init() {
     dividend.addActionListener (listener);
     divisor.addActionListener (listener);

     setLayout(new GridLayout(6,1));

     add(title);
     add(divisor);  add(dividend); 
     add(quotient); add(rest); 
   }
 
   public void showResult(IntPair quotientRest){
     quotient.setText("Kvotient: " + Integer.toString(quotientRest.firstInt,10));
     rest.setText("Rest: " + Integer.toString(quotientRest.secondInt,10));
   }
} // end DivModPresenter

class IntPair {
  public int firstInt, secondInt;

  public IntPair(int firstInt, int secondInt){
    this.firstInt = firstInt;
    this.secondInt = secondInt;
  }
}

// THE MODEL CLASS
class DivModCalculator {

  private DivModPresenter viewObject;

  IntPair inputMemory, outputMemory;

  public DivModCalculator(DivModPresenter viewObject) {
    this.viewObject = viewObject;
    inputMemory = null; outputMemory = null;
  }
   
  private IntPair divMod(int x, int y){
    // require x > 0 && y > 0;

    int rest = x;
    int quotient = 0;
    
    while (rest >= y) {
      // invariant rest + quotient * y = x;
      rest = rest - y;
      quotient = quotient + 1;
    }
    return (new IntPair(quotient,rest));
    // ensure  rest + quotient * y = x && rest < y && rest >= 0;
  } // end div

  public void doCalculate(int input1, int input2){
    inputMemory = new IntPair(input1, input2);
    if (input1 > 0 && input2 > 0)
      outputMemory = divMod(input1, input2);
    else
      outputMemory = new IntPair(-1, -1);

    // update the view - in an easy but primitive way:
    viewObject.showResult(outputMemory);
  }
} // end DivModCalculator

// THE CONTROLLER CLASS
class DivModListener implements ActionListener{

  private DivModCalculator modelObject;
  private DivModPresenter viewObject;

  public DivModListener(DivModCalculator modelObject, DivModPresenter viewObject){
    this.modelObject = modelObject;
    this.viewObject = viewObject;
  }

  public void actionPerformed(ActionEvent action){
    modelObject.doCalculate(viewObject.getDivisor(), viewObject.getDividend());
  }

} // end DivModListener