Hallo,
ich baue, wie wahrscheinlich viele vor mir, einen Taschenrechner. Nun bin ich schon relativ weit gekommen aber an dieser Stelle hakt's:
Ich will eine Komponente hinzufügen, die alles anzeigt, was bereits eingetippt wurde. Das ist einfach ein neues Fenster, das ein Label enthält, wo die gesamte bisher eingetippte Funktion dargestellt wird. Ich starte also aus dem Hauptprogramm bei entsprechendem Menuklick ein Fenster, dass nun auf die events der gedrückten Tasten (Buttons) hören soll. Der Taschenrechner ist als "Model View Controller" designt. Das Problem ist, dass die Buttons in einer anderen Klasse definiert sind (nämlich im Controller) und dort auch ihre Actionlistener gewissermaßer behandelt werden. Nun will ich aber, dass die Fenster-Klasse auch auf die Buttons hört und diese (parallel) behandeln kann(ist also im Prinzip ihr eigener Controller).
Kann ich den Button noch mehr Listener aufbrummen - das wäre eine Notlösung.
Ich sollte dabei vielleicht noch erwähnen, dass möglichst ohne großartige Abhängigkeiten der beschriebenen Klassen arbeiten will, da es sich bei dem zusätzlich anklickbaren Fenster um eine separate Komponente handeln soll.
hier ein Auszug aus der Klasse mit den Buttons:
die Klasse Keypad:
Wie verändere ich diese Geschichte so, dass auch völlig fremde Objekte auf die Buttons hören können?
Zusatzfrage: Wie kann man generell ein event "zerlegen", speziell, wie erkenne ich, ob ein event von einem Button stammt oder nicht?
Vielen Dank für die Mühe schon mal...
ich baue, wie wahrscheinlich viele vor mir, einen Taschenrechner. Nun bin ich schon relativ weit gekommen aber an dieser Stelle hakt's:
Ich will eine Komponente hinzufügen, die alles anzeigt, was bereits eingetippt wurde. Das ist einfach ein neues Fenster, das ein Label enthält, wo die gesamte bisher eingetippte Funktion dargestellt wird. Ich starte also aus dem Hauptprogramm bei entsprechendem Menuklick ein Fenster, dass nun auf die events der gedrückten Tasten (Buttons) hören soll. Der Taschenrechner ist als "Model View Controller" designt. Das Problem ist, dass die Buttons in einer anderen Klasse definiert sind (nämlich im Controller) und dort auch ihre Actionlistener gewissermaßer behandelt werden. Nun will ich aber, dass die Fenster-Klasse auch auf die Buttons hört und diese (parallel) behandeln kann(ist also im Prinzip ihr eigener Controller).
Kann ich den Button noch mehr Listener aufbrummen - das wäre eine Notlösung.
Ich sollte dabei vielleicht noch erwähnen, dass möglichst ohne großartige Abhängigkeiten der beschriebenen Klassen arbeiten will, da es sich bei dem zusätzlich anklickbaren Fenster um eine separate Komponente handeln soll.
hier ein Auszug aus der Klasse mit den Buttons:
Code:
//Konstruktor:
public Controller ( Applet a, View v, Model m ) {
applet = a;
view = v;
model = m;
applet.add("Center", new Keypad( digitLabels, 4, 3,
new DigitListener( )) );
applet.add("East", new Keypad( binaryLabels, 4, 1,
new BinaryListener( )) );
applet.add("West", new Keypad( unaryLabels, 4, 1,
new UnaryListener( )) );
applet.add("South", new Keypad( equalLabels, 4, 2,
new EqualsListener( )) );
}
class DigitListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
Button button = (Button)event.getSource();
model.pressDigit( button.getLabel() );
view.update( );
}
}
class BinaryListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
Button button = (Button)event.getSource();
model.pressFctn( button.getLabel());
view.update( );
}
}
Code:
// Keypad.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
class Keypad extends Panel {
public Keypad (String[] lbl, int rows, int cols,
ActionListener listener) {
super( );
setLayout( new GridLayout(rows, cols, 2, 2));
for (int i = 0; i < lbl.length; i++) {
Button b = new Button(lbl[i]);
b.addActionListener( listener );
add( b );
} // for
} // Konstructor
} // class Keypad
Wie verändere ich diese Geschichte so, dass auch völlig fremde Objekte auf die Buttons hören können?
Zusatzfrage: Wie kann man generell ein event "zerlegen", speziell, wie erkenne ich, ob ein event von einem Button stammt oder nicht?
Vielen Dank für die Mühe schon mal...