Skip to content
Snippets Groups Projects
Commit 29172287 authored by Keiko Katsuragawa's avatar Keiko Katsuragawa
Browse files

add 3-0-MVC

parent 4e969ad9
No related branches found
No related tags found
No related merge requests found
package view;
import model.IView;
import model.TriangleModel;
import javax.swing.*;
import java.awt.event.*;
import java.text.NumberFormat;
/*
* View a triangle as text: numbers for the base, height, and hypotenuse.
* This view leaves a lot to be desired in terms of "polish".
* -- inconsistent decimal precision displayed, esp. in hypotenuse
* -- tabbing or clicking out of a text field doesn't update
* -- can edit the hypotenuse field
*
* @author Byron Weber Becker
*/
public class SimpleTextView extends JPanel implements IView {
private TriangleModel model;
private JTextField baseTF = new JTextField(10);
private JTextField heightTF = new JTextField(10);
private JTextField hypoTF = new JTextField(10);
public SimpleTextView(TriangleModel aModel) {
super();
this.model = aModel;
this.layoutView();
this.registerControllers();
// Add a this view as a listener to the model
this.model.addView(this);
}
/**
* What to do when the model changes.
*/
public void updateView() {
baseTF.setText("" + model.getBase());
heightTF.setText("" + model.getHeight());
hypoTF.setText("" + model.getHypotenuse());
}
private void layoutView() {
this.setLayout(new FormLayout());
this.add(new JLabel("Base:"));
this.add(this.baseTF);
this.add(new JLabel("Height:"));
this.add(this.heightTF);
this.add(new JLabel("Hypotenuse:"));
this.add(this.hypoTF);
}
private void registerControllers() {
// Add a controller to interpret user actions in the base text field
this.baseTF.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
double base = Double.parseDouble(baseTF.getText());
model.setBase(base);
}
});
// Add a controller to interpret user actions in the height text field
this.heightTF.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
double height = Double.parseDouble(heightTF.getText());
model.setHeight(height);
}
});
}
}
\ No newline at end of file
package view;
import model.*;
import javax.swing.*;
import javax.swing.event.*;
public class SliderView extends JPanel {
private TriangleModel model;
private JSlider baseSlider = new JSlider(0, (int) TriangleModel.MAX_HYPO);
private JSlider heightSlider = new JSlider(0, (int) TriangleModel.MAX_HYPO);
private JSlider hypoSlider = new JSlider(0, (int) TriangleModel.MAX_HYPO);
public SliderView(TriangleModel aModel) {
super();
this.model = aModel;
this.layoutView();
this.registerControllers();
this.model.addView(new IView() {
public void updateView() {
baseSlider.setValue((int) model.getBase());
heightSlider.setValue((int) model.getHeight());
hypoSlider.setValue((int) model.getHypotenuse());
}
});
}
private void layoutView() {
this.setLayout(new FormLayout());
this.add(new JLabel("Base:"));
this.add(this.baseSlider);
this.add(new JLabel("Height:"));
this.add(this.heightSlider);
this.add(new JLabel("Hypotenuse:"));
this.add(this.hypoSlider);
this.baseSlider.setMajorTickSpacing((int) TriangleModel.MAX_HYPO / 10);
this.baseSlider.setPaintTicks(true);
this.heightSlider
.setMajorTickSpacing((int) TriangleModel.MAX_HYPO / 10);
this.heightSlider.setPaintTicks(true);
this.hypoSlider.setMajorTickSpacing((int) TriangleModel.MAX_HYPO / 10);
this.hypoSlider.setPaintTicks(true);
this.hypoSlider.setEnabled(false);
}
private void registerControllers() {
this.baseSlider.addChangeListener(new BaseController());
this.heightSlider.addChangeListener(new HeightController());
}
private class BaseController implements ChangeListener {
public void stateChanged(ChangeEvent e) {
double base = baseSlider.getValue();
model.setBase(base);
}
}
private class HeightController implements ChangeListener {
public void stateChanged(ChangeEvent e) {
double height = heightSlider.getValue();
model.setHeight(height);
}
}
}
package view;
import java.text.NumberFormat;
import model.*;
import javax.swing.*;
import javax.swing.event.*;
public class SpinnerView extends JPanel {
private TriangleModel model;
// The spinner requires a number model that specifies the starting
// value, the minimum, maximum, and step size.
private JSpinner base = new JSpinner(new SpinnerNumberModel(1, 1,
TriangleModel.MAX_SIDE, 1));
private JSpinner height = new JSpinner(new SpinnerNumberModel(1, 1,
TriangleModel.MAX_SIDE, 1));
private JLabel hypo = new JLabel();
private static final NumberFormat formatter = NumberFormat
.getNumberInstance();
public SpinnerView(TriangleModel aModel) {
super();
this.model = aModel;
this.layoutView();
this.registerControllers();
this.model.addView(new IView() {
public void updateView() {
base.setValue(new Double(model.getBase()));
height.setValue(new Double(model.getHeight()));
hypo.setText(formatter.format(model.getHypotenuse()));
}
});
}
private void layoutView() {
this.setLayout(new FormLayout());
this.add(new JLabel("Base:"));
this.add(this.base);
this.add(new JLabel("Height:"));
this.add(this.height);
this.add(new JLabel("Hypotenuse:"));
this.add(this.hypo);
}
private void registerControllers() {
// Instantiate an anonymous ChangeListener class.
// Then add it to both spinners. Having one class
// that handles both spinners is one style; I prefer
// having separate listeners, one for each widget.
ChangeListener sc = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSpinner src = (JSpinner) e.getSource();
double val = ((Double) src.getValue()).doubleValue();
if (src == SpinnerView.this.base) {
SpinnerView.this.model.setBase(val);
} else if (src == SpinnerView.this.height) {
SpinnerView.this.model.setHeight(val);
} else {
assert false;
}
}
};
this.base.addChangeListener(sc);
this.height.addChangeListener(sc);
}
}
\ No newline at end of file
package view;
import model.IView;
import model.TriangleModel;
import javax.swing.*;
import java.awt.event.*;
import java.text.NumberFormat;
/*
* View a triangle as text: numbers for the base, height, and hypotenuse.
*
* @author Byron Weber Becker
*/
public class TextView extends JPanel {
private TriangleModel model;
private JTextField baseTF = new JTextField(10);
private JTextField heightTF = new JTextField(10);
private JTextField hypoTF = new JTextField(10);
// To format numbers consistently in the text fields.
private static final NumberFormat formatter = NumberFormat
.getNumberInstance();
public TextView(TriangleModel aModel) {
super();
this.model = aModel;
this.layoutView();
this.registerControllers();
// There's no need to do this for such a simple view, but for a complex
// view you might have several ViewUpdate objects registered with
// the model.
this.model.addView(new IView() {
public void updateView() {
baseTF.setText(formatter.format(model.getBase()));
heightTF.setText(formatter.format(model.getHeight()));
}
});
this.model.addView(new IView() {
public void updateView() {
hypoTF.setText(formatter.format(model.getHypotenuse()));
}
});
}
private void layoutView() {
this.setLayout(new FormLayout());
this.add(new JLabel("Base:"));
this.add(this.baseTF);
this.add(new JLabel("Height:"));
this.add(this.heightTF);
this.add(new JLabel("Hypotenuse:"));
this.add(this.hypoTF);
// Don't allow the user to edit the hypotenuse
this.hypoTF.setEditable(false); // can still select and copy
//this.hypoTF.setEnabled(false); // greyed out, can't select
}
private void registerControllers() {
this.baseTF.addActionListener(new BaseController());
this.baseTF.addFocusListener(new BaseFocusController());
CombinedHeightController hc = new CombinedHeightController();
this.heightTF.addActionListener(hc);
this.heightTF.addFocusListener(hc);
}
private class BaseController implements ActionListener {
public void actionPerformed(ActionEvent evt) {
double base = Double.parseDouble(baseTF.getText());
model.setBase(base);
}
}
private class BaseFocusController implements FocusListener {
public void focusGained(FocusEvent evt) {
//baseTF.selectAll();
}
public void focusLost(FocusEvent evt) {
// Note duplicated code.
double value = Double.parseDouble(baseTF.getText());
model.setBase(value);
}
}
private class CombinedHeightController implements ActionListener,
FocusListener {
private void setHeight() {
double height = Double.parseDouble(heightTF.getText());
model.setHeight(height);
}
public void actionPerformed(ActionEvent evt) {
this.setHeight();
}
public void focusGained(FocusEvent evt) {
//heightTF.selectAll();
}
public void focusLost(FocusEvent evt) {
this.setHeight();
baseTF.requestFocus(); // skip over hypotenuse
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment