Schnittstelle zwischen Haupt und Nebenfenster

Scrimau

Mitglied
Sicherlich kennen von euch viele diese Einstellungsdialoge, wo man eben Einstellungen vornehmen kann die Änderungen im Hauptfenster hervorrufen. Um so etwas ähnliches zu realisieren woll ich ne Schnittstelle zwischen Haupt und Nebenfenster (beides abgeleitet von JFrame) realisieren. Im Hauptfenster hab ich auch schon eine entsprechende Methode angefertigt (im Prinzip ist es ja der Empfänger, natürlich public eingestellt). Im Nebenfenster wollte ich nun diese aufrufen, aber ich muss das Hauptfenster ja mit einem entsprechenden Variablennamen ansprechen. Wie finde ich den raus? Von getOwner() und getParent() hat ich mir was erhofft aber die bringen nicht die oben erwähnte Methode mit (sind halt nur die Standardklassen).

Scrimau
 
Zuletzt bearbeitet:
Gibt eine Nullpointer Exception.
Obwohl es der Klasse als Atrribut zugeordnet ist, also das Optionsfenster.

Muss man vlt. den Parent manuell setzen? Wenn ja wo? (so eine Methode wie setParent hab ich nicht gefunden)
 
Zuletzt bearbeitet:
Ah, ok. Ich hab gerade SWT und Swing etwas vermischt 😉

Eine vielleicht nicht ganz so schöne, aber immerhin funktionierende Lösung wäre, wenn Du der Configklasse das Hauptfenster übergibst:

Java:
public class Config extends … {
    private MainWindow mainWin;
    
    public Config(MainWindow mainWin) {
        super(…);
        this.mainWin = mainWin;
    }

    public void configuration() {
        mainWin.updateConfig();
    }
}
 
gibts da nicht noch eine bessere Lösung? (ich bin da bissl perfektionistisch^^)

Das verstehe ich gut *g* Nach dem Wälzen der API habe ich aber nur eine bessere Lösung parat: Mach das Unterfenster zu einem JDialog. Der JDialog-Konstruktor erwartet nämlich einen anderen Frame als owner – und ich schätze mal, dieser läßt sich dann mit getOwner abrufen 🙂
 
Dachte mir das so:
Java:
public class Visualisierung extends javax.swing.JDialog {
...
    private void Closing(java.awt.event.WindowEvent evt) {
        ((GUI) this.getParent()).VisClose(); 
    }
}

public class GUI extends javax.swing.JFrame {
...    
     public void VisClose ()
    {
        Vis.setState(false);        
    }
}

Und ohne Casten geht es eben nicht, weil dann die Methode nicht mitgeliefert wird.
 
Warum so kompliziert?
Es genügt doch im Konstruktor deines JDialogs eine einzige Zeile, um deinen JDialog zu schließen:
Java:
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
 
Warum so kompliziert?
Es genügt doch im Konstruktor deines JDialogs eine einzige Zeile, um deinen JDialog zu schließen:
Java:
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

Wenn ich ihn in richtig verstanden habe, will er aber die Änderungen direkt umsetzen und nicht erst nach dem Schließen des Dialogs.
 
OK, da hast du recht.
Dann kann er sich mal das anschauen: Bestätigung vor Programmende (Java) - Byte-Welt Wiki

Ist dem Prinzip ähnlich, von dem was du wahrscheinlich machen möchtest.
Ich fand die Vorschläge von ireas OK.

Im Prinzip möchte ich Einstellungen von dem Nebenfenster auf Parameter im Hauptfenster (der Benutzerfreundlichkeit wegen 2 Fenster, da das Hauptfenster schon ziemlich prall ist) übertragen. Im Link ist zwar erwähnt wie ich Aktionen zum Zeitpunkt des Schließen von einem Fenster ausführen lassen kann, mich interessiert aber vordergründig wie ich Parameter von einem ins andere Fenster bekomme, wie ich also eine Schnittstelle realisiere.
 
Das geht am einfachsten, in dem du deinem JDialog eine Referenz auf das Hauptfenster übergibst.
Ein Interface halte ich hier für überflüssig.
 
Ich glaube, ich hab‘s 🙂 Folgender Code, der IMHO das Richtige tut, funktioniert bei mir:

Java:
import javax.swing.JDialog;
import javax.swing.JFrame;

class A extends JFrame {
    public A(String title) {
        super(title);
        B b = new B(this);
        setVisible(true);
        b.test();
    }
    public void test() {
        System.out.println("Ja");
    }
}

class B extends JDialog {
    public B(JFrame parent) {
        super(parent);
        setVisible(true);
    }
    public void test() {
        if (getOwner() instanceof A) {
            A t = (A) getOwner();
            t.test();
        } 
    }
}

public class Test {
    public static void main(String[] args) {
        new A("aa");
    }
}
 
Das funktioniert beides 1a. Hab mich dann aber für die Lösung von L-ectron-X entschieden (war mit 2 Zeilen erledigt^^) Danke euch beiden :applaus:
Danke auch an alle anderen die geholfen haben.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben