Hi,
ich muss mich für ein Prog fürs Studium streng an MVc halten, deshalb hab ich die Klassen schön zerstückelt. Nun hab ich in der Controlklasse einen MouseMove abgerufen und über einen Observer an eine Klasse, die fürs View zuständig ist weitergeleitet. Diese Klasse soll die Hintergrundfarbe von Buttons verändern, muss dazu aber auf die Buttons von einer anderen Klasse zugreifen. wie stell ich das an? Ich habe eine Funktion getButtonfeld(int, int) in der Klasse, wo drauf zugegriffen werden muss, aber es kommen nur Fehler zustande.
Hier mal die wichtigen Codes der beteiligten Klassen (alles unwichtige zwischendrin entfernt):
SchiffeControl.java
Spielfeld.java
Zeichnen.java
Layout.java
ich muss mich für ein Prog fürs Studium streng an MVc halten, deshalb hab ich die Klassen schön zerstückelt. Nun hab ich in der Controlklasse einen MouseMove abgerufen und über einen Observer an eine Klasse, die fürs View zuständig ist weitergeleitet. Diese Klasse soll die Hintergrundfarbe von Buttons verändern, muss dazu aber auf die Buttons von einer anderen Klasse zugreifen. wie stell ich das an? Ich habe eine Funktion getButtonfeld(int, int) in der Klasse, wo drauf zugegriffen werden muss, aber es kommen nur Fehler zustande.
Hier mal die wichtigen Codes der beteiligten Klassen (alles unwichtige zwischendrin entfernt):
SchiffeControl.java
Code:
public class SchiffeControl extends Observable implements MouseInputListener
{
private int x, y;
public SchiffeControl() {}
public void mouseMoved(MouseEvent e)
{
// 3 Pixel Korrektur bei x
x = e.getComponent().getLocationOnScreen().x + e.getX() - 3;
y = e.getComponent().getLocationOnScreen().y + e.getY();
setChanged();
notifyObservers( e );
}
}
Spielfeld.java
Code:
public class Spielfeld extends JPanel
{
private JButton[][] buttonfeld = new JButton[10][10];
private SchiffeControl mouseControl = new SchiffeControl();
private Zeichnen zeichnen = new Zeichnen();
Spielfeld(String user)
{
super(null);
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
buttonfeld[i][j] = new JButton();
buttonfeld[i][j].setBounds(i*20+10,j*20+10,20,20);
buttonfeld[i][j].addMouseListener(mouseControl);
buttonfeld[i][j].addMouseMotionListener(mouseControl);
add( buttonfeld[i][j] );
}
}
mouseControl.addObserver( zeichnen );
}
public JButton getButtonfeld(int i, int j)
{
return buttonfeld[i][j];
}
}
Zeichnen.java
Code:
public class Zeichnen extends Spielfeld implements Observer
{
private int feld_i , feld_j ;
public Zeichnen()
{}
public void update( Observable o, Object obj )
{
//in MouseEvent wandeln
MouseEvent me = (MouseEvent)obj;
//Position berechnen; 3 Pixel Korrektur bei x
int mousePosX = me.getComponent().getLocationOnScreen().x + me.getX() - 3;
int mousePosY = me.getComponent().getLocationOnScreen().y + me.getY();
//Position berechnen
if (mousePosX < 300) //Linkes Spielfeld
{
//Mode=Schiffe Setzen
mousePosX = mousePosX - 10; //linkestes Feld auf x=0 normieren
mousePosY = mousePosY - 34;
feld_i = (mousePosX-(mousePosX%20))/20;
feld_j = (mousePosY-(mousePosY%20))/20;
System.out.println(feld_i + ";" + feld_j);
//Hier soll die hintergrundfarbe vom Buttonfeld aus Spielfeld geändert werden,
//dies klappt nicht
//getButtonfeld(feld_i,feld_j).setBackground(java.awt.Color.red);
}
}
}
Layout.java
Code:
public class Layout extends JPanel
{
private Spielfeld spielflaeche1, spielflaeche2;
public Layout()
{
super();
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
add(spielflaeche1 = new Spielfeld("User"));
add(spielflaeche2 = new Spielfeld("PC"));
reset(spielflaeche1);
reset(spielflaeche2);
}
public void reset(Spielfeld field)
{
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
field.getButtonfeld(i,j).setBackground(java.awt.Color.blue);
field.setWertefeld(i,j,0);
}
}
}
}