Hallo,
in einem Panel zeichne ich horizontale und vertikale Linien. Ich möchte, wenn der User auf einen bestimmten Bereich klickt, dass dieses Linienstück eine andere Farbe bekommt.
Wie kann ich dies anstellen?
Habe es schon mit repaint() versucht, aber leider klappt das nicht.
Klasse Spielfeld: Hier werden die Grundlinien gezeichnet, das klappt auch wunderbar
Die Methode wird auch aufgerufen, aber in der View ist leider keine Änderung.
In der Controller-Klasse ist der Mouse-Listener, der dann das neuzeichnen aktivieren sollte
in einem Panel zeichne ich horizontale und vertikale Linien. Ich möchte, wenn der User auf einen bestimmten Bereich klickt, dass dieses Linienstück eine andere Farbe bekommt.
Wie kann ich dies anstellen?
Habe es schon mit repaint() versucht, aber leider klappt das nicht.
Klasse Spielfeld: Hier werden die Grundlinien gezeichnet, das klappt auch wunderbar
Java:
public class Spielfeld extends JPanel implements MouseListener {
private int anzahlKaestchen;
private int panelgroesse;
private int abstand;
private int index;
private int rand;
private Spiel spiel;
private Spieler s;
private String symbol;
private Graphics g;
public int getAnzahlKaestchen() {
return anzahlKaestchen;
}
public void setAnzahlKaestchen(int anzahlKaestchen) {
this.anzahlKaestchen = anzahlKaestchen;
}
public Spielfeld() {
addMouseListener((MouseListener) new Startcontroller(this));
}
/**
* Methode, um die Linien zu zeichnen
*
* @author Anke
* @param anz
* = Anzahl der Kästchen in der Breite bzw. in der Höhe
* @param g
* = Grafik-Spielfeld
*/
public void spielfeldZeichnen(int anz, Graphics g) {
// panelgroesse = getHeight()-2;
// panelgroesse = Startview1.getPanelgroesse();
panelgroesse = 180;
anzahlKaestchen = 4;
int breite = Integer.parseInt((String) Startview1.getBreite().getSelectedItem());
if (breite != anzahlKaestchen) {
anzahlKaestchen = breite;
}
else {
anzahlKaestchen = anzahlKaestchen;
}
System.out.println("Kästchenbreite = " + anzahlKaestchen);
System.out.println("Panelgroesse = " + panelgroesse);
abstand = panelgroesse / anzahlKaestchen;
Spiel spiel;
// horizontale Linien
for (int y = 0; y <= (panelgroesse); y += abstand) {
g.drawLine(0, y, panelgroesse, y);
}
// vertikalen Linien
for (int x = 0; x <= (panelgroesse); x += abstand) {
g.drawLine(x, 0, x, panelgroesse);
}
this.g = g;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
spielfeldZeichnen(anzahlKaestchen, g);
// paintSpielzug(index, rand, getG());
}
//getter + setter für g
public Graphics getG() {
return g;
}
public void setG(Graphics g) {
this.g = g;
}
....
/**
* Die Methode 'paintSpielzug' setzt den angeklickten Rand in eine andere Farbe
* @param index = Index vom Kästchen
* @param rand = Index vom Rand
* @author Anke
*/
public void paintSpielzug(int index, int rand, Graphics g) {
int i = getIndex();
int r = getRand();
g = getG();
Color farbe = Color.BLUE;
float a;
float b;
a = Startcontroller.getKlick().getX() / abstand;
b = Startcontroller.getKlick().getY() / abstand;
int xa = (int) (a * abstand);
int yb = (int) (b * abstand);
int xa2 = xa + abstand;
int yb2 = yb + abstand;
System.out.println("Rand= "+rand);
System.out.println("xa = " + xa);
System.out.println("yb = " + yb);
System.out.println("x2a = " + xa2);
System.out.println("yb2 = " + yb2);
if (r == 0) {
g.setColor(farbe);
g.drawLine(xa, yb, xa2, yb);
}
else if (r == 1) {
g.setColor(farbe);
g.drawLine(xa2, yb, xa2, yb2);
}
else if (r == 2) {
g.setColor(farbe);
g.drawLine(xa, yb2, xa2, yb2);
}
else {
g.setColor(farbe);
g.drawLine(xa, yb, xa, yb2);
}
this.g = g;
System.out.println("Die Funktion paintSpielzug wird aufgerufen!");
}
Die Methode wird auch aufgerufen, aber in der View ist leider keine Änderung.
In der Controller-Klasse ist der Mouse-Listener, der dann das neuzeichnen aktivieren sollte
Java:
public class Startcontroller implements ActionListener, MouseListener{
private Startview1 startview1;
private Startmodel startmodel;
private Spielfeld spielfeld;
private int x;
private int y;
private static Punkt klick;
private static Punkt kaestchenKoordinate;
public Startcontroller(Startview1 startview1) {
this.startview1 = startview1;
}
public Startcontroller(Spielfeld spielfeld) {
this.spielfeld = spielfeld;
}
public Startmodel getStartmodel() {
return startmodel;
}
public void setStartmodel(Startmodel startmodel) {
this.startmodel = startmodel;
}
public Startview1 getStartview1() {
return startview1;
}
public void setStartview1(Startview1 startview1) {
this.startview1 = startview1;
}
public Spielfeld getSpielfeld() {
return spielfeld;
}
public void setSpielfeld(Spielfeld spielfeld) {
this.spielfeld = spielfeld;
}
//ActionListener rausgenommen)
// Mouseevent fuer Namensfelder
public void mouseClicked(MouseEvent event) {
if (event.getSource() instanceof TextField) {
if (((TextField) event.getSource()).getName() == "Spieler1") {
Startview1.getSpieler1().setText("");
}
else if (((TextField) event.getSource()).getName() == "Spieler2") {
Startview1.getSpieler2().setText("");
}
}
if (event.getSource() instanceof JPanel) {
klick = new Punkt(event.getX(), event.getY());
int i = spielfeld.berechneKaestchenIndex(klick);
int rand = spielfeld.berechneRandIndex(klick, kaestchenKoordinate);
Graphics g = spielfeld.getG();
System.out.println("Kästchen-Index = "+ i + " x= "+ event.getX()+ " Y= " + event.getY());
spielfeld.berechneRandIndex(klick, kaestchenKoordinate);
spielfeld.paintSpielzug(i, rand, g);
spielfeld.repaint(); //funktioniert nicht
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
e.getX();
e.getY();
// System.out.println(e.getX() + " "+ e.getY());
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public static Punkt getKlick() {
return klick;
}
public void setKlick(Punkt klick) {
this.klick = klick;
}
}