Hallo Zusammen,
schon eine Weile sitze ich an diesem Problem und habe unterschiedliche Ansätze bei google und hier im Forum gefunden, die zur Lösung beitragen könnten. Aber es war noch nichts passendes dabei.
Folgendes Problem:
Ich möchte meine Progammlogik und die GUI mit Hilfe eines Controllers sauber voneinander trennen. Dabei soll die Logik und die GUI nichts von diesem wissen (sie dürfen keine Methoden vom Controller aufrufen).
Wenn ich in der GUI eine Button habe, möchte ich im Controller Dinge ausführen, wenn dieser angeklickt wird.
Hier mein Programm, welches so nicht funktioniert:
Das ist meine Main, wo nur die Control-Klasse initialisiert und gestartet wird.
In der Control-Klasse werden View und Logic erstellt und die View wird gestartet.
Die Klasse-View ist quasi mein Hauptfenster. In der meine Klasse-Panel aufgerufen und dargestellt wird.
In der Klasse Panel wird der Button erstellt.
Zum Problem zurück und zu meiner Hauptfrage:
Wie ich bereits oben geschrieben habe, funktioniert dieses Beispiel so nicht. Das Wort "Hallo" wird nicht angezeigt. Aber wenn ich die Klasse Panel weg lasse und den Button direkt in die Klasse View packe und diesen von private auf public umstelle, kann ich in der Klasse Control wie folgt auf ihn zugreifen:
Die Frage ist jetzt: Wieso?
Ich hoffe ihr könnt mir helfen. Vielen Dank schon einmal im Voraus.
schon eine Weile sitze ich an diesem Problem und habe unterschiedliche Ansätze bei google und hier im Forum gefunden, die zur Lösung beitragen könnten. Aber es war noch nichts passendes dabei.
Folgendes Problem:
Ich möchte meine Progammlogik und die GUI mit Hilfe eines Controllers sauber voneinander trennen. Dabei soll die Logik und die GUI nichts von diesem wissen (sie dürfen keine Methoden vom Controller aufrufen).
Wenn ich in der GUI eine Button habe, möchte ich im Controller Dinge ausführen, wenn dieser angeklickt wird.
Hier mein Programm, welches so nicht funktioniert:
Java:
package testbutton;
public class TestButton {
public static void main(String[] args) {
final Control control = new Control();
control.start();
}
}
Das ist meine Main, wo nur die Control-Klasse initialisiert und gestartet wird.
Java:
package testbutton;
import java.awt.event.*;
public class Control {
final View view = new View();
final Logic logic = new Logic();
public void start() {
view.view();
}
private void actionButton() {
view.getButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
view.show(logic.getText());
}
});
}
}
In der Control-Klasse werden View und Logic erstellt und die View wird gestartet.
Java:
package testbutton;
import javax.swing.*;
public class View extends JFrame {
Panel panel = new Panel();
public void view() {
add(panel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setTitle("Mensch Ärgere Dich Nicht");
setLocationRelativeTo(null);
setVisible(true);
}
public JButton getButton() {
return panel.getButton();
}
public void show(String text) {
System.out.println(text);
}
}
Die Klasse-View ist quasi mein Hauptfenster. In der meine Klasse-Panel aufgerufen und dargestellt wird.
Java:
package testbutton;
import javax.swing.*;
public class Panel extends JPanel {
public JButton button = new JButton("Gib Text");
public Panel() {
add(button);
}
public JButton getButton() {
return button;
}
}
In der Klasse Panel wird der Button erstellt.
Zum Problem zurück und zu meiner Hauptfrage:
Wie ich bereits oben geschrieben habe, funktioniert dieses Beispiel so nicht. Das Wort "Hallo" wird nicht angezeigt. Aber wenn ich die Klasse Panel weg lasse und den Button direkt in die Klasse View packe und diesen von private auf public umstelle, kann ich in der Klasse Control wie folgt auf ihn zugreifen:
Java:
view.button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
view.show(logic.getText());
}
});
Die Frage ist jetzt: Wieso?
Ich hoffe ihr könnt mir helfen. Vielen Dank schon einmal im Voraus.