InternalFrameAdapter

Status
Nicht offen für weitere Antworten.

Xclipse

Aktives Mitglied
Hallo,

hoffentlich kann hier jemand durchblicken und mir helfen.

Also... ich erzeuge eine Instanz von der Klasse JInternalFrame.
Nun möchte ich, dass wenn es über das Kreuz bzw. den Button geschlossen wird
eine entsprechende Meldung über die Konsole ausgibt.

Mit dem Button geht es wunderbar aber leider nicht mit dem X.
Wenn ich aber
Code:
InternalFrameClosed
mit kleinem i beginne, also
Code:
internalFrameClosed
dann gibt es nach dem schliessen über Button oder X, eine Endlosschleife-Meldung
und in beiden Fällen erscheint nur die Meldung vom X also "Geschlossen durch X: " danach:
Code:
Geschlossen durch X: javax.swing.event.InternalFrameEvent[INTERNAL_FRAME_CLOSED] on eingabeFormular[** Hier kommen die Formulareigenschaften **]
	at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(Unknown Source)
	at sun.nio.cs.SingleByteEncoder.encodeLoop(Unknown Source)
	at java.nio.charset.CharsetEncoder.encode(Unknown Source)
	at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
	at sun.nio.cs.StreamEncoder.write(Unknown Source)
	at java.io.OutputStreamWriter.write(Unknown Source)
	at java.io.BufferedWriter.flushBuffer(Unknown Source)
	at java.io.PrintStream.write(Unknown Source)
	at java.io.PrintStream.print(Unknown Source)
	at java.io.PrintStream.println(Unknown Source)
	at eingabeFormular$xSchliessen.internalFrameClosed(eingabeFormular.java:904)
        und X-mal
	at javax.swing.JInternalFrame.fireInternalFrameEvent(Unknown Source)
	at javax.swing.JInternalFrame.dispose(Unknown Source)
	at eingabeFormular.allesSchliessen(eingabeFormular2.java:918)
	at eingabeFormular$xSchliessen.internalFrameClosed(eingabeFormular.java:905)

Wo liegt denn der Fehler?
Ich kann es nicht finden!
Hier der Code in kurzform!


Code:
public class eingabeFormular extends JInternalFrame{

    public eingabeFormular() {
        super();
        initialize();
        this.setVisible(true);
    }

    private void initialize() {
        this.setSize(1000, 740);
        this.setTitle("Eingabe Formular");
        this.setResizable(true);
        this.setMaximizable(true);
        this.setIconifiable(true);
        this.setClosable(true);
        this.setContentPane(getHaputPanel());
        this.addInternalFrameListener(new xSchliessen());
    }

    /* Komponenten werden durch Methoden erzeugt
                 unter anderem der SchliessButton */

    private JButton getSchliessButton() {
        if (schliessButton == null) {
            schliessButton = new JButton(new ImageIcon("D:\\Schulung\\icon\\button_silver.png"));
            schliessButton.setRolloverIcon(new ImageIcon("D:\\Schulung\\icon\\button_red.jpg"));
            schliessButton.setPressedIcon(new ImageIcon("D:\\Schulung\\icon\\button_green.jpg"));
            schliessButton.setText("Schliessen");
            schliessButton.setBorderPainted(false);
            schliessButton.setContentAreaFilled(false);
            schliessButton.setFocusPainted(false);
            schliessButton.setVerticalTextPosition(SwingConstants.CENTER);
            schliessButton.setHorizontalTextPosition(SwingConstants.CENTER);
            schliessButton.addActionListener(new schliessButtonEFrm());
        }
        return schliessButton;
    }


    private JPanel getHaputPanel() {
        if (hauptPanel == null) {

        ****** Hier werden die Komponenten hinzugefügt und positioniert.

        }
        return hauptPanel;
    }

    class xSchliessen extends InternalFrameAdapter {
        public void InternalFrameClosed(InternalFrameEvent e) {
Zeile 904        	System.out.println("Geschlossen durch X: " + e);
Zeile 905            allesSchliessen();
        }
    }

    class schliessButtonEFrm implements ActionListener {
        public void actionPerformed(ActionEvent e) {
        	System.out.println("Geschlossen durch Button: " + e);
            allesSchliessen();
        }
    }

    public void allesSchliessen() {
        this.setVisible(false);
Zeile 908        this.dispose();
    }
}


Danke schonmal im Voraus.
 

*Hendrik

Bekanntes Mitglied
Mit dieser Methode:
Code:
        public void InternalFrameClosed(InternalFrameEvent e)
überschreibst Du ja nicht die Methode des InternalFrameAdapter, deswegen muß die Methode internalFrameClosed(InternalFrameEvent e) heißen.

Diese Methode wird immer aufgerufen auch wenn Du den Frame mittels Button schließt, d.h. wenn Du den Frame mit dispose schließt:
public void dispose()
Makes this internal frame invisible, unselected, and closed. If the frame is not already closed, this method fires an INTERNAL_FRAME_CLOSED event. The results of invoking this method are similar to setClosed(true), but dispose always succeeds in closing the internal frame and does not fire an INTERNAL_FRAME_CLOSING event.

D.h. wenn Du eine Meldung auf der Konsole ausgeben möchtest, genügt es, dies in internalFrameClosed(InternalFrameEvent e) zu tun.

Warum Du eine Endlosschleife bekommst, weiß ich nicht. Vielleicht hast Du noch irgendwo anderen Code stehen, bei mir kann ich es nicht nachvollziehen.
 

Xclipse

Aktives Mitglied
Hallo *Hendrik,

danke für Deine ausführliche Antwort.

Ich habe Deinen Rat befolgt und nun bin ich total irritiert was das Programm jetzt macht. :bahnhof:

Wenn Du Zeit und Lust hast probiere bitte folgendes mal aus und auchte auf die Konsole. :?:

Schreibe mal den Befehl "InternalFrameClosed" mal mit groß "I" und mal mit klein "i" und führe es aus.
Nun kombiniere es mit dem rausnehmen vom "allesSchliessen();" aus beiden Klassen.

Auch die Anderen dürfen ihren Senf dazu geben. :D

Hier der Code mit dem ich es getestet habe.
Ich benutzte eclipse 3.2.2 und Java6 Update2.

Code:
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;


public class eingabeFormular extends JInternalFrame{

    public static final long serialVersionUID = 1L;

    private JPanel hauptPanel = null;
	private JButton schliessButton = null;

    public eingabeFormular() {
        super();
        initialize();
        this.setVisible(true);
    }

    private void initialize() {
        this.setSize(1000, 740);
        this.setTitle("Eingabe Formular");
        this.setResizable(true);
        this.setMaximizable(true);
        this.setIconifiable(true);
        this.setClosable(true);
        this.setContentPane(getHaputPanel());
        this.addInternalFrameListener(new xSchliessen());
    }

    private JButton getSchliessButton() {
        if (schliessButton == null) {
            schliessButton = new JButton(new ImageIcon("D:\\Schulung\\icon\\button_silver.png"));
            schliessButton.setRolloverIcon(new ImageIcon("D:\\Schulung\\icon\\button_red.jpg"));
            schliessButton.setPressedIcon(new ImageIcon("D:\\Schulung\\icon\\button_green.jpg"));
            schliessButton.setText("Schliessen");
            schliessButton.setBorderPainted(false);
            schliessButton.setContentAreaFilled(false);
            schliessButton.setFocusPainted(false);
            schliessButton.setVerticalTextPosition(SwingConstants.CENTER);
            schliessButton.setHorizontalTextPosition(SwingConstants.CENTER);
            schliessButton.addActionListener(new schliessButtonEFrm());
        }
        return schliessButton;
    }


    private JPanel getHaputPanel() {
        if (hauptPanel == null) {

        	GridLayout gridLayout_hauptPanel = new GridLayout(3,1);

            hauptPanel = new JPanel();
            hauptPanel.setLayout(gridLayout_hauptPanel);
            hauptPanel.setBackground(Color.white);

            GridBagConstraints gBC_getSchliessButton = new GridBagConstraints();
            gBC_getSchliessButton.gridx = 10;
            gBC_getSchliessButton.gridy = 14;
            gBC_getSchliessButton.gridheight = 1;
            gBC_getSchliessButton.gridwidth = 1;
            gBC_getSchliessButton.ipadx = 0;
            gBC_getSchliessButton.insets = new Insets(0, 10, 0, 0);

            hauptPanel.add(getSchliessButton(), gBC_getSchliessButton);

        }
        return hauptPanel;
    }

    class xSchliessen extends InternalFrameAdapter {
        public void internalFrameClosed(InternalFrameEvent e) {
            System.out.println("Geschlossen durch X: " + e);
//            allesSchliessen();
        }
    }

    class schliessButtonEFrm implements ActionListener {
        public void actionPerformed(ActionEvent e) {
           System.out.println("Geschlossen durch Button: " + e);
            allesSchliessen();
        }
    }

    public void allesSchliessen() {
        this.setVisible(false);
        this.dispose();
    }
}
 

*Hendrik

Bekanntes Mitglied
1. Zu der Version die Du gepostet hast - allesSchließen() ist auskommentiert:

Schließen über Button: Ausgabe:
Geschlossen durch Button...
Geschlossen durch X ...
-> Korrekt, da beim Schließen durch dispose() auch das Event INTERNAL_FRAME_CLOSED ausgelöst wird und damit entsprechend die Methode internalFrameClosed() des Listener aufgerufen wird.

Schließen über X: Ausgabe:
Geschlossen durch X ...
-> Korrekt, da Event INTERNAL_FRAME_CLOSED beim Schließen über X ausgelöst wird und damit entsprechend die Methode internalFrameClosed() des Listener aufgerufen wird.

2. allesSchließen() in Methode internalFrameClosed() nicht auskommentiert:

Beim Schließen über den Button wie auch beim Schließen über X wird eine Endlosschleife gestartet.
Beispiel:
1. Button wird gedrückt
2. actionPerformed() ruft allesSchliessen() auf.
3. allesSchliessen() ruft dispose() auf.
4. dispose() löst Event INTERNAL_FRAME_CLOSED aus, d.h. Methode internalFrameClosed() wird aufgerufen
5. internalFrameClosed() ruft allesSchliessen() auf
6. hier gehts wieder bei 3. los - usw.

Entsprechendes beim Schließen über X - hier fallen nur die ersten 3 Punkte weg.

3. internalFrameClosed wird groß geschrieben = InternalFrameClosed:

Wie bereits zuvor geschrieben überschreibst Du dann ja nicht mehr die Methode internalFrameClosed() des InternalFrameAdapter da internalFrameClosed() <> InternalFrameClosed(). InternalFrameClosed() ist dann eine x-beliebige Methode, die auch xyz() heißen könnte. Folglich fällt die Ereignisbehandlung beim Auslösen des INTERNAL_FRAME_CLOSED Events beim Schließen über X oder über den Button (durch dispose()) weg. D.h. Dein InternalFrameAdapter ist in diesem Fall nutzlos, es sein denn, Du würdest die Methode InternalFrameClosed() irgendwie manuell aufrufen.
 

Xclipse

Aktives Mitglied
Puuuuuh.......!!!!!

Du solltest Lehrer werden! :meld:

Einen wirklich herzlichen, dicken und fetten Dank! :toll:

Als Neuling wäre ich nie darauf gekommen!

Versuche zwar selbständig durch DVD, Doc`s, Bücher, eBooks und natürlich auch Internet es
lernen, was da vor sich geht aber gerade am Anfang benötigt man doch menschlische Hilfestellung.

SUPER! :applaus:
 
Status
Nicht offen für weitere Antworten.

Oben