package mvc;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
interface ModelInterface {
void on();
void stop();
void setData();
String getData();
void changeState();
void register(EasyObserver o);
void notifyObservers();
}
interface ControllerInterface {
void start();
void stop();
void changeState();
}
interface EasyObserver {
void update();
}
class View extends JFrame implements ActionListener, EasyObserver {
/**
*
*/
private static final long serialVersionUID = 1L;
private ControllerInterface controller;
private ModelInterface model;
private final JTextField text = new JTextField();
private final JButton button = new JButton("Start");
private void init() {
this.setLocation(200, 200);
button.addActionListener(this);
text.setForeground(Color.RED);
text.setEnabled(false);
Container c = this.getContentPane();
c.setLayout(new BorderLayout());
c.add(text, BorderLayout.CENTER);
c.add(button, BorderLayout.SOUTH);
this.pack();
this.setResizable(false);
this.setVisible(true);
}
public View(ControllerInterface controller, ModelInterface model) {
super("MVC");
this.controller = controller;
this.model = model;
model.register(this);
this.controller.start();
init();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void changeState() {
if (button.getText().equals("Start"))
button.setText("Stop");
else
button.setText("Start");
controller.changeState();
}
public void actionPerformed(ActionEvent e) {
changeState();
}
public void update() {
text.setText(model.getData());
}
}
class Controller implements ControllerInterface {
private ModelInterface model;
public Controller(ModelInterface model) {
this.model = model;
}
public void start() {
model.on();
}
public void stop() {
model.stop();
}
public void changeState() {
model.changeState();
}
}
class Model extends Thread implements ModelInterface {
private final Random random = new Random();
ArrayList<EasyObserver> observers = new ArrayList<EasyObserver>();
private volatile boolean isTrue = true;
Object locker = new Object();
public Model() {
}
public void on() {
start();
}
public void run() {
while (true) {
try {
synchronized (this) {
while(isTrue) {
wait();
}
notifyObservers();
}
} catch (InterruptedException e) {
}
}
}
public String getData() {
return new Integer(Math.abs(random.nextInt())).toString();
}
public void register(EasyObserver t) {
observers.add(t);
}
public void setData() {
}
public synchronized void changeState() {
if (isTrue == true)
notify();
isTrue = !isTrue;
}
public void notifyObservers() {
for (EasyObserver o : observers) {
o.update();
}
}
}
public class MVC {
public static void main(String[] args) {
ModelInterface model = new Model();
ControllerInterface controller = new Controller(model);
new View(controller, model);
}
}