Hi Winni,
Beispiel:
Im Norden hast du ja deine 4 Dateikomponenten. Diese können
mittels „Browse“ verändert werden, also hat das umliegende
Panel entsprechende fireFile1Changed(File newFile) bis
fireFile4Changed(File newFile)-Methoden, die dann vom
jeweiligen „Browse“-Button angestoßen werden und in denen dann
die registrierten FileListener informiert werden. Diese
FileListener implementieren entsprechend die Methoden
file1Changed(File newFile) bis file2Changed(File newFile) und
können eben bei diesem nördlichen Panel registriert werden.
Einer dieser Listener kann z.B. eine deiner JLists sein?!
Also ich verstehe davon nur Bahnhof…
Kannst Du das etwas einfacher erklären?
Mmh.
Wie erkläre ich das am Besten?!
Angenommen, du verwendest oben ein Panel (sagen wir A), welches einen Button hat. Das Betätigen dieses Buttons (Btn1) bewirkt ja ein ActionEvent, also kannst du rein theoretisch ein weiteres Panel (sagen wir B), welches die JList enthält und z.B. auch noch eine Status-Zeile (sagen wir C) registrieren, die dann anhand dem ActionEvent erkennen, dass der Button gedrückt wurde und entsprechende Aktionen ausführen. In diesem einfachen Fall implementieren also B und C das Interface ActionListener.
Wenn du nun in A auch noch einen zweiten Button (Btn2) einfügst, auf den wiederum B und C reagieren sollen, dann musst du in B und C praktisch eine Möglichkeit haben, um das zu behandelnde ActionEvent eindeutig dem Btn1 oder Btn2 aus A zuordnen zu können. Hierzu könntest du vom ActionEvent die Quelle abfragen und diese dann mit Btn1 bzw. Btn2 vergleichen. Dazu musst du jedoch in A zwei Methoden schaffen, die dir A und B zur Verfügung stellen (also getBtn1() etc.). Diese sind dann public und somit kann man auch von außen diese Buttons manipulieren => schlecht!
Feiner ist es, wenn du in A eine Liste hältst, in der sich Listener für Btn1 und Btn2 registrieren können. Also erhält A die Methode addBtnListener(BtnListener lis), die dann den übergebenen Listener in die Liste einträgt.
Der BtnListener ist lediglich ein Interface und besitzt die Methoden btn1Pressed(Object einParameter) und btn2Pressed(Object einParameter).
B und C implementieren dieses Interface, wodurch sie explizit auf das Drücken von Btn1 und Btn2 reagieren können, und registrieren sich bei A als BtnListener.
A registriert wiederum bei Btn1 und Btn2 anonyme ActionListener.
Da ich grad merke, dass das ganze sicherlich einfacher ist, wenn du bissel Code siehst, höre ich an dieser Stelle lieber auf und geb dir ein Code-Schnipsel. Mit dem kannst du dir alles noch bissel besser herleiten.
/\*\*
\* Ein Listener
\*/
public interface BtnListener
{
public void btn1Pressed(Object parameter);
public void btn2Pressed(Object parameter);
}
/\*\*
\* Dein Panel A
\*/
public class A
{
private List m\_Listeners = Collections.synchronizedList(new ArrayList());
private JButton m\_Btn1;
private JButton m\_Btn2;
private void init()
{
// ...
m\_Btn1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0)
{
fireBtn1Pressed("something");
}});
m\_Btn2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0)
{
fireBtn2Pressed("something");
}});
// ...
}
private void fireBtn1Pressed(Object something)
{
Iterator it = m\_Listeners.iterator();
BtnListener lis;
while(it.hasNext())
{
lis = (BtnListener)it.next();
lis.btn1Pressed(something);
}
}
private void fireBtn2Pressed(Object something)
{
Iterator it = m\_Listeners.iterator();
BtnListener lis;
while(it.hasNext())
{
lis = (BtnListener)it.next();
lis.btn2Pressed(something);
}
}
public void addBtnListener(BtnListener lis)
{
m\_Listeners.add(lis);
}
}
/\*\*
\* Dein Panel B
\*/
public class B implements BtnListener
{
public void btn1Pressed(Object parameter)
{
// irgendwas tun
}
public void btn2Pressed(Object parameter)
{
// irgendwas tun
}
}
/\*\*
\* Dein Panel C
\*/
public class C implements BtnListener
{
public void btn1Pressed(Object parameter)
{
// irgendwas anderes tun
}
public void btn2Pressed(Object parameter)
{
// irgendwas anderes tun
}
}
Hoffe, dass hilft dir weiter!
Ciao, Bill