Swing Vererbung, Probleme mit JDialog

MAIAarts.

Mitglied
Guten Abend,

es ist ein kleines Problem bei einer Übung augetreten.
Ich habe ein kleines Diagramm angehangen, welches verdeutlichen soll, wie ich mir das vorstelle.

In der der Klasse GUI ist soweit alles klar. Diese ruft die Klasse Artikelfenster auf. Artikelfenster ist eines von vielen Unterfenster.
Das Unterfenster erscheint auch auf Knopfdruck in GUI, allerdings kann ich keine Komponenten darauf hinzufügen.

Welchen Fehler mache ich.

Java:
public class MeinUnterfenster extends JDialog{
	
	private FensterAbhoerer einFensterAbhoerer;

	
	public MeinUnterfenster(JFrame dasAnwedungsfenster, String fenstertitel){
		//Unterfenster neu erstellen
		//super( fenstertitel);
		//folgenden Angaben beziehen sich auf das Unterfenster
		setSize(300,300);
		setLocation(60,95);
		setVisible(true);
		
		getContentPane().setLayout(null);
		getContentPane().setBackground(java.awt.Color.white);
		
		einFensterAbhoerer = new FensterAbhoerer();
		addWindowListener(einFensterAbhoerer);
	}
	//Innere Klasse
	//***********************************************************************
	public class FensterAbhoerer extends WindowAdapter{
		//Ereignis Schliessen des Fensters
		public void windowClosing(WindowEvent we){
			setVisible(false); //Unsichtbar machen
			dispose(); //Freigabe der Systemresourcen
		}
	}
	
}

Java:
public class ArtikelFenster extends MeinUnterfenster{

	private MeinUnterfenster dasArtikelFenster;
	
	public ArtikelFenster(JFrame dasAnwedungsfenster, String fenstertitel) {
		super(dasAnwedungsfenster,"Artikel");
		
		JButton brat = new JButton("brat");
		dasArtikelFenster.add(brat);
	}
	public void anzeigenArtikelfenster(){

	}
}

Ist die Zeile mit dem Button im Artikelfenster mit drin,bekomme ich Fehlermeldungen nach Aufruf des Artikelfenster. Es öffnet sich hat aber keine Button, sondern nur die weiße Hintergrundfarbe aus der Klasse MeinUnterfenster.

Das eingefügte Diagramm is vorgegeben. Ich kann mir nicht vorstellen, was in der Methode zeigeArtikelfenster() passieren soll.
Habe ich hier irgendwo einen Denkfehler?

Aufruf in der GUI: artikelFenster = new ArtikelFenster(dasGUIfenster,"Artikel");
 

Anhänge

  • klassendiagramm.JPG
    klassendiagramm.JPG
    16,5 KB · Aufrufe: 37
Zuletzt bearbeitet:
Wieso hast du in ArtikelFenster eine private Instanz von MeinUnterfenster angelegt?

Da liegen ich glaube schwerwiegende Defizite im Verständnis der Vererbung vor. Alles was MeinUnterfenster kann, kann ArtikelFenster auch. Sprich Zeile 9 in Artikelfenster kann so aussehen

Java:
add(brat);

Außerdem fällt Zeile 3 in Artikelfenster komplett weg.

Desweiteren solltest du überlegen, ob der super Konstruktor (JDialog(Dialog owner, String title, boolean modal) ) vllt etwas für deine Anwendung ist. Siehe javadocs
 
Java:
setVisible(false); //Unsichtbar machen
dispose(); //Freigabe der Systemresourcen

setVisible(false) sollte doch überflüssig sein, wenn du dispose() machst oder?

Java:
public class ArtikelFenster extends MeinUnterfenster{

	private MeinUnterfenster dasArtikelFenster;
	
	public ArtikelFenster(JFrame dasAnwedungsfenster, String fenstertitel) {
		super(dasAnwedungsfenster,"Artikel");
		
		JButton brat = new JButton("brat");
		dasArtikelFenster.add(brat);
	}
	public void anzeigenArtikelfenster(){

	}
}

Wo initialisierst du denn "dasArtikelFenster"? Und wozu soll das überhaupt gut sein? 🙂
 
Wieso hast du in ArtikelFenster eine private Instanz von MeinUnterfenster angelegt?

Da liegen ich glaube schwerwiegende Defizite im Verständnis der Vererbung vor. Alles was MeinUnterfenster kann, kann ArtikelFenster auch. Sprich Zeile 9 in Artikelfenster kann so aussehen

Java:
add(brat);

Außerdem fällt Zeile 3 in Artikelfenster komplett weg.

Desweiteren solltest du überlegen, ob der super Konstruktor (JDialog(Dialog owner, String title, boolean modal) ) vllt etwas für deine Anwendung ist. Siehe javadocs

Danke soweit

Kannst du mir bitte sagen, wie ich mein ArtikelFenster aufrufe, dass auch der Fenstertitel angezeigt wird?

Java:
public class ArtikelFenster extends MeinUnterfenster{

	private static ArtikelFenster dasArtikelFenster;
	private JButton btn1 = new JButton("Der Button ist da");
	
	public ArtikelFenster(JFrame dasAnwedungsfenster, String fenstertitel) {
		super(dasAnwedungsfenster,fenstertitel);
		
		//getContentPane().add(btn1);
		add(btn1);
		btn1.setBounds(50, 50, 150, 24);
		btn1.setVisible(true);

	}
}
 
ich würde die Klassen so aufbauen:

Java:
public class MeinUnterfenster extends JDialog{
 
    public MeinUnterfenster(JFrame dasAnwedungsfenster, String fenstertitel){
        //Unterfenster neu erstellen
        super(dasAnwedungsfenster, fenstertitel);
        //folgenden Angaben beziehen sich auf das Unterfenster
        setSize(300,300);
        setLocation(60,95);
        
        getContentPane().setLayout(null);
        getContentPane().setBackground(java.awt.Color.white);
        
        addWindowListener(new FensterAbhoerer());
    }
    //Innere Klasse
    //***********************************************************************
    public class FensterAbhoerer extends WindowAdapter{
        //Ereignis Schliessen des Fensters
        public void windowClosing(WindowEvent we){
            setVisible(false); //Unsichtbar machen
            dispose(); //Freigabe der Systemresourcen
        }
    }
    
}

Java:
public class ArtikelFenster extends MeinUnterfenster{
    
    public ArtikelFenster(JFrame dasAnwedungsfenster, String fenstertitel) {
        super(dasAnwedungsfenster,fenstertitel);
        
        //getContentPane().add(btn1);
        JButton btn1 = new JButton("Der Button ist da")
        btn1.setBounds(50, 50, 150, 24);
        add(btn1);
 
        setVisible(true);
    }
}

und für den Aufruf genügt dann

Java:
ArtikelFenster artikelFenster = new ArtikelFenster(<Referenz deines Hauptfensters>, "Hier war DerEisteeTrinker am Werke");


man könnte das setVisible auch noch aus dem Konstruktor von ArtikelFenster rausnehmen, wenn man selber entscheiden möchte, wann der Dialog erscheinen soll und nicht automatisch beim Instanzieren des Dialoges.
 
setVisible(false) sollte doch überflüssig sein, wenn du dispose() machst oder?



Wo initialisierst du denn "dasArtikelFenster"? Und wozu soll das überhaupt gut sein? 🙂

Ja, macht zumindest optisch keinen Unterschied. Ich habe es so gelesen in einem Beispiel. Habe es beibehalten.

Dein Vorredner wies mich auf diesen "Fehler" bereits hin. Danke dir dennoch
 
setVisible(false) sollte doch überflüssig sein, wenn du dispose() machst oder?

In diesem Fall ja, aber nicht in jedem. Denn wenn du bei einem Dialog setVisible(false) verpasst, wird zwar der Dialog optisch verschwinden, aber er ist immernoch im Speicher und du kannst die Daten auslesen. Mit dispose werden der Dialog und alle an ihn angehängte Referenzen gekillt.
 
Danke soweit

Kannst du mir bitte sagen, wie ich mein ArtikelFenster aufrufe, dass auch der Fenstertitel angezeigt wird?

Java:
public class ArtikelFenster extends MeinUnterfenster{

	private static ArtikelFenster dasArtikelFenster;
	private JButton btn1 = new JButton("Der Button ist da");
	
	public ArtikelFenster(JFrame dasAnwedungsfenster, String fenstertitel) {
		super(dasAnwedungsfenster,fenstertitel);
		
		//getContentPane().add(btn1);
		add(btn1);
		btn1.setBounds(50, 50, 150, 24);
		btn1.setVisible(true);

	}
}

Im Konstruktor von MeinUnterfenster als erstes:

Java:
super(dasAnwedungsfenster,fenstertitel);


Das müsste klappen.

p.S. Weshalb machst du denn das?

Java:
private static ArtikelFenster dasArtikelFenster;
 
In diesem Fall ja, aber nicht in jedem. Denn wenn du bei einem Dialog setVisible(false) verpasst, wird zwar der Dialog optisch verschwinden, aber er ist immernoch im Speicher und du kannst die Daten auslesen. Mit dispose werden der Dialog und alle an ihn angehängte Referenzen gekillt.

Hä? Was meinst du mit "verpassen"? Es ist klar, dass man zum schließen nicht setVisible(false) macht, da man mit setVisible(true) das wieder öffnen kann. Aber setVisible(false) ist meiner Meinung nach unnötig, wenn man dispose() macht. Oder meinst du, dass der Dialog sichtbar bleibt, wenn man nur dispose() macht? Wäre mir neu ???:L
 
und für den Aufruf genügt dann

Java:
ArtikelFenster artikelFenster = new ArtikelFenster(<Referenz deines Hauptfensters>, "Hier war DerEisteeTrinker am Werke");


man könnte das setVisible auch noch aus dem Konstruktor von ArtikelFenster rausnehmen, wenn man selber entscheiden möchte, wann der Dialog erscheinen soll und nicht automatisch beim Instanzieren des Dialoges.

setVisible ist schon weg. Mein Aufruf ist deinem identisch. Es wird leider aber keine Titelzeile angezeigt. Weiss im Moment leider nicht woran das liegen kann.

Nein, der Dialog bleibt nicht sichtbar bei nur dispose();
 
In der Praxis haben ein Kollege und ich das so machen müssen. mit setVisible wurde ein Dialog "unsichtbar gemacht" mit den Daten wurde weitergearbeitet. Der Benutzer konnte aber immer wieder zurückspringen zum Dialog und die Initialisierung hat mitunter einige Sekunden gedauert. Sprich so mussten wir den Dialog nur unsichtbar machen und er konnte jedes mal wieder erscheinen ohne Zeitverzug. Erst als die Verarbeitung entgültig abgeschlossen wurde, haben wir den Dialog in die Tonne gehauen. Ist aber nur bei modalen Dialogen wirklich relevant
 

Zurück
Oben