Graphics interaktiv bearbeiten

Hallo,

ich beschäftige mich gerade mit GUI und habe eine Oberfläche implementiert, auf der u.a. eine Zeichnung und Buttons eingebettet werden.

Nun möchte ich nach Klick auf den Button eine boolean-Variable ändern und an die Zeichnung weitergeben, so dass diese sich ändert. Allerdings weiß ich nun nicht, wie ich der Zeichnung klarmache, dass die Variable, die ich ihr anfangs übergeben habe, sich plötzlich ändert. Einfach repaint() in den ActionListener oder die Zeichnung neu konstruieren klappt nicht. Ich dachte an MVC, aber weiß nicht so recht, wie ich das angehen soll.

Hier mal ein bisschen Code (gekürzt):

public class Oberflaeche{

JFrame fenster;
JButton button;
Zeichnung z1;

boolean Kreuz;

public Oberflaeche() {

JFrame fenster = new JFrame(„Titel“);
fenster.setSize(100, 150);

Zeichnung z1 = new Zeichnung(Kreuz);
JButton button = new JButton(„Hier klicken“);

ActionListener AL = new ActionListener () {

public void actionPerformed(ActionEvent arg0) {

Kreuz = true;
reagiere();
System.out.println(„Button funktioniert.“);
}

};

button.addActionListener(AL);

fenster.setLayout(new BorderLayout());
fenster.add(z1, BorderLayout.CENTER);
fenster.add(button, BorderLayout.SOUTH);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.setLocationByPlatform(true);
fenster.setVisible(true);

}

public void reagiere() {

z1 = new Zeichnung(Kreuz);
z1.repaint();
}

Und die Zeichnung arbeitet mit einer if-Condition:

public class Zeichnung extends JComponent{

boolean willKreuz = false;

public Zeichnung(boolean willKreuz) {

this.willKreuz = willKreuz;

}

protected void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

if (willKreuz) {

g2.setColor(Color.red);

g2.drawLine(0, 100, 100, 0);
g2.drawLine(0, 0, 100, 100);

}

Danke im Voraus für die Hilfe.

Du erzeugst eine neue Zeichnung. Das ist hier wohl eher nicht gewollt. Denn auf dem Frame liegt noch die alte. Und dann weist du aber die neue (unsichtbare) Zeichnung an, sich neu zu zeichnen. Dabei würde ein Zeichnungsobjekt doch vollkommen genügen. Dort rufst du sowas wie setKreuz(meineKreuzVar) auf, welches dann selbstständig repaint() aufruft, falls sich der Kreuz-Status geändert hat.
Frame -> Click -> rufe setKreuz() auf
Zeichnung -> setKreuz() wird aufgerufen -> Prüft, ob Kreuz sich geändert hat -> Ja: repaint(), Nein: nix

Grüße, JasonDelife.

Aah, danke, du hast mich auch auf einen anderen Fehler gebracht: Ich habe auch die falschen Variablen überschrieben, nämlich die der Oberfläche. Die Variablen der Zeichnung musste ich ja einfach mit z1.willKreuz und die Methoden mit z1.repaint() ansprechen, das war mein Fehler. Da konnte ich mir sogar das setKreuz() sparen :wink:.

Danke!