Windows in LinkedList registrieren

fishychips

Neues Mitglied
Vielen Dank für die Aufnahme! Ich habe ein Problem beim Hinzufügen Fenstern zu einer LinkedList aus einer anderen Klasse.

Es sollen bestimmte Fenster, die über mehrere Klassen erzeugt werden, zu einer LinkedList hinzugefügt werden. Alle Klassen greifen auf die Klasse EventHandler zu, der das Öffnen und Schließen dieser Fenster regelt. Deshalb habe ich dies auch als Event genutzt (funktioniert auch). Die LinkedList befindet sich jedoch in der Klasse Main und über die dort definierten Methoden können Daten hinzugefügt oder entfernt werden. Der EventHandler greift auf die Main-Klasse zu, indem ein entsprechender Konstruktor definiert wird.

Das Problem ist jetzt, dass meine LinkedList zwar die neuen Fenster brav einliest, aber die alten Daten "vergisst" sobald die Methode EventHandler wieder aufgerufen wird.

Code der Klasse "Main":

Java:
import java.awt.Window;
import java.util.LinkedList;

import javax.swing.JFrame;

public class Main {

    private LinkedList WindowList = new LinkedList();

    public void addFrame(Window w) {
        WindowList.add(w);
        System.out.println(WindowList.size());
    }

    public void removeFrame(Window w) {
        WindowList.remove(w);
        System.out.println(WindowList.size());
    }

    public LinkedList getWindowList() {
        return WindowList;
    }

}


Code der Klasse "EventHandler":

Java:
import java.awt.Window;
import java.awt.event.WindowEvent;
import java.util.ListIterator;

//Wird von verschiedenen Klassen als WindowListener implementiert
public class EvenHandler {

    Main app = new Main();

    public void windowOpened(WindowEvent e) {
        Window w = e.getWindow();
        app.addFrame(w);
    }

    public void windowClosing(WindowEvent e) {

        Window w = e.getWindow();
        app.removeFrame(w);
        w.dispose();
    }
}
 
K

kneitzel

Gast
Also an dem Code kann ich erst einmal nichts erkennen. Hast Du evtl. mehrere Instanzen von EventHandler? Kannst Du den übrigen Code evtl. auch noch zeigen?

Und noch ein Hinweis zu Deiner LinkedList:
a) Du solltest hier Generics verwenden, also eine List<Window> / LinkedList<Window>.
b) Du solltest LinkedList nur bei der Erzeugung der Liste nutzen und ansonsten auf das Interface List zurück greifen. Dann kannst Du bei der genauen Implementierung später einfacher wechseln. Solltest Du also später eine ArrayList nutzen wollen, ist nur eine Stelle zu ändern.
 

Robat

Top Contributor
Ich würde eher sagen, dass er woanders noch eine Instanz von Main besitzt (zum "einlesen") - der EventHandler aber eine eigene Main Instanz nutzt
 

fishychips

Neues Mitglied
ok, schon mal vielen Dank! die Änderungen an der LinkedList werde ich entsprechend vornehmen.

Grundsätzlich geht es im ganzen Progamm darum, verschiedene Dokumente über eine Treemap auszuwählen und per Doppelklick in einem neuen Frame anzuzeigen. Für verschiedene Arten von Dokumenten existieren dabei verschiedene Klassen zur Ausgabe, z. B. Tonausgabe oder Bildausgabe mit jeweils erbender Ausgabeklasse. Diese Klassen rufen dann auch den EventHandler auf. Hier mal ein Beispiel für die Ausgabe von Bilddokumenten:

Klasse BildDokument (erbt nur einige grundsätzliche Eigenschaften, wie Beschreibung, Pfad und Name sowie Methode "dokumentAusgeben" aus Klasse "Dokument"):

Java:
public class BildDokument extends Dokument {

    public BildDokument(String name, String filePath, String beschreibung) {
        /* Aufruf des Konstruktors der Basisklasse */
        super(name, filePath, beschreibung);
    }

    @Override
    public void dokumentAusgeben() {
        new BildDokumentAusgabe(this);
    }
}

Klasse BildDokumentAusgeben
Java:
import java.awt.*;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ReplicateScaleFilter;

import javax.swing.*;

/**
* JFrame-Klasse zur Ausgabe von Bilddokumenten
*/
public class BildDokumentAusgabe extends JFrame implements DokumentAusgabeIF {

    private Image bild;
    private String bildName;
    private int topInset;
    public String WindowListElement = "leer";
    // Main app = new Main();

    /*
     * public String WindowListElement() { System.out.println(this.getName());
     * return this.getName();
     *
     * } /*
     *
     * /* public static void main(String[] args){ BildDokument dok = new
     * BildDokument("ein Bild", "C:\\JAV08\\Bilder\\Kranich.jpg", "");
     * dok.dokumentAusgeben(); }
     */

    public BildDokumentAusgabe(BildDokument bildDokument) {
        bildName = bildDokument.getName();

        this.setTitle("Bilddokumentausgabe");
        this.addWindowListener(new DokumentAusgabeEventHandler());
        this.setResizable(false);
        topInset = Main.getTopInset();
        if (this.bildLaden(bildDokument.getFilePath())) {
            this.setSize(this.limitSize(bild.getWidth(this), bild.getHeight(this)));
        } else {
            // feste Größe für die Ausgabe einer
            // Fehlermeldung:
            this.setSize(400, 100);
        }

        // app.WindowList.add(this.getName());
        // System.out.println(app.WindowList.size());
        // WindowListElement();
        String WindowListElement = this.getName();
        // System.out.println(WindowListElement);
        // app.addFrame(WindowListElement);

        this.setContentPane(new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                if (bild.getHeight(this) > -1)
                    g.drawImage(bild, 0, 0, this);
            }
        });
        this.setVisible(true);
    }

    /**
     * Prüft, ob die Größe des geladenen Bildes die Vorgaben der Konstanten MAX_SIZE
     * überschreitet. Wenn nein, wird ein Dimension-Objekt mit den Größen des
     * geladenen Bildes zurückgegeben, wenn ja, so wird das Bild nach Maßgabe von
     * MAX_SIZE herunterskaliert.
     *
     * @param width
     *            Breite des geladenen Bildes
     * @param height
     *            Höhe des geladenen Bildes
     * @return java.awt.Dimension-Objekt zur Definition der Größe des darstellenden
     *         Frames
     */
    private Dimension limitSize(int width, int height) {

        if (width > Konstanten.MAX_SIZE_BILDAUSGABE.width || height > Konstanten.MAX_SIZE_BILDAUSGABE.height) {
            int scaledWidth = (width > height) ? Konstanten.MAX_SIZE_BILDAUSGABE.width
                    : Konstanten.MAX_SIZE_BILDAUSGABE.height * width / height;
            int scaledHeight = (width > height) ? Konstanten.MAX_SIZE_BILDAUSGABE.width * height / width
                    : Konstanten.MAX_SIZE_BILDAUSGABE.height;
            ImageFilter scaleFilter = new ReplicateScaleFilter(scaledWidth, scaledHeight);
            this.bild = createImage(new FilteredImageSource(bild.getSource(), scaleFilter));
            return new Dimension(scaledWidth, scaledHeight + this.topInset);
        } else
            return new Dimension(width, height + this.topInset);
    }

    /**
     * Lädt das spezifizierte Bild mithilfe eines java.awt.MediaTracker-Objekts.
     *
     * @param filePath
     *            Pfad auf die Bilddatei
     * @return true, wenn erfolgreich geladen, anderenfalls false
     */

    private boolean bildLaden(String filePath) {
        System.out.println(filePath);
        bild = Toolkit.getDefaultToolkit().getImage(filePath);
        MediaTracker tracker = new MediaTracker(this);
        tracker.addImage(bild, 0);
        try {
            tracker.waitForID(0);
            // Test auf korrektes Laden:
            if (bild.getHeight(this) > -1)
                return true;
            else
                return false;
        } catch (InterruptedException ie) {
            System.out.println(ie.toString() + "\nbeim Laden des Bildes \"" + filePath);
            return false;
        }
    }

    @Override
    public void ausgabeBeenden() {
        // TODO Auto-generated method stub
       
    }

Hier noch einmal die Initialisierung in der Klasse "Main" (ohne Methoden für EventHandling im TreeMap und Menüerstellung):

Java:
public class Main extends JFrame implements LinkedListIF {

    private static int topInset;

    public static int getTopInset() {
        return topInset;
    }

    // GUI-Objekte
    private JTree jTree;
    // Model-Objekte
    private DefaultTreeModel treeModel;
    private Katalog topLevelKatalog;
    private IOVerwaltung ioVerwaltung;
    // Menü
    private Action actAddKat, actAddDoc, actCopy, actCut, actPaste, actDelete, actRename;
    // Statusleiste/Textfeld Beschreibung
    private JTextField jtfStatus;
    private JTextArea jtaBeschreibung;
    // Knoten-Cache
    private Knoten[] knotenCache = null;
    // PopUp-Menü
    private JPopupMenu popupJTreeDokumentSelektion;
    private JPopupMenu popupJTreeKatalogSelektion;
    private JPopupMenu popupJTreeMehrfachSelektion;
    public LinkedList<Window> WindowList = new LinkedList();

    public Main() {
        super("Medienverwaltung");

    }

    public static void main(String[] args) {
        Main app = new Main();
        String filePath = Konstanten.DEFAULT_PATH;
        app.initializeApplication(filePath);
    }

    public void addFrame(Window w) {
        WindowList.add(w);
        System.out.println(WindowList.size());
    }

   
    public void removeFrame(Window w) {
        WindowList.remove(w);
        System.out.println(WindowList.size());
    }
   
    public LinkedList getWindowList() {
        return WindowList;
    }

    // TreeMap initialisieren
    private void initializeApplication(String filePath) {
        ioVerwaltung = new IOVerwaltung();
        this.setSize(Konstanten.GUI_DIMENSION);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });

        topLevelKatalog = new Katalog("TopLevelKatalog");
        treeModel = new DefaultTreeModel(topLevelKatalog);
        // leere Ordner nicht mit Dokumenten-Symbol darstellen
        treeModel.setAsksAllowsChildren(true);
        if (filePath != null) {
            ioVerwaltung.baumEinlesen(topLevelKatalog, filePath);
        }
        jTree = new JTree(treeModel);
        jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
        jTree.setEditable(true);
        JScrollPane jScrollPane = new JScrollPane(jTree);
        this.add(jScrollPane, BorderLayout.CENTER);
        createMenus();
        addAusgabebereich();
        this.addEventHandlers();
        this.createPopupMenus();
        this.setVisible(true);
        topInset = this.getInsets().top;

    }
}

Es kann gut sein, dass mehrere Instanzen erzeugt werden. Das ist glaube ich auch mein Problem. Ich weiß bloß nicht, wie ich es hier umgehen kann
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
izoards Prunsrv - Windows Service - .bat file starten Java Basics - Anfänger-Themen 84
P Unterschied Installation von zipped JDK vs Installer-JDK (auf Windows)? Java Basics - Anfänger-Themen 2
nbergmann Umgebungsvariablen einstellen unter Windows 7 klappt nicht Java Basics - Anfänger-Themen 2
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
F Terminal Windows per Befehl schließen? Java Basics - Anfänger-Themen 9
U BestPractise für Deployment unter Windows gesucht Java Basics - Anfänger-Themen 12
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
G Wofür benötigt man die Umgebungsvariablen sowohl in Windows 10 als auch in Mac OS Catalina Java Basics - Anfänger-Themen 19
S Windows printerqueue mit Java löschen Java Basics - Anfänger-Themen 3
F Java auf Windows Konsole ausführen Java Basics - Anfänger-Themen 1
L Linux Befehle unter Windows in Eclipse ausführen Java Basics - Anfänger-Themen 3
J Windows Builder auf Eclipse portable Java Basics - Anfänger-Themen 1
S JDK 9 für Windows 32 bit installiert, aber es funktioniert nix Java Basics - Anfänger-Themen 6
E Compiler-Fehler Javac Windows vs Ubuntu /Script vs Konsole Java Basics - Anfänger-Themen 4
G sql server connection mit windows authentication Java Basics - Anfänger-Themen 2
C GUI Programmierung unter Windows mit Java womit? Java Basics - Anfänger-Themen 11
C Exlipse & SWT Windows Tools etc Java Basics - Anfänger-Themen 8
T Windows service erstellen Java Basics - Anfänger-Themen 1
I gemeinsame Config-Datei für alle Windows-User Java Basics - Anfänger-Themen 5
J fehler nach windows update Java Basics - Anfänger-Themen 44
B Windows Service erstellen Java Basics - Anfänger-Themen 2
D Umgebungsvariable Pfad javaw.exe für Programmstart auf Windows Java Basics - Anfänger-Themen 1
J Windows Version herrausfinden Java Basics - Anfänger-Themen 3
A Testprogramm in java oder javascript für Windows Anwendung? Java Basics - Anfänger-Themen 1
C Java stellt unter Windows keine Umlaute dar Java Basics - Anfänger-Themen 9
S Prüfen ob bestimmter Ordner geöffnet ist (Windows XP) Java Basics - Anfänger-Themen 5
W JDK installieren JDK Installieren | Windows 8 | Hilfe Java Basics - Anfänger-Themen 8
Martin2606 Erste Schritte Fragestellung zu Windows Embedded 6.5 auf Handhelds Java Basics - Anfänger-Themen 6
J Ordner unter Windows Verstecken Java Basics - Anfänger-Themen 2
U Einbetten von Windows Painter in einem Browser Java Basics - Anfänger-Themen 1
D Viele grafische unterschiede von Windows xp zu Windows 7 Java Basics - Anfänger-Themen 3
F Erste Schritte Unter Windows programmieren und dann auf Linux laufen lassen Java Basics - Anfänger-Themen 4
Z Gleiches Verzeichnis für class und java unter Windows Muss? Java Basics - Anfänger-Themen 11
FrankR2 Grundsätzliches Verständnisproblem: Java 32/64-bit; Windows 7/8, 32/64-bit-System Java Basics - Anfänger-Themen 5
Bluedaishi Dateien Lassen sich unter windows nicht löschen Java Basics - Anfänger-Themen 8
W Datei wird aus resources unter Windows nicht kopiert Java Basics - Anfänger-Themen 1
K Windows Symbolleiste Icons hinzufügen Java Basics - Anfänger-Themen 7
H Windows Task erstellen Java Basics - Anfänger-Themen 7
D Java geht auf windows 64 bit nicht. Java Basics - Anfänger-Themen 5
K Windows Kontextmenü verändern Java Basics - Anfänger-Themen 5
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
S Von Windows 7 auf Windows 8? Java Basics - Anfänger-Themen 3
F jabva 7.21 läuft nicht auf windows server 2012? Java Basics - Anfänger-Themen 9
T Variable in Windows Kommandozeile schreiben Java Basics - Anfänger-Themen 4
P Java-Konsolenanwendung mit Parameterübergabe (Windows) Java Basics - Anfänger-Themen 3
G Java unter Mac = schlecht | Windows = gut? Java Basics - Anfänger-Themen 14
M datei startet unter windows 7 nicht Java Basics - Anfänger-Themen 12
J Windows Maus-Zeigerbeschleunigung aktivieren/deaktivieren - Mit Java möglich? Java Basics - Anfänger-Themen 2
N .jar läuft nicht unter Windows 7 Starter Java Basics - Anfänger-Themen 4
FrozeTee .java Dateien unter Windows 7 werden nicht angezeigt Java Basics - Anfänger-Themen 7
S .jar/java Datei ausführen Windows 7 64bit?! Java Basics - Anfänger-Themen 7
P Windows vs. Ubuntu verschiedener Output Java Basics - Anfänger-Themen 31
A Laufende Applikation hindert Windows am herunterfahren Java Basics - Anfänger-Themen 7
S Umgebungsvariablen unter Windows XP Java Basics - Anfänger-Themen 6
A Windows Builder Java Basics - Anfänger-Themen 4
M Windows Aktionen abfangen Java Basics - Anfänger-Themen 3
Z Umgebungsvariable PATH-Umgebungsvariable unter Windows 7 Java Basics - Anfänger-Themen 27
B Programm startet in IDE,aber nicht in Windows Java Basics - Anfänger-Themen 4
R Umlaute Mac -> Windows Java Basics - Anfänger-Themen 2
S Windows Registry nur lesen Java Basics - Anfänger-Themen 3
E Input/Output Linux datei in Windows zeilenweise einlesen Java Basics - Anfänger-Themen 4
T Windows Fenster Schließen Java Basics - Anfänger-Themen 4
F Frage zu windows/Usbsticks... Java Basics - Anfänger-Themen 2
D Pfadangabe unter windows Java Basics - Anfänger-Themen 7
S Erste Schritte Probleme Editor (Windows) Java Basics - Anfänger-Themen 13
B Input/Output Textdatei einlesen Windows / Linux Java Basics - Anfänger-Themen 2
M windows lautstärkeregler java Java Basics - Anfänger-Themen 2
C ASCII CODES in Linux anders als auf Windows? Java Basics - Anfänger-Themen 4
maddin86 3 Dateien gleichzeitig speichern in dynamisches Benutzerverzeichnis (Windows) Java Basics - Anfänger-Themen 4
M isHidden() von java.io.File liefert immer true in Windows Java Basics - Anfänger-Themen 3
M Externes Programm maximieren in Windows Java Basics - Anfänger-Themen 9
J Java Tool unter Windows ausführen Java Basics - Anfänger-Themen 8
J Windows Ausführen öffnen Java Basics - Anfänger-Themen 13
C Windows Java unter Unix Java Basics - Anfänger-Themen 2
J JAVA_HOME und path setzen bei windows 7 Java Basics - Anfänger-Themen 5
A Mit Java Mozilla/Windows steuern! Java Basics - Anfänger-Themen 3
S Betriebssystem - Ordner erstellen auf Windows & Linux Java Basics - Anfänger-Themen 3
D nur JOptionPane im Windows Style Java Basics - Anfänger-Themen 3
D Windows 7 + jre = Fehler Java Basics - Anfänger-Themen 2
J Classpath bestimmen, unter Windows 7 Java Basics - Anfänger-Themen 2
F Programm sehr langsam. Windows 7? Java Basics - Anfänger-Themen 23
H Datei in den Windows-Programmordner kopieren Java Basics - Anfänger-Themen 5
H Windows Console Ausgabe ? Java Basics - Anfänger-Themen 3
M Java einrichten unter Windows 7 Java Basics - Anfänger-Themen 12
T Windows 7 - Umgebungsvariable ändern Java Basics - Anfänger-Themen 11
M .jar datei starten (windows 7) Java Basics - Anfänger-Themen 2
U JDK auf Windows 7 Java Basics - Anfänger-Themen 17
S Befehl "javac" funktioniert und Windows 7 nicht? Java Basics - Anfänger-Themen 3
H windows 7 javac/path nicht gefunden Java Basics - Anfänger-Themen 3
C Windows Look and Feel unter Linux Java Basics - Anfänger-Themen 10
C laufende Windows Prozesse auslesen/ermitteln Java Basics - Anfänger-Themen 3
JFeel-x renameTo windows XP geht gar nicht? Java Basics - Anfänger-Themen 5
M BufferedReader.readline() Unix/Windows Zeilenumbruch Java Basics - Anfänger-Themen 4
M prozess-managment Windows java Java Basics - Anfänger-Themen 4
L Windows-Umgebungsvariablen mit Java setzen? Java Basics - Anfänger-Themen 11
B Java-Anwendung im Windows Design Java Basics - Anfänger-Themen 8
G Windows 98SE/Extern Programm aufrufen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben