This commit is contained in:
2022-05-22 23:34:42 +08:00
parent d0416b02bd
commit a9f7967976
30 changed files with 904 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
public class Controller {
protected Model m;
public Controller(Model m) {
this.m = m;
}
// save data before shutdown
protected void shutdown() {
m.saveData();
System.exit(0);
}
}

View File

@@ -0,0 +1,19 @@
import java.awt.Point;
public class ControllerClicks extends Controller {
public ControllerClicks(Model m) {
super(m);
}
public void mouseClicked(Point p) {
m.addPoint(p);
}
public void resetClicked() {
m.clearAllPoints();
}
public void undoClicked() {
m.deleteLastPoint();
}
}

View File

@@ -0,0 +1,106 @@
import java.awt.Point;
import java.util.ArrayList;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Model {
private ArrayList<Point> points;
private ArrayList<ModelListener> listeners;
public Model() {
points = new ArrayList<Point>();
listeners = new ArrayList<ModelListener>();
if (new java.io.File("points.bin").exists()) {
try {
FileInputStream fi = new FileInputStream("points.bin");
ObjectInputStream in = new ObjectInputStream(fi);
points = (ArrayList<Point>) in.readObject();
in.close();
fi.close();
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
} catch (ClassNotFoundException e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
}
public void addListener(ModelListener l) {
listeners.add(l);
}
public ArrayList<Point> getPoints() {
return points;
}
public void addPoint(Point p) {
points.add(p);
notifyListeners();
}
public void clearAllPoints() {
points.clear();
notifyListeners();
}
public void deleteLastPoint() {
if (points.size() > 0) {
points.remove(points.size() - 1);
notifyListeners();
}
}
private void notifyListeners() {
for (ModelListener l : listeners) {
l.update();
}
}
public int numberOfPoints() {
return points.size();
}
public void saveData() {
try {
FileOutputStream f = new FileOutputStream("points.bin");
ObjectOutputStream out = new ObjectOutputStream(f);
out.writeObject(points);
out.close();
f.close();
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(254);
}
}
public static void testModel() {
Model m = new Model();
m.addListener(new ModelListener() {
@Override
public void update() {
System.out.println(true + " (listener)");
}
});
System.out.println(m.getPoints() == m.points);
Point p1 = new Point(1, 2);
Point p2 = new Point(3, 4);
m.addPoint(p1);
m.addPoint(p2);
System.out.println(m.numberOfPoints() == 2);
System.out.println(m.points.get(0) == p1);
System.out.println(m.points.get(1) == p2);
m.deleteLastPoint();
System.out.println(m.numberOfPoints() == 1);
System.out.println(m.points.get(0) == p1);
m.clearAllPoints();
System.out.println(m.numberOfPoints() == 0);
m.notifyListeners();
}
}

View File

@@ -0,0 +1,3 @@
public interface ModelListener {
public void update();
}

View File

@@ -0,0 +1,55 @@
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class MyFrame extends View<ControllerClicks> {
public MyFrame(Model m, ControllerClicks c) {
super(m, c);
this.setTitle("MyFrame Title");
this.setSize(400, 300);
this.setLocationRelativeTo(null);
this.setLayout(new BorderLayout());
// layout
MyPanel centerPanel = new MyPanel(m, c);
this.add(centerPanel, BorderLayout.CENTER);
JPanel topPanel = new JPanel();
this.add(topPanel, BorderLayout.PAGE_START);
// top panel
topPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
JButton resetButton = new JButton("Reset");
resetButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
c.resetClicked();
}
});
JButton undoButton = new JButton("Undo");
undoButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
c.undoClicked();
}
});
topPanel.add(resetButton);
topPanel.add(undoButton);
// final
this.setVisible(true);
}
@Override
public void update() {
repaint();
}
}

View File

@@ -0,0 +1,49 @@
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
public class MyPanel extends JPanel {
private Model m;
private ControllerClicks c;
public MyPanel(Model m, ControllerClicks c) {
this.m = m;
this.c = c;
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
c.mouseClicked(e.getPoint());
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
// Draw the background
super.paintComponent(g);
// Draw the grid
ArrayList<Point> points = m.getPoints();
g.setColor(Color.RED);
// Draw the points
if (points.size() == 1) {
Point p = points.get(0);
g.drawRect((int) p.getX(), (int) p.getY(), 1, 1);
} else {
// Draw the lines
for (int i = 1; i < points.size(); i++) {
Point start = points.get(i - 1);
Point end = points.get(i);
g.drawLine((int) start.getX(), (int) start.getY(), (int) end.getX(), (int) end.getY());
}
}
}
}

View File

@@ -0,0 +1,14 @@
public class Start {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Model model = new Model();
ControllerClicks c1 = new ControllerClicks(model);
MyFrame frame = new MyFrame(model, c1);
Controller c2 = new Controller(model);
ViewNumber vn = new ViewNumber(model, c2);
}
});
}
}

View File

@@ -0,0 +1,5 @@
public class Test {
public static void main(String[] args) {
Model.testModel();
}
}

View File

@@ -0,0 +1,22 @@
import javax.swing.JFrame;
public abstract class View<T extends Controller> extends JFrame implements ModelListener {
protected Model m;
protected T c;
public View(Model m, T c) {
this.m = m;
this.c = c;
m.addListener(this);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); // hide the frame when the user clicks on the close button
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
c.shutdown();
}
});
}
@Override
public abstract void update();
}

View File

@@ -0,0 +1,21 @@
import javax.swing.JLabel;
public class ViewNumber extends View<Controller> {
private JLabel label;
public ViewNumber(Model m, Controller c) {
super(m, c);
this.setTitle("View Number");
this.setSize(150, 150);
label = new JLabel();
update();
this.add(label);
this.setVisible(true);
}
@Override
public void update() {
label.setText("Number of points is: " + m.numberOfPoints());
}
}

View File

@@ -0,0 +1,12 @@
public class Controller {
protected Model m;
public Controller(Model m) {
this.m = m;
}
protected void shutdown() {
m.saveData();
System.exit(0);
}
}

View File

@@ -0,0 +1,19 @@
import java.awt.Point;
public class ControllerClicks extends Controller {
public ControllerClicks(Model m) {
super(m);
}
public void mouseClicked(Point p) {
m.addPoint(p);
}
public void resetClicked() {
m.clearAllPoints();
}
public void undoClicked() {
m.deleteLastPoint();
}
}

View File

@@ -0,0 +1,109 @@
import java.awt.Point;
import java.util.ArrayList;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Model {
private ArrayList<Point> points;
private ArrayList<ModelListener> listeners;
/**
* Constructor
*/
public Model() {
points = new ArrayList<Point>();
listeners = new ArrayList<ModelListener>();
if (new java.io.File("points.bin").exists()) {
// load points from file
try {
FileInputStream fi = new FileInputStream("points.bin");
ObjectInputStream in = new ObjectInputStream(fi);
points = (ArrayList<Point>) in.readObject();
in.close();
fi.close();
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
} catch (ClassNotFoundException e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
}
public void addListener(ModelListener l) {
listeners.add(l);
}
public ArrayList<Point> getPoints() {
return points;
}
public void addPoint(Point p) {
points.add(p);
notifyListeners();
}
public void clearAllPoints() {
points.clear();
notifyListeners();
}
public void deleteLastPoint() {
if (points.size() > 0) {
points.remove(points.size() - 1);
notifyListeners();
}
}
private void notifyListeners() {
for (ModelListener l : listeners) {
l.update();
}
}
public int numberOfPoints() {
return points.size();
}
public void saveData() {
try {
// save points to file
FileOutputStream fo = new FileOutputStream("points.bin");
ObjectOutputStream out = new ObjectOutputStream(fo);
out.writeObject(points);
out.close();
fo.close();
} catch (IOException e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
public static void testModel() {
Model m = new Model();
m.addListener(new ModelListener() {
@Override
public void update() {
System.out.println(true + " (listener)");
}
});
System.out.println(m.getPoints() == m.points);
Point p1 = new Point(1, 2);
Point p2 = new Point(3, 4);
m.addPoint(p1);
m.addPoint(p2);
System.out.println(m.numberOfPoints() == 2);
System.out.println(m.points.get(0) == p1);
System.out.println(m.points.get(1) == p2);
m.deleteLastPoint();
System.out.println(m.numberOfPoints() == 1);
System.out.println(m.points.get(0) == p1);
m.clearAllPoints();
System.out.println(m.numberOfPoints() == 0);
m.notifyListeners();
}
}

View File

@@ -0,0 +1,3 @@
public interface ModelListener {
public void update();
}

View File

@@ -0,0 +1,53 @@
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class MyFrame extends View<ControllerClicks> {
public MyFrame(Model m, ControllerClicks c) {
super(m, c);
this.setTitle("MyFrame Title");
this.setSize(400, 300);
this.setLocationRelativeTo(null);
this.setLayout(new BorderLayout());
MyPanel centerPanel = new MyPanel(m, c);
this.add(centerPanel, BorderLayout.CENTER);
JPanel topPanel = new JPanel();
this.add(topPanel, BorderLayout.PAGE_START);
topPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
JButton resetButton = new JButton("Reset");
resetButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
c.resetClicked();
}
});
topPanel.add(resetButton);
JButton undoButton = new JButton("Undo");
undoButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
c.undoClicked();
}
});
topPanel.add(undoButton);
// final
this.setVisible(true);
}
@Override
public void update() {
repaint();
}
}

View File

@@ -0,0 +1,44 @@
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
public class MyPanel extends JPanel {
private Model m;
private ControllerClicks c;
public MyPanel(Model m, ControllerClicks c) {
this.m = m;
this.c = c;
// add mouse listener
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
c.mouseClicked(e.getPoint());
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
ArrayList<Point> points = m.getPoints();
g.setColor(Color.RED);
if (points.size() == 1) {
Point p = points.get(0);
g.drawRect((int) p.getX(), (int) p.getY(), 1, 1);
} else {
for (int i = 1; i < points.size(); i++) {
Point start = points.get(i - 1);
Point end = points.get(i);
g.drawLine((int) start.getX(), (int) start.getY(), (int) end.getX(), (int) end.getY());
}
}
}
}

View File

@@ -0,0 +1,14 @@
public class Start {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Model model = new Model();
ControllerClicks c1 = new ControllerClicks(model);
MyFrame frame = new MyFrame(model, c1);
Controller c2 = new Controller(model);
ViewNumber vn = new ViewNumber(model, c2);
}
});
}
}

View File

@@ -0,0 +1,5 @@
public class Test {
public static void main(String[] args) {
Model.testModel();
}
}

View File

@@ -0,0 +1,23 @@
import javax.swing.JFrame;
public abstract class View<T extends Controller> extends JFrame implements ModelListener {
protected Model m;
protected T c;
public View(Model m, T c) {
this.m = m;
this.c = c;
m.addListener(this);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
c.shutdown();
}
});
}
@Override
public abstract void update();
}

View File

@@ -0,0 +1,21 @@
import javax.swing.JLabel;
public class ViewNumber extends View<Controller> {
private JLabel label;
public ViewNumber(Model m, Controller c) {
super(m, c);
this.setTitle("View Number");
this.setSize(150, 150);
label = new JLabel();
update();
this.add(label);
this.setVisible(true);
}
@Override
public void update() {
label.setText("Number of points is: " + m.numberOfPoints());
}
}

View File

@@ -0,0 +1,15 @@
public class Controller {
protected Model m;
public Controller(Model m) {
this.m = m;
}
/**
* Gracefully exits the program.
*/
protected void shutdown() {
m.saveData();
System.exit(0);
}
}

View File

@@ -0,0 +1,19 @@
import java.awt.Point;
public class ControllerClicks extends Controller {
public ControllerClicks(Model m) {
super(m);
}
public void mouseClicked(Point p) {
m.addPoint(p);
}
public void resetClicked() {
m.clearAllPoints();
}
public void undoClicked() {
m.deleteLastPoint();
}
}

View File

@@ -0,0 +1,104 @@
import java.awt.Point;
import java.util.ArrayList;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Model {
private ArrayList<Point> points;
private ArrayList<ModelListener> listeners;
public Model() {
points = new ArrayList<Point>();
listeners = new ArrayList<ModelListener>();
// msw-sh wg. DB-Verbindung
try (Connection conn = DriverManager.getConnection("jdbc:mysql://msw-sh.local:3306/java", "hmsy",
"woshimima");
Statement stmt = conn.createStatement();) {
ResultSet rs = stmt.executeQuery("SELECT * FROM points");
while (rs.next()) {
points.add(new Point(rs.getInt("x"), rs.getInt("y")));
}
} catch (SQLException e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
public void addListener(ModelListener l) {
listeners.add(l);
}
public ArrayList<Point> getPoints() {
return points;
}
public void addPoint(Point p) {
points.add(p);
notifyListeners();
}
public void clearAllPoints() {
points.clear();
notifyListeners();
}
public void deleteLastPoint() {
if (points.size() > 0) {
points.remove(points.size() - 1);
notifyListeners();
}
}
private void notifyListeners() {
for (ModelListener l : listeners) {
l.update();
}
}
public int numberOfPoints() {
return points.size();
}
// save to DB
public void saveData() {
try (Connection conn = DriverManager.getConnection("jdbc:mysql://msw-sh.local:3306/java", "hmsy",
"woshimima");
Statement stmt = conn.createStatement();) {
// delete all points
stmt.executeUpdate("DELETE FROM points");
for (Point p : points) {
stmt.executeUpdate("INSERT INTO points (x, y) VALUES (" + p.x + ", " + p.y + ")");
}
} catch (SQLException e) {
System.err.println(e.getMessage());
System.exit(2);
}
}
public static void testModel() {
Model m = new Model();
m.addListener(new ModelListener() {
@Override
public void update() {
System.out.println(true + " (listener)");
}
});
System.out.println(m.getPoints() == m.points);
Point p1 = new Point(1, 2);
Point p2 = new Point(3, 4);
m.addPoint(p1); // Listener called.
m.addPoint(p2); // Listener called.
System.out.println(m.numberOfPoints() == 2);
System.out.println(m.points.get(0) == p1);
System.out.println(m.points.get(1) == p2);
m.deleteLastPoint(); // Listener called.
System.out.println(m.numberOfPoints() == 1);
System.out.println(m.points.get(0) == p1);
m.clearAllPoints(); // Listener called.
System.out.println(m.numberOfPoints() == 0);
m.notifyListeners(); // Listener called.
}
}

View File

@@ -0,0 +1,3 @@
public interface ModelListener {
public void update();
}

View File

@@ -0,0 +1,51 @@
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class MyFrame extends View<ControllerClicks> {
public MyFrame(Model m, ControllerClicks c) {
super(m, c);
this.setTitle("MyFrame Title");
this.setSize(400, 300);
this.setLocationRelativeTo(null);
this.setLayout(new BorderLayout());
MyPanel centerPanel = new MyPanel(m, c);
this.add(centerPanel, BorderLayout.CENTER);
JPanel topPanel = new JPanel();
this.add(topPanel, BorderLayout.PAGE_START);
topPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
JButton resetButton = new JButton("Reset");
resetButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
c.resetClicked();
}
});
topPanel.add(resetButton);
JButton undoButton = new JButton("Undo");
undoButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
c.undoClicked();
}
});
topPanel.add(undoButton);
// final
this.setVisible(true);
}
@Override
public void update() {
repaint();
}
}

View File

@@ -0,0 +1,42 @@
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
public class MyPanel extends JPanel {
private Model m;
private ControllerClicks c;
public MyPanel(Model m, ControllerClicks c) {
this.m = m;
this.c = c;
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
c.mouseClicked(e.getPoint());
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
ArrayList<Point> points = m.getPoints();
g.setColor(Color.RED);
if (points.size() == 1) {
Point p = points.get(0);
g.drawRect((int) p.getX(), (int) p.getY(), 1, 1);
} else {
for (int i = 1; i < points.size(); i++) {
Point start = points.get(i - 1);
Point end = points.get(i);
g.drawLine((int) start.getX(), (int) start.getY(), (int) end.getX(), (int) end.getY());
}
}
}
}

View File

@@ -0,0 +1,14 @@
public class Start {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Model model = new Model();
ControllerClicks c1 = new ControllerClicks(model);
MyFrame frame = new MyFrame(model, c1);
Controller c2 = new Controller(model);
ViewNumber vn = new ViewNumber(model, c2);
}
});
}
}

View File

@@ -0,0 +1,5 @@
public class Test {
public static void main(String[] args) {
Model.testModel();
}
}

View File

@@ -0,0 +1,21 @@
import javax.swing.JFrame;
public abstract class View<T extends Controller> extends JFrame implements ModelListener {
protected Model m;
protected T c;
public View(Model m, T c) {
this.m = m;
this.c = c;
m.addListener(this);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
c.shutdown();
}
});
}
@Override
public abstract void update();
}

View File

@@ -0,0 +1,20 @@
import javax.swing.JLabel;
public class ViewNumber extends View<Controller> {
private JLabel label;
public ViewNumber(Model m, Controller c) {
super(m, c);
this.setTitle("View Number");
this.setSize(150, 150);
label = new JLabel();
update();
this.add(label);
this.setVisible(true);
}
@Override
public void update() {
label.setText("Number of points is: " + m.numberOfPoints());
}
}