JList ListSelectionEvent entfernen?

DoppelFabi

Aktives Mitglied
Hey,

Ich schreibe mir gerade ein Programm was mir eine Liste von Kontakten anzeigt und wenn ich drauf klicke kommt !bis jetzt! nur eine Nachricht mit der ID und dem Namen. Da ich habe auch ein Hauptmenu habe und ich hin und her switchen kann, wird diese Klasse natürlich öfter aufgerufen.
Nun ist mein Problem, ich bekomme zwar hin das die Elemente sich nicht verdoppeln in der Liste und auch keine Fehler kommen aber ich bekomme anstatt 2 Nachrichten standard z.b 4 wenn ich diese Klasse 2x öffne. Könnte man irgendwie das ListSelectionEvent entfernen beim switchen und beim starten direkt wieder hinzufügen?

Code:
Java:
package com.hacking.programm.source;

import java.awt.Font;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import com.hacking.programm.utils.Manager;

public class InstagramNormal {

    static JFrame InstagramNormal;

    static JButton Back;

    static JList<Element> list = new JList<>();
    static DefaultListModel<Element> model = new DefaultListModel<>();

    JSplitPane pane = new JSplitPane();

    public InstagramNormal() {

        Manager.createOtherFrames("Hacking-Programm - Instagram Normal", "/com/hacking/programm/files/Icon.jpg", 750,
                800, JFrame.EXIT_ON_CLOSE, false, true, false, true);
        Manager.createPanel(InstagramNormal);
        InstagramNormal = Manager.otherframes;

        Manager.createExitButton(InstagramNormal);
        Manager.createBackgroundButton(InstagramNormal);
        Manager.createReloadButton(InstagramNormal);
        Manager.createInstagramButton(InstagramNormal);
        Manager.createYouTubeButton(InstagramNormal);
        Manager.createBackButton(InstagramNormal);

        Manager.createLabel("Instagram", new Font("Mad Hacker", 0, 75), 75, -80, 650, 210, InstagramNormal);

        list.setModel(model);
        list.setFixedCellWidth(170);
        list.setBorder(new EmptyBorder(0, 0, 0, 575));

        model.addElement(new Element("das das", 1));
        model.addElement(new Element("dfdffd", 2));
        model.addElement(new Element("grgtgttgr", 3));
        model.addElement(new Element("rethrehtthr", 4));

        Manager.panel.add(list);

        list.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent ls) {
                Element e = list.getSelectedValue();
                System.out.println(e.getID() + "   " + e.getName());
            }
        });

        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setBounds(1, 100, 200, 600);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        InstagramNormal.add(scrollPane);
        Manager.reloadPanel(InstagramNormal, Manager.panel);
        SwingUtilities.updateComponentTreeUI(InstagramNormal);
    }

    public static class Element {
        String name;
        int id;

        public Element(String name, int id) {
            this.name = name;
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getID() {
            return id;
        }

        public void setID(int id) {
            this.id = id;
        }

        @Override
        public String toString() {
            return name;
        }
    }

    public static void closeInstagramNormal() {
        model.removeAllElements();
        InstagramNormal.dispose();
        Manager.frame.setVisible(true);
    }

}

Die closeInstagramNormal wird beim ActionListener ausgeführt wenn man auf mein erstellten Button Back drückt.
 
Das sind noch mehrere Klassen und du siehst ja diese Zeilen:

Java:
        list.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent ls) {
                Element e = list.getSelectedValue();
                System.out.println(e.getID() + "   " + e.getName());
            }
        });

Wenn ich ein Element in der Liste anklicke kommen standard mäßig 2 ausgaben aber wenn ich auf Back und wieder auf diese Kategorie gehe und ein Element anklicke kommen schon 4 ausgaben sprich es verdoppelt sich beim Switchen
 
Komplett alle? Dann kann ich aber nichtmehr auf die closeInstagramNormal von anderen Klassen drauf zugreifen und ich kann in closeInstagram keine Variablen von der Klasse verwenden. Dann bringt das ja auch nichts :/
 
Okay ich habe die meisten Sachen die ich nicht in anderen Klassen verwende zu non static gemacht nun bekomme ich immer 2 ausgaben aber nun bekomme ich diesen Fehler:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.hacking.programm.source.InstagramNormal$1.valueChanged(InstagramNormal.java:62)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.removeIndexInterval(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(Unknown Source)
    at javax.swing.AbstractListModel.fireIntervalRemoved(Unknown Source)
    at javax.swing.DefaultListModel.clear(Unknown Source)
    at com.hacking.programm.source.InstagramNormal.closeInstagramNormal(InstagramNormal.java:111)
    at com.hacking.programm.source.ManagerListener.actionPerformed(ManagerListener.java:47)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)


Folgende Zeilen sind Fehler:
Java:
            @Override
            public void valueChanged(ListSelectionEvent ls) {
                Element e = list.getSelectedValue();
                
                //Sysout wird als Fehler angezeigt
                System.out.println(e.getID() + "   " + e.getName());
                
            }
        });

Java:
    public static void closeInstagramNormal() {
    
    //model clear wird als Fehler angezeigt
        model.clear();
        InstagramNormal.dispose();
        new Menu();
    }

Java:
        } else if(e.getSource() == Manager.Back) {
            
            if(InstagramNormal.InstagramNormal.isShowing()) {
            
            //und diese noch
                InstagramNormal.closeInstagramNormal();
            }


Woran kann das ganze liegen?
 
Komplett alle? Dann kann ich aber nichtmehr auf die closeInstagramNormal von anderen Klassen drauf zugreifen und ich kann in closeInstagram keine Variablen von der Klasse verwenden. Dann bringt das ja auch nichts :/
Jap, alle.

Die dann aufkommenden Probleme solltest du dann sinnvoll lösen, indem du Objekte nutzt.


Static solltest du bei Feldern nur für Konstanten (werte, die sich niemals ändern) und bei Methoden nur für die main und wenn nötig kleine Utility-Funktionen nutzen. In deinem Code gibt es beides nicht.


@mrBrown Weil er es überschreibt bei static (call by reference) ? Kann das sein?
Ne. Eher, weil static da eben nicht überschrieben wird, er also derselben Liste ständig neue Listener hinzufügt.
Oder einfach: weil static benutzt wird, ohne zu Wissen was genau es bewirkt.
 
Okay ich habe die meisten Sachen die ich nicht in anderen Klassen verwende zu non static gemacht nun bekomme ich immer 2 ausgaben aber nun bekomme ich diesen Fehler:
Nicht die meisten, alles.

NPEs sind leicht zu beheben, einfach mal mit dem Debugger prüfen, was null ist, und dann beheben 😉

Genauso die anderen Fehler: prüfen, was da der Fehler ist (zb die Fehlermeldung lesen) und dann überlegen, warum das dort ein Fehler ist, und wie man das lösen kann.
 
Der Fehler liegt dabei, das ich die Elemente von der Liste entfernen muss beim back, weil sonnst wird alles immer wieder neu geladen und verdoppelt sich. Aber wenn ich von model was entfernen möchte kommen sogut wie immer Fehler. sowas wie model.clear geht nicht oder model.removeAllElements geht auch nicht. Gibt es bessere Methoden die funktionieren?
 
Entfern erstmal alle static.

Dann fix alle Compile-Fehler (dafür wirst du ziemlich sicher @Robats Tipp beherzigen müssen...)

Danach kannst du dir über eventuell vorhandene doppelte Elemente Gedanken machen.
 
Und mit einem passenden Design sollte es auch nicht vorkommen, dass Elemente doppelt hinzugefügt werden. Aber auch das Problem sollte sich lösen lassen wenn du dir a) Grundlagen anschaust und dich b) über passende LayoutManager (CardLayout zB) informierst
 
Nein, der Fehler ist, dass Du offenbar eine statische Liste hast, die einmal beim Laden der Klasse initialisiert wird. Und da fügst Du dann immer wieder die Elemente hinzu.

Daher: Nutz keine statischen Variablen, so wie es mehrfach gesagt wurde. Wenn irgend etwas auf die Instanz zugreifen muss, dann gibst Du da eine entsprechende Referenz und gut ist es.
 

Zurück
Oben