ich habe eine Oberfläche mit einer Menüleiste und einer Message Box. Die Message Box und die GUI sind getrennt voneinander.
Wie kann ich jetzt bewerkstelligen das ich wenn ich auf Menü->Beenden klicke auf das Button reagieren kann.
Es sind zwei Klassen
Code:
public class FrmMessageBox extends JFrame implements ActionListener
Code:
public class MainWindow extends JFrame
Bis jetzt habe ich diesen Handler
Code:
private void MnuPtQuitActionPerformed(ActionEvent quitEvent) {
FrmMessageBox msgbox=new FrmMessageBox(MSGINFORMATION, "Möchten Sie das Programm wirklich beenden ?", BTNMODEOKABORT);
msgbox.setVisible(true);
}
Dabei ist die Messagebox ein externes JFrame. Wie kann man das nun bauen das ich wenn ich in der Message box auf ok klicke ein ereigniss an die GUI schicken kann wo ich darauf hin das Programm beenden kann. Die Messagebox soll dabei global agieren können. Also ich möchte mit ihr jede erdenkliche Nachricht darstellen können und darauf reagieren.
Ich probiere jetzt schon seit tagen komme aber zu keinem ergebniss.
Das soll doch nur eine MessageBox für eine Zustimmungs/Ablehnungs - Abfrage für den User werden, oder?
Schau Dir doch mal die showConfirmDialog-Methoden vom JOptionPane an:
Vielen Dank ... das ist schön ... da hätte ich mir ja auch gleich die Arbeit sparen können ;-) ... vielen dank für die Info werd das mal ausprobieren. Dennoch wäre es schön zu wissen wie man sowas macht ... bräuchte das dann später noch für andre sachen
Wie man das macht, geben doch die GUI Komponenten schon vor . In einem Button kann man z.B. mehrere Listener anmelden, deren Methoden dann aufgerufen werden bei einem Klick.
Wenn man sich selber eine GUI baut, ist es oft nichtmal notwendig, dass eine Klasse mehrere Benachrichtigungen absenden können muss. Dafür bau ich mir dann einfach ein Interface (was im Prinzip die gleiche Funktion erfüllt, wie ein Listener). Dieses Interface stellt gewisse Methoden bereit, welche dann von der Komponente aufgerufen werden bei bestimmten Ereignissen.
Das sieht dann ungefähr so aus:
Code:
// MeinFrame Callback-Interface
public interface MeinFrameCallback
{
public void formularAbsenden(String name);
}
Code:
// MeinFrame
public MeinFrame extends JFrame
{
MeinFrameCallback callback;
JTextField tf_name;
JButton bu_ok;
public MeinFrame()
{
super("MeinFrame Titel");
// Hinzufügen von einem Textfeld und einem Button
initComponents();
validate();
pack();
}
void initComponents()
{
setLayout(new BorderLayout());
this.tf_name = new JTextField();
add(this.tf_name);
this.bu_ok = new JButton("OK");
// einen Listener für den Button registrieren
this.bu_ok.setActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// Wenn Button geklickt, dann reiche das Ereignis samt Inhalt des Textfeldes an das Callback-Interface weiter
if (callback != null)
callback.formularAbsenden(tf_name.getText());
}
}
);
}
// get/set Methoden für das Callback-Interface, wobei get nicht in jedem Fall gebraucht wird
public MeinFrameCallback getCallback()
{
return this.callback;
}
public void setCallback(MeintFrameCallback callback)
{
this.callback = callback;
}
}
Auf diese Weise kann man MeinFrame mitteilen, dass man über gewisse Ereignisse benachrichtigt werden möchte.
Code:
...
MeinFrame mf = new MeinFrame();
// Callback Interface bei MeinFrame registrieren
mf.setCallback(
new MeinFrameCallback()
{
public void formularAbsenden(String name)
{
System.out.println("Formular in MeinFrame wurde abgesendet: Name: " + name);
}
}
);
Das wäre nur mal so ein dahingetipptes Beispiel. Die nötigen import's Fehlen und Syntaxfehler können evtl. auch noch drin sein; habs nicht compiliert
Wenn du auch mehrere Listener benachrichtigen willst, dann kannst du Dir mal das hier anschauen:
Das ist ok ... ich denke das wird mich erstmal weiterbringen. Ich probiere es mal aus ob ich es hin bekomme ... auf jeden Fall vielen Danl für die schnellen Antworten.
Ok ich habe das alles jetzt mal ausprobiert und es funktioniert genauso wie ich es wollte ... musste ein paar Codeänderungen vornehmen ... aber es geht ... vielen Dank für die Info ... Ich glaube diesen Thread können wir als gelöst betrachten.