Hallo,
Wir sollen einen Ocean mit folgenden Eigenschaften programmieren:
-Ocean soll ein Hintergrundbild haben.
-Dem Ocean sollen Objekte (Fische etc) hinzugefügt werden können.
-Objekte sollen gelöscht werden können.
-Start und Stop button zum starten bzw stoppen der Animation.
Das ganze ist so halbwegs nach dem MVC Muster designed ( die Kommunikation zwischen Model und View findet
ausschließlich über den Controller statt).
Das Model enthält eine LinkedList mit Objekten (diese haben x,y Koordinaten)
Im View befindet sich die GUI.
Der Controller initialisiert beides und enthält die ActionListener.
Das hinzufügen bzw löschen funktioniert soweit jedoch bin ich mir nicht sicher wie ich das ganze nun Animiere.
Ich habe mir verschiede Tutorials durchgelesen die mich aber eher verwirrt haben und für mein Verständnis teilweise sogar widersprüchlich waren.
Hier erst mal der Code:
Controller:
View:
In paintComponent() möchte ich jetzt meine Objekte zeichnen.
Im Controller dann eine Spielschleife oder einen Thread ? erzeugen. Also :
Model.updateGame();
OceanLifeGUI.setOceanObjects(Model.getOceanObjects());
OceanLifeGUI.PaintingSheet.repaint();
Thread.sleep(x);
1.) kann man das so machen oder gibt es bessere Lösungen?
2.) nutze ich im Controller einen Thread oder eine Schleife?
3.) wie sorge ich dafür dass nur die Objekte neue gezeichnet werden nicht aber der Hintergrund? (Dieser bewegt sich ja nicht und muss dann ja nicht neu gezeichnet werden.
Ich danke schon mal im Voraus
Wir sollen einen Ocean mit folgenden Eigenschaften programmieren:
-Ocean soll ein Hintergrundbild haben.
-Dem Ocean sollen Objekte (Fische etc) hinzugefügt werden können.
-Objekte sollen gelöscht werden können.
-Start und Stop button zum starten bzw stoppen der Animation.
Das ganze ist so halbwegs nach dem MVC Muster designed ( die Kommunikation zwischen Model und View findet
ausschließlich über den Controller statt).
Das Model enthält eine LinkedList mit Objekten (diese haben x,y Koordinaten)
Im View befindet sich die GUI.
Der Controller initialisiert beides und enthält die ActionListener.
Das hinzufügen bzw löschen funktioniert soweit jedoch bin ich mir nicht sicher wie ich das ganze nun Animiere.
Ich habe mir verschiede Tutorials durchgelesen die mich aber eher verwirrt haben und für mein Verständnis teilweise sogar widersprüchlich waren.
Hier erst mal der Code:
Controller:
Java:
package infpp.oceanlife;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
public class OceanLifeController {
private OceanLifeModel oceanLifeModel;
private OceanLifeView oceanLifeView;
public OceanLifeController() {
oceanLifeModel = new OceanLifeModel();
oceanLifeView = new OceanLifeView(oceanLifeModel.ocean.getAvailableOceanObjects());
addListeners();
}
public void start() {
//TODO test löschen
oceanLifeView.oceanLifeConsoleView.printOceanData(oceanLifeModel.ocean.toString());
for (int i = 0; i < 1; i++) {
oceanLifeModel.ocean.move();
upDateDeleteBox();
oceanLifeView.oceanLifeConsoleView.printOceanData(oceanLifeModel.ocean.toString());
}
}
private void upDateDeleteBox(){
oceanLifeView.oceanLifeGUI.updateDeleteComboBox(oceanLifeModel.ocean.getOceanObjectsAsStringList());
}
private void addListeners() {
oceanLifeView.oceanLifeGUI.setAddListener(new AddListener());
oceanLifeView.oceanLifeGUI.setDeleteListener(new DeleteListener());
oceanLifeView.oceanLifeGUI.setSaveListener(new SaveListener());
oceanLifeView.oceanLifeGUI.setLoadListener(new LoadListener());
oceanLifeView.oceanLifeGUI.setStartListener(new StartListener());
oceanLifeView.oceanLifeGUI.setStopListener(new StopListener());
oceanLifeView.oceanLifeGUI.setStepListener(new StepListener());
}
class AddListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String object = oceanLifeView.oceanLifeGUI.getAddCbValue();
if (oceanLifeView.oceanLifeGUI.getXFieldValue().equals("") || oceanLifeView.oceanLifeGUI.getXFieldValue().equals("")) {
oceanLifeModel.ocean.addOceanObject(object);
} else {
int x = Integer.parseInt(oceanLifeView.oceanLifeGUI.getXFieldValue());
int y = Integer.parseInt(oceanLifeView.oceanLifeGUI.getYFieldValue());
oceanLifeModel.ocean.addOceanObject(object, x, y);
}
oceanLifeView.oceanLifeConsoleView.printOceanData(oceanLifeModel.ocean.toString());
upDateDeleteBox();
}
}
class DeleteListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//TODO test löschen
System.out.println(oceanLifeView.oceanLifeGUI.getDeleteIndex());
int deleteIndex = oceanLifeView.oceanLifeGUI.getDeleteIndex();
if (deleteIndex >= 0){
oceanLifeModel.ocean.deleteObjectAtIndex(deleteIndex);
//TODO test löschen
upDateDeleteBox();
System.out.println("delete");
}else{
System.out.println("nothing selected");
}
}
}
class SaveListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("save");
}
}
class LoadListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("load");
}
}
class StartListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("start");
}
}
class StopListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("stop");
}
}
class StepListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
oceanLifeModel.ocean.move();
//TODO test löschen ?
upDateDeleteBox();
oceanLifeView.oceanLifeConsoleView.printOceanData(oceanLifeModel.ocean.toString());
}
}
}
View:
Java:
package infpp.oceanlife;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.util.LinkedList;
public class OceanLifeGUI extends JFrame {
// topLeft
JComboBox addComboBox;
JLabel x = new JLabel("X:");
JLabel y = new JLabel("Y:");
JTextField xField = new JTextField(4);
JTextField yField = new JTextField(4);
JButton addObject = new JButton("ADD");
// topRight
JComboBox deleteComboBox = new JComboBox();
JButton delete = new JButton("DELETE");
// bottomLeft
JButton save = new JButton("SAVE");
JButton load = new JButton("LOAD");
JButton quit = new JButton("QUIT");
// bottomRight
JButton start = new JButton("START");
JButton stop = new JButton("STOP");
JButton step = new JButton("STEP");
OceanLifeGUI(String[] availableOceanObjects) {
setTitle("OceanLife");
addComboBox = new JComboBox(availableOceanObjects);
//Icons
addObject.setIcon(new ImageIcon("src/resources/add.png"));
delete.setIcon(new ImageIcon("src/resources/delete.png"));
save.setIcon(new ImageIcon("src/resources/save.png"));
load.setIcon(new ImageIcon("src/resources/load.png"));
quit.setIcon(new ImageIcon("src/resources/quit.png"));
start.setIcon(new ImageIcon("src/resources/start.png"));
stop.setIcon(new ImageIcon("src/resources/stop.png"));
step.setIcon(new ImageIcon("src/resources/step.png"));
//panels
JPanel top = new JPanel(); // contains topLeft,topRight
JPanel bottom = new JPanel(); // contains bottomLeft, bottomRight
JPanel topleft = new JPanel(); // contains add Object
JPanel topRight = new JPanel(); // contains delete Object
JPanel bottomLeft = new JPanel(); // contains save, load
JPanel bottomRight = new JPanel(); // contains start, stop, step
PaintingSheet paintingSheet = new PaintingSheet(); // draw area
topleft.add(addComboBox);
topleft.add(x);
topleft.add(xField);
topleft.add(y);
topleft.add(yField);
topleft.add(addObject);
topRight.add(deleteComboBox);
topRight.add(delete);
bottomLeft.add(save);
bottomLeft.add(load);
bottomLeft.add(step);
bottomRight.add(start);
bottomRight.add(stop);
bottomRight.add(step);
top.setLayout(new BorderLayout());
top.add(topleft, BorderLayout.WEST);
top.add(topRight, BorderLayout.EAST);
bottom.setLayout(new BorderLayout());
bottom.add(bottomLeft, BorderLayout.WEST);
bottom.add(bottomRight, BorderLayout.EAST);
this.add(top, BorderLayout.NORTH);
this.add(bottom, BorderLayout.SOUTH);
this.add(paintingSheet, BorderLayout.CENTER);
// ...
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1920, 1180);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setVisible(true);
}
public class PaintingSheet extends JPanel {
private Image background;
public PaintingSheet() {
this.background = Toolkit.getDefaultToolkit().createImage("src/resources/background.jpg");
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(this.background, 0,0, this);
}
}
public void updateDeleteComboBox(LinkedList<String> objectStrings){
deleteComboBox.removeAllItems();
for (String object : objectStrings ){
deleteComboBox.addItem(object);
}
}
public String getAddCbValue() {
return String.valueOf(addComboBox.getSelectedItem());
}
public String getXFieldValue() {
return xField.getText();
}
public String getYFieldValue() {
return yField.getText();
}
public int getDeleteIndex() {
return deleteComboBox.getSelectedIndex();
}
public void setAddListener(ActionListener l) {
addObject.addActionListener(l);
}
public void setDeleteListener(ActionListener l) {
delete.addActionListener(l);
}
public void setSaveListener(ActionListener l) {
save.addActionListener(l);
}
public void setLoadListener(ActionListener l) {
load.addActionListener(l);
}
public void setStartListener(ActionListener l) {
start.addActionListener(l);
}
public void setStopListener(ActionListener l) {
stop.addActionListener(l);
}
public void setStepListener(ActionListener l) {
step.addActionListener(l);
}
}
In paintComponent() möchte ich jetzt meine Objekte zeichnen.
Im Controller dann eine Spielschleife oder einen Thread ? erzeugen. Also :
Model.updateGame();
OceanLifeGUI.setOceanObjects(Model.getOceanObjects());
OceanLifeGUI.PaintingSheet.repaint();
Thread.sleep(x);
1.) kann man das so machen oder gibt es bessere Lösungen?
2.) nutze ich im Controller einen Thread oder eine Schleife?
3.) wie sorge ich dafür dass nur die Objekte neue gezeichnet werden nicht aber der Hintergrund? (Dieser bewegt sich ja nicht und muss dann ja nicht neu gezeichnet werden.
Ich danke schon mal im Voraus