Hallo Leute,
ich lese schon eine Weile hier im Forum sehr interessiert mit und viele Beiträge haben mir, als Java Anfänger, auch schon über einige Hürden hinweg geholfen. Jetzt komme ich an einer Stelle nicht weiter und kann auch leider dafür keine wirkliche Lösung finden. Vielleicht könnt Ihr mir ja weiterhelfen.
Zuerst einmal grundlegendes zum Projekt. Es soll einmal ein Tool zur Erstellung und Veränderung von Charakteren eines P&P Rollenspiels werden. Das heißt, ich werde einige verschiedene Klassen haben, die wiederum Werte und andere Daten verwalten und zB. Berechnungen ausführen. Angezeigt und verändert soll dies über eine Gui, in der die Daten je nach Eingabe des Users aktuell dargestellt werden. Um diese doch recht umfangreichen verschiedenen Klassen und Daten Einigermassen übersichtlich und erweiterungsfähig zu halten, möchte ich das ganze mit einem MVC Observer-Pattern realisieren.
Bei dem Observer/Observable liegt nun mein Problem. Grundsätzlich bräuchte ich dafür die Möglichkeit mit meinem/-n Observer(n) mehrere Observables zu beobachten. Leider reicht mein Können und auch mein Verständnis noch nicht ganz dafür aus. Ich kann leider kein konkretes Code Beispiel finden, das mir zeigt wie die Syntax aussehen müsste und an welcher Stelle das einzubauen wäre.
Um jetzt nicht einen riesigen Quellcode zu posten habe ich 2 Klassen mit Daten, die Gui, den Controller und die Startklasse mal in ein kleines Testprogramm gepackt und ich hoffe ihr könnt damit was anfangen. Programmiert wird mit Eclipse Helios und Java6/Swing. Bitte verhaut mich nicht gleich, ich bin noch arger Anfänger und es kann bestimmt vieles anders und besser gelöst werden. J
Anregungen, Kritik, Tipps und Hilfe sind jederzeit willkommen. Vielen Dank schon mal im vorraus an euch.
Silvia
ich lese schon eine Weile hier im Forum sehr interessiert mit und viele Beiträge haben mir, als Java Anfänger, auch schon über einige Hürden hinweg geholfen. Jetzt komme ich an einer Stelle nicht weiter und kann auch leider dafür keine wirkliche Lösung finden. Vielleicht könnt Ihr mir ja weiterhelfen.
Zuerst einmal grundlegendes zum Projekt. Es soll einmal ein Tool zur Erstellung und Veränderung von Charakteren eines P&P Rollenspiels werden. Das heißt, ich werde einige verschiedene Klassen haben, die wiederum Werte und andere Daten verwalten und zB. Berechnungen ausführen. Angezeigt und verändert soll dies über eine Gui, in der die Daten je nach Eingabe des Users aktuell dargestellt werden. Um diese doch recht umfangreichen verschiedenen Klassen und Daten Einigermassen übersichtlich und erweiterungsfähig zu halten, möchte ich das ganze mit einem MVC Observer-Pattern realisieren.
Bei dem Observer/Observable liegt nun mein Problem. Grundsätzlich bräuchte ich dafür die Möglichkeit mit meinem/-n Observer(n) mehrere Observables zu beobachten. Leider reicht mein Können und auch mein Verständnis noch nicht ganz dafür aus. Ich kann leider kein konkretes Code Beispiel finden, das mir zeigt wie die Syntax aussehen müsste und an welcher Stelle das einzubauen wäre.
Um jetzt nicht einen riesigen Quellcode zu posten habe ich 2 Klassen mit Daten, die Gui, den Controller und die Startklasse mal in ein kleines Testprogramm gepackt und ich hoffe ihr könnt damit was anfangen. Programmiert wird mit Eclipse Helios und Java6/Swing. Bitte verhaut mich nicht gleich, ich bin noch arger Anfänger und es kann bestimmt vieles anders und besser gelöst werden. J
Java:
package silviTest;
import java.util.Observable;
/**
* @author silvia
*
*/
public class DatenModel extends Observable {
private int mut; //Grundwert für Mut
private int klugheit; // Grundwert Klugheit
private int konst; // Grundwert Konstitution
private int mr; // ist die Magieresistenz
/**
* @return mutwert
*/
public int getMut() {
return mut;
}
/**
* @param mut ist der Mut, der gesetzt wird
*/
public void setMut(int mut) {
this.mut = mut;
setChanged();
notifyObservers(this);
}
public int getKlugheit() {
return klugheit;
}
public void setKlugheit(int klugheit) {
this.klugheit = klugheit;
setChanged();
notifyObservers(this);
}
public int getKonst() {
return konst;
}
public void setKonst(int konst) {
this.konst = konst;
setChanged();
notifyObservers(this);
}
public int getMr() {
return mr;
}
public void setMr(int mr) {
this.mr = mr;
setChanged();
notifyObservers(this);
}
}
Java:
package silviTest;
import java.util.Observable;
/**
* @author silvia
*
*/
public class BasiswerteBerechnungen extends Observable {
private int berechneMr;
int mr_berechnet;
/**
* @param mut
* @param klugheit
* @param konst
* @return mr
*/
public static int berechneMR(int mut, int klugheit, int konst) {
int mr_berechnet = Math.round((mut + klugheit + konst) / 5);
return mr_berechnet;
}
public void changeMr() {
setBerechneMr(berechneMr);
setChanged();
notifyObservers(this); // eine Problemzone, ist das hier so richtig ?
}
public void setBerechneMr(int berechneMr) {
this.berechneMr = berechneMr;
}
public int getBerechneMr() {
return berechneMr;
}
}
Java:
package silviTest;
import java.util.Observable;
import java.util.Observer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* @author silvia
*
*/
public class TestController implements Observer {
private DatenModel daten;
private GraphischeOberflaeche fenster;
private BasiswerteBerechnungen basis;
/**
* initialisierung der beobachteten Klassen und Felder/Daten
* anhängen des observers und der Methoden,Listener
*/
public TestController() {
daten = new DatenModel();
fenster = new GraphischeOberflaeche();
// basis = new BasiswerteBerechnungen(); // wäre das hier so richtig?
daten.addObserver(this);
//basis.addObserver(this);
fenster.getMutSpinner().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
daten.setMut(((Integer) fenster.mutFeld.getValue()).intValue());
basis.changeMr();
}
});
fenster.getKlSpinner().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
daten.setKlugheit(((Integer) fenster.klugheitFeld.getValue()).intValue());
basis.changeMr();
}
});
fenster.getKonstSpinner().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
daten.setKonst(((Integer) fenster.konstitutionFeld.getValue()).intValue());
basis.changeMr();
}
});
}
@Override
public void update(Observable o, Object arg1) {
DatenModel model = (DatenModel) arg1;
BasiswerteBerechnungen basismodel = (BasiswerteBerechnungen) arg1; // hier bekomme ich die Fehler Exception: Kann nicht auf Basiswerte casten
fenster.mutLbl.setText(String.valueOf(model.getMut()));
fenster.klugheitLbl.setText(String.valueOf(model.getKlugheit()));
fenster.konstLbl.setText(String.valueOf(model.getKonst()));
fenster.mrLbl.setText(String.valueOf(basismodel.getBerechneMr()));
}
}
Java:
package silviTest;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.text.JTextComponent;
/**
* @author silvia
*
*/
public class GraphischeOberflaeche extends JFrame implements FocusListener {
// Label zur Anzeige und Kontrolle der Daten,Berechnungen
JLabel mutLbl = new JLabel("");
JLabel klugheitLbl = new JLabel("");
JLabel konstLbl = new JLabel("");
JLabel mrLbl = new JLabel("");
JSpinner mutFeld = new JSpinner(new SpinnerNumberModel(8, 0, 21, 1));
JSpinner klugheitFeld = new JSpinner(new SpinnerNumberModel(8, 0, 21, 1));
JSpinner konstitutionFeld = new JSpinner(new SpinnerNumberModel(8, 0, 21, 1));
GridBagConstraints gbc = new GridBagConstraints();
/**
* setzen der Fensterparameter
*/
public GraphischeOberflaeche() {
super("Controller -> MVC Test");
setSize(1024, 600);
setVisible(true);
setLayout(new GridBagLayout());
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(3, 1, 3, 1);
setBackground(Color.yellow);
labelHinzufuegen(mutLbl, 0, 0);
labelHinzufuegen(klugheitLbl, 0, 1);
labelHinzufuegen(konstLbl, 0, 2);
labelHinzufuegen(mrLbl, 3, 2);
spinnerHinzufuegen(mutFeld, 2, 0, "Mut");
spinnerHinzufuegen(klugheitFeld, 2, 1, "KLugheit");
spinnerHinzufuegen(konstitutionFeld, 2, 2, "Konstitution");
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/**
* @param label
* @param x
* @param y
*/
public void labelHinzufuegen(JLabel label, int x, int y) {
gbc.gridx = x;
gbc.gridy = y;
add(label, gbc);
}
/**
* @param spinner
* @param x
* @param y
* @param tooltip
*/
public void spinnerHinzufuegen(JSpinner spinner, int x, int y, String tooltip) {
gbc.gridx = x;
gbc.gridy = y;
add(spinner, gbc);
spinner.setToolTipText(tooltip);
((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().addFocusListener(this);
}
/**
* @return mut
*/
public JSpinner getMutSpinner() {
return mutFeld;
}
/**
* @return klugheit
*/
public JSpinner getKlSpinner() {
return klugheitFeld;
}
/**
* @return konst
*/
public JSpinner getKonstSpinner() {
return konstitutionFeld;
}
@Override
public void focusGained(FocusEvent e) {
if (e.getSource() instanceof JTextComponent) {
final JTextComponent textComponent = ((JTextComponent) e.getSource());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
textComponent.selectAll();
}
});
}
}
@Override
public void focusLost(FocusEvent e) {
}
}
Java:
package silviTest;
import javax.swing.SwingUtilities;
/**
* @author silvia
*
*/
public class Main {
public static void main(String[] args) {
Runnable gui = new Runnable() {
@Override
public void run() {
new TestController();
}
};
SwingUtilities.invokeLater(gui);
}
}
Anregungen, Kritik, Tipps und Hilfe sind jederzeit willkommen. Vielen Dank schon mal im vorraus an euch.
Silvia