Tonicc Geschrieben 8. Juni 2007 Geschrieben 8. Juni 2007 Hi, ich habe ein recht großes Problem mit meinem Prog: Ich möchte mit dem Filechooser eine Datei öffnen und diese dann auf einer geordneten JList darstellen. Das Datamodell wird zwar aktualisiert, aber es wird einfach nichts in der JlList angezeigt. Wäre echt super wenn mir jemand helfen könnte. Ich denke das Problem liegt irgendwo in dieser Methode: public void actionPerformed( ActionEvent event){ /** * Methode zum öffnen einer Datei * */ JFileChooser waehlen = new JFileChooser(); //Vector inhalt = new Vector(); waehlen.setMultiSelectionEnabled(false); try { if (waehlen.showOpenDialog(fenster) == JFileChooser.APPROVE_OPTION) { String dateiname = waehlen.getSelectedFile().getName(); SwingFenster fensterobjekt = new SwingFenster(); System.out.println ("Datei "+waehlen.getSelectedFile()+" geöffnet."); Vector <String> dateiinhalt = Streams.Dateilesen(waehlen.getSelectedFile()); for (int i=0; i < fensterobjekt.karte.length; i++){ JListData data = fensterobjekt.makeDataModel(fensterobjekt.karte[i],waehlen.getSelectedFile()); liste = fensterobjekt.jliste[i]; //System.out.println(data.getSize()); //System.out.println(fensterobjekt.karte[i]); System.out.println("vorher: "+liste.getModel().getElementAt(0)); //fensterobjekt.jliste[i].setModel(data); liste.setModel(data); liste.repaint(); //fensterobjekt.jliste[i].updateUI(); System.out.println("nachher: "+liste.getModel().getElementAt(0)); } //fensterobjekt.fensterupdaten(); System.out.println("test::: "+fensterobjekt.jliste[0].getModel().getElementAt(0)); } } catch (NullPointerException exp){ String nachricht = "Es wurde keine Datei ausgewählt!"; JOptionPane.showMessageDialog(fenster, nachricht, "Warnung",0); System.out.println(exp.getMessage()); } } Hier noch mein restlicher Code (ich weiß es ist viel, aber wäre nett wenn mir trotzdem jemand helfen könnte: Die Klasse in der die GUI erstellt wird: package gui; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.io.File; import java.util.Vector; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import util.Streams; public class SwingFenster extends JFrame{ // Instanz- oder Membervariablen String[] karte = { "A", "B","C", "D","E","F", "G","H","I", "J", "K", "L", "M","N","O", "PQ","R","ST","UVW","XYZ"}; JPanel listPanel = new JPanel(); /** * JList */ public JList[] jliste = new JList[karte.length]; public JListData[] datamodellarray = new JListData[karte.length]; JPanel panel = new JPanel(); public JList liste; JListData dataModel; JTabbedPane tabbedPane = new JTabbedPane(); int i; Container cpane = this.getContentPane(); GridBagLayout grid = new GridBagLayout(); GridBagConstraints constraints = new GridBagConstraints(); public SwingFenster(){ // Konstruktor mit Parameter // Aufruf des Konstruktors der Oberklasse super("Swing Fenster"); this.setJMenuBar(new Menu(this)); //legt die Bar auf das Panel cpane.setLayout(grid); makeTabbedPane(new File("prog2Mappe.txt")); }// end of constructor // eigene Methoden void makeTabbedPane(File datei) { for (i=0; i < karte.length; i++){ panel = makeTextPanel(karte[i],datei,i); //übergibt karte[i],also den Karteikartenreitername an makeTextPanel tabbedPane.addTab(karte[i], null, panel, "Namen mit \"" + karte[i] + "\""); } cpane.add(tabbedPane); // tabbedPane auf Panel legen this.pack(); // alles packen } /** * Update look and feel * @param lafStyle (String) = * "javax.swing.plaf.metal.MetalLookAndFeel", * "com.sun.java.swing.plaf.motif.MotifLookAndFeel", * "com.sun.java.swing.plaf.windows.WindowsLookAndFeel", */ void updateLAF(String lafStyle){ System.out.println("updateLAF = " + lafStyle); try{ UIManager.setLookAndFeel( lafStyle ); SwingUtilities.updateComponentTreeUI( this ); } catch(Exception ex){ System.out.println("Fehler beim L&F " + ex.getMessage()); } this.pack(); // alles schön packen } public void fensterupdaten() { SwingUtilities.updateComponentTreeUI(this); System.out.println("fenster geupdated"); } public JPanel makeTextPanel(String buchstabe, File datei,int i) { liste = makeJList(buchstabe,datei,i); jliste[i] =liste; // Referenz von liste JPanel panel = new JPanel(); // Instanzierung eines JPanel-Objektes panel panel.setLayout(new GridLayout(1, 1)); // Festlegung des Layouts des JPanel-Objektes JScrollPane scrollPane = new JScrollPane(jliste[i]); //Hüllklasse für Scrollbalken scrollPane.setPreferredSize(new Dimension(450, 260)); //Festlegung der Grösse des scrollPanels liste.addListSelectionListener(new ListSelectionAdapter(liste)); /* Anbinden des ListSelectionListener an die liste */ panel.add(scrollPane); // ScrollPane wird auf das panel gelegt return panel; } /** * Methode, die die JList erstellt * * * @param buchstabe beinhaltet den Name des jeweiligen Karteikartereiters * @return */ public JList makeJList(String buchstabe, File datei,int i) { //Festlegung, wie die JListData aufgebaut werden soll(AbstractListModel) dataModel = makeDataModel(buchstabe,datei); // übergibt buchstabe an das JListmodel datamodellarray[i] = dataModel; /* Instanzierung eines JListData-Objektes*/ JList liste = new JList(datamodellarray[i]); jliste[i] =liste; /* Instanzierung einer JList liste, die als Übergabeparameter das JListData-Objekt beinhaltet.*/ liste.setLayoutOrientation(JList.VERTICAL); // Layout der liste festlegen liste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); liste.setVisibleRowCount(-1); // liste wird sichtbar gemacht und ist nicht vorselektiert return liste; } public JListData makeDataModel(String buchstabe, File datei) { JListData dataModel2 = new JListData(datei,buchstabe); //System.out.println(dataModel2.getSize()); return dataModel2; } /** * Die Klasse ListSelectionAdapter dient dazu, die Werte aus dem Swing Fenster selectedName, * selectedIndex und selectedListe mit dem Selektierten zu aktualisieren. * */ class ListSelectionAdapter implements ListSelectionListener { JList meineListe; // Deklaration eines JList-Objektes /** * Der Konstruktor ListSelectionAdapter implementiert das JList-Objekt liste * und übergibt als Parameter die liste. * @param liste die selektierte Liste. */ public ListSelectionAdapter(JList liste) { meineListe= liste; // JList liste wird auf meineListe abgelegt } /** * Die Methode valueChanged wird aufgerufen bei Auswahl der Werte * @param ev ist das eingetretene Ereignis. */ public void valueChanged(ListSelectionEvent ev ) { if(ev.getValueIsAdjusting() == false){ String selectedName = (String)meineListe.getSelectedValue(); System.out.println("selektierter String " + selectedName); int selectedIndex = meineListe.getSelectedIndex(); System.out.println("selektierter Index " + selectedIndex); } } }// end of inner class ListSelectionAdapter /** * Methode, die den Inhalt der textarea ausliest, ihn nach zeilen trennt * und zurückgibt * */ /* public static String[] getkartelength() { return karte; } */ /** Hilfmethoden * * */ void addComponent ( Container container, Component component, int gridx, int gridy, int gridwidth, int gridheight) { addComponent(container,component, gridx, gridy,gridwidth, gridheight, GridBagConstraints.WEST); } void addComponent ( Container container, Component component, int gridx, int gridy, int gridwidth, int gridheight, int anchor) { GridBagConstraints constr = new GridBagConstraints(); constr.gridx = gridx; constr.gridy = gridy; constr.gridwidth = gridwidth; constr.gridheight = gridheight; constr.anchor = anchor; container.add(component,constr); } // innere Klassen }// end of class SwingFenster Zitieren
Tonicc Geschrieben 8. Juni 2007 Autor Geschrieben 8. Juni 2007 Die Klasse in der das Menü und die Actionlistener sind (hier ist auch das Problem mit dem öffnen+hinzufügen) Java: /** package gui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import util.Streams; public class Menu extends JMenuBar{ /** * */ private static final long serialVersionUID = 1L; JList liste; //public String[] kartenlänge = SwingFenster.getkartelength(); //public JListData[] dataModel = SwingFenster.getdatamodell(); //static Vector <String> data = new Vector<String>(10,1); //JListData data = new JListData(); //SwingFenster fenster2 = new SwingFenster(); //Vector dlist = null; //Menu menu = null; JMenu // PullDownMenu mnuFile = new JMenu("Datei"), mnuNamen = new JMenu("Namen"), mnulookfeel = new JMenu("look&feel"), mnuInfo = new JMenu("Info"); //Überpunkte JMenuItem mniFileOpen = new JMenuItem("öffnen"), mniFileSave = new JMenuItem("sichern"), mniEnde = new JMenuItem("beenden"); JMenuItem mnieinfügen = new JMenuItem("einfügen"), mnilöschen = new JMenuItem("löschen"), mniändern = new JMenuItem("ändern"); JMenuItem mniWindows = new JMenuItem("Windows"), mniMetal = new JMenuItem("Metal"), mniMotif = new JMenuItem("Motif"); JMenuItem mniAutor = new JMenuItem("Autor"), mniHelp = new JMenuItem("Hilfe"); SwingFenster fenster = null; // Konstruktor public Menu(JFrame f){ fenster = (SwingFenster)f; // Referenz auf das Fenster System.out.println("Menueleiste konstruiert."); // ----------------------------------------------- mnuFile.add( mniFileOpen ); // Item auf PulldownMenu legen mnuFile.add( mniFileSave ); // Item auf PulldownMenu legen mnuFile.addSeparator(); //Separator einfügen mnuFile.add( mniEnde ); // Item auf PulldownMenu legen // Listener anbinden ------------------------ mniFileOpen.addActionListener(new ActionAdapterread()); // ActionAdapter um zu lesen mniFileSave.addActionListener(new ActionAdapterwrite()); // ActionAdapter um zu schreiben mniEnde.addActionListener(new ActionAdapterExit()); // ActionAdapter um zu beenden mnuNamen.add(mnieinfügen); // Item auf PulldownMenu legen mnuNamen.add(mnilöschen); // Item auf PulldownMenu legen mnuNamen.add(mniändern); // Item auf PulldownMenu legen mnieinfügen.addActionListener(new ActionAdaptereinfügen()); // ActionAdapter um zu lesen mnilöschen.addActionListener(new ActionAdapterlöschen()); // ActionAdapter um zu schreiben mniändern.addActionListener(new ActionAdapterändern()); // ActionAdapter um zu beenden mnulookfeel.add( mniWindows ); // Item auf PulldownMenu legen mnulookfeel.add( mniMetal ); // Item auf PulldownMenu legen mnulookfeel.add( mniMotif ); // Item auf PulldownMenu legen // Listener anbinden ------------------------ mniWindows.addActionListener(new ActionAdapterchange()); // ActionAdapter zum ändern des look&feel mniMetal.addActionListener(new ActionAdapterchange()); // ActionAdapter zum ändern des look&feel mniMotif.addActionListener(new ActionAdapterchange()); // ActionAdapter zum ändern des look&feel mnuInfo.add(mniAutor);// Item auf PulldownMenu legen mnuInfo.add(mniHelp);// Item auf PulldownMenu legen mniAutor.addActionListener(new ActionAdapterAutor()); // ActionAdapter für Autoreninfos mniHelp.addActionListener(new ActionAdapterHelp()); // ActionAdapter der Hilfefunktion // PullDownMenu auf MenuLeiste legen this.add( mnuFile ); //PullDownMenu auf MenuLeiste legen this.add( mnuNamen ); // PullDownMenu auf MenuLeiste legen this.add( mnulookfeel ); // PullDownMenu auf MenuLeiste legen this.add(mnuInfo); }// end of constructor //------------- ActionListener Interfaces -------------------- // Actionadapter für das Einfügen von Namen class ActionAdaptereinfügen implements ActionListener{ public void actionPerformed(ActionEvent arg0) { SwingFenster fensterobjekt = new SwingFenster(); String s = (String) JOptionPane.showInputDialog( fenster, "Bitte geben sie den neuen Eintrag ein", "Neuer Eintrag", JOptionPane.INFORMATION_MESSAGE, null, null, "Name;Vorname"); // If a string was returned, say so. if ((s != null) && (s.length() > 0)) { System.out.println("eingefügt wird "+ s); String[] karte =fensterobjekt.karte; for (int k=0; k<karte.length; k++){ if (karte[k].contains(s.substring(0,1))) { System.out.println("ja"); //fensterobjekt.datamodellarray[k].addElement(s); System.out.println(fensterobjekt.datamodellarray[k].getElementAt(0)); } } } // If you're here, the return value was null/empty. else System.out.println("Bitte etwas eingeben!"); } } Zitieren
Tonicc Geschrieben 8. Juni 2007 Autor Geschrieben 8. Juni 2007 Fortsetzung der gleichen Klasse: // Actionadapter für das Löschen von Namen class ActionAdapterlöschen implements ActionListener{ public void actionPerformed(ActionEvent arg0) { Object[] possibilities = {"ham", "spam", "yam"}; String o = (String)JOptionPane.showInputDialog( fenster, "Complete the sentence:\n" + "\"Green eggs and...\"", "Customized Dialog", JOptionPane.PLAIN_MESSAGE, null, possibilities, "ham"); //String s = (String) JOptionPane.showConfirmDialog(arg0, arg1) // If a string was returned, say so. if ((o != null) && (o.length() > 0)) { System.out.println("Green eggs and... " + o + "!"); } // If you're here, the return value was null/empty. else System.out.println("Come on, finish the sentence!"); } } // Actionadapter für das Ändern von Namen class ActionAdapterändern implements ActionListener{ public void actionPerformed(ActionEvent arg0) { //JOptionPane.showInputDialog( // fenster, "Eintrag ändern"); } } // Actionadapter für die Autordaten class ActionAdapterAutor implements ActionListener{ public void actionPerformed(ActionEvent arg0) { JOptionPane.showMessageDialog( fenster, "Autordaten"); } } // Actionadapter für die Hilfe class ActionAdapterHelp implements ActionListener{ public void actionPerformed(ActionEvent arg0) { /** * Methode zum Anzeigen der Hilfe * */ JOptionPane.showMessageDialog( fenster, "Datei: öffnet und speichert Dateien. Schließen beendet das Programm.\n" + "look&feel: ändert das Aussehn des Fensters.\n" + "Info: Infos über den Autor und die Hilfe.\n" + "ok button: schreibt den Namen und die Email in die Konsole.\n" + "klicken auf die restlichen Items: gibt ihren Namen auf der Konsole aus."); } } //Actionadapter zum Beenden class ActionAdapterExit implements ActionListener{ public void actionPerformed(ActionEvent arg0) /** * Methode zum beenden * */ { System.exit(0); } } //ActionAdapter für look&feel änderung class ActionAdapterchange implements ActionListener{ public void actionPerformed(ActionEvent ev) { /** * Methode um das look and feel einzustellen * */ Object quelle = ev.getSource(); if (quelle == mniWindows) { fenster.updateLAF("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } if (quelle == mniMetal) { fenster.updateLAF("javax.swing.plaf.metal.MetalLookAndFeel"); } if (quelle == mniMotif) { fenster.updateLAF("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); } } } //ActionAdapter zum lesen class ActionAdapterread implements ActionListener{ public void actionPerformed( ActionEvent event){ /** * Methode zum öffnen einer Datei * */ JFileChooser waehlen = new JFileChooser(); //Vector inhalt = new Vector(); waehlen.setMultiSelectionEnabled(false); try { if (waehlen.showOpenDialog(fenster) == JFileChooser.APPROVE_OPTION) { String dateiname = waehlen.getSelectedFile().getName(); SwingFenster fensterobjekt = new SwingFenster(); System.out.println ("Datei "+waehlen.getSelectedFile()+" geöffnet."); Vector <String> dateiinhalt = Streams.Dateilesen(waehlen.getSelectedFile()); for (int i=0; i < fensterobjekt.karte.length; i++){ JListData data = fensterobjekt.makeDataModel(fensterobjekt.karte[i],waehlen.getSelectedFile()); liste = fensterobjekt.jliste[i]; //System.out.println(data.getSize()); //System.out.println(fensterobjekt.karte[i]); System.out.println("vorher: "+liste.getModel().getElementAt(0)); //fensterobjekt.jliste[i].setModel(data); liste.setModel(data); liste.repaint(); //fensterobjekt.jliste[i].updateUI(); System.out.println("nachher: "+liste.getModel().getElementAt(0)); } //fensterobjekt.fensterupdaten(); System.out.println("test::: "+fensterobjekt.jliste[0].getModel().getElementAt(0)); } } catch (NullPointerException exp){ String nachricht = "Es wurde keine Datei ausgewählt!"; JOptionPane.showMessageDialog(fenster, nachricht, "Warnung",0); System.out.println(exp.getMessage()); } } } }// end of inner classes }// class MenueLeiste Zitieren
Tonicc Geschrieben 8. Juni 2007 Autor Geschrieben 8. Juni 2007 Klasse die die DataList enthält: package gui; import java.io.File; import java.util.Collections; import java.util.Vector; import javax.swing.AbstractListModel; import javax.swing.JFrame; import util.Streams; import gui.SwingFenster; Java: public class JListData extends AbstractListModel { /** * */ private static final long serialVersionUID = 1L; /** * Deklarieren eines Vector-Datenspeichers. */ public Vector<String> dlist = new Vector<String>(); /** * Referenz auf das Hauspfenster. */ private JFrame fenster; File datei2; /** * Konstruktor * * @param Referenz * auf das Hauspfenster. */ public JListData(File datei, String buchstabe) { datei2 = datei; makeData(buchstabe); } /** * Die Methode makeData liest Daten ein und speichert sie im Datenspeicher * * @return Datenspeicher */ public Vector<String> makeData(String buchstabe) // bekommt buchstabe vom // konstruktor { Vector<String> eintraege = Streams.Dateilesen(datei2); for (String eintrag : eintraege) { // Schleife, die nur die jeweiligen Strings liefert, spart code und schafft übersichtlichkeit { if (buchstabe.contains(eintrag.substring(0, 1).toUpperCase())) { dlist.add(eintrag); } } } return dlist; // Rückgabe des Datenspeichers } /** * Die Methode getElementAt holt das selektierte Element an der Stelle des * Indexes. * * @param index * ist der Index, der anzeigt, welches Elememt geholt werden * soll. * @return String am Index i */ public Object getElementAt(int index) { return dlist.elementAt(index); // Rückgabe des Elements an der // entsprechenden Position } /** * Die Methode getSize gibt die Grösse des Datenspeichers zurück. * * @return int Grösse des Datenspeichers */ public int getSize() { return dlist.size(); // Rückgabe der Grösse des Datenspeichers } /** * Diese Methode wird aufgerufen, um ein neues Element in der JList * darzustellen. * * @param s * das ist der <strong>neue String </strong>, der dem * Datenspeicher hinzugefügt werden soll * */ public void addElement(String s) { // neues Element dem Datenspeicher hinzufügen dlist.addElement(s); Collections.sort(dlist); // nun das View (Jlist) aktualisieren - Fire-Event auslösen //this.fireIntervalAdded(this, dlist.size() - 1, dlist.size()); this.fireIntervalAdded(this,0, getSize()); } public void removeElement(String s) { // neues Element dem Datenspeicher hinzufügen dlist.remove(s); Collections.sort(dlist); // nun das View (Jlist) aktualisieren - Fire-Event auslösen this.fireIntervalRemoved(this, dlist.size() - 1, dlist.size()); } public void changeElement(int index,String s) { dlist.set(index, s); Collections.sort(dlist); this.fireContentsChanged(this, dlist.size() - 1, dlist.size()); } }// end of class AbstractListModel Klasse mit den Methoden zum einlesen und speichern Java: package util; import java.io.*; import java.util.*; public class Streams { public static Vector <String> Dateilesen(File Datei) { //public static Vector Dateilesen() { /** * <b>Dateilesen(String Datei)</b><br> * Methode zum zeilenweisen Einlesen aus einer Datei und speichern in Vector * @param Datei (File) : * */ Vector <String> lines=new Vector(); try { BufferedReader reader = new BufferedReader(new FileReader(Datei)); // muss noch geändert werden in geöffnete datei bzw zurückgeändert werden in Datei while (reader.ready()){ String line=reader.readLine(); lines.add(line); } reader.close(); } catch(FileNotFoundException exp) { System.out.println("Fehler: "+ exp.getMessage()); } catch(IOException exp) { System.out.println("Fehler: "+ exp.getMessage()); } return lines; } public static void Dateischreiben(String Datei, File closer) { /** * <b>Dateischreiben(String Datei)</b><br> * Methode zum zeilenweisen Schreiben in eine Datei * @param Datei (String) : * */ try { BufferedWriter bw = new BufferedWriter (new FileWriter (closer)); bw.write(Datei); bw.close(); } catch (FileNotFoundException exp) { System.out.println("Fehler: "+ exp.getMessage()); } catch (IOException exp) { System.out.println("Fehler: "+ exp.getMessage()); } } } Zitieren
Aiun Geschrieben 11. Juni 2007 Geschrieben 11. Juni 2007 zunächst ein Tip: ich glaube niemand hier wird sich deinen Code komplett ansehen, debuggen und dir dann sagen wo der fehler liegt. Schon allein aus der Menge heraus. Da hättest du auch alles zum Download anbieten können und es wäre wahrscheinlicher gewesen das sich das jemand ansieht. Zu deinem Problem: ich vermute irgendwas wird nicht aktualisiert, das ist nicht zwangsweise das JTree, sondern kann ein darüberliegendes Panel, Frame, Scrollpane, was auch immer sein. Setze mal testweise eine Randfarbe, hintergrundfarbe oder sonstwas einfaches vom JTree und gug nach ob er das übernimmt. Zitieren
Tonicc Geschrieben 11. Juni 2007 Autor Geschrieben 11. Juni 2007 Stimmt, war evtl bissel unüberlegt. Das öffnen/speichern geht inzwischen, nurnoch das ändern/löschen macht mir Probleme. Ich kann zwar löschen und ändern, wenn ich allerdings das letzte Item einer JList lösche, geht es nichtmehr. Evtl kann mir ja jemand dabei helfen? Hier der Quellcode: // Actionadapter für das Löschen von Namen class ActionAdapterlöschen implements ActionListener{ public void actionPerformed(ActionEvent arg0) { String[] karte =fenster.karte; // String name = ""; for (int j=0; j<karte.length;j++) { if (fenster.jliste[j].getSelectedIndex() != -1) { String name = (String) fenster.jliste[j].getSelectedValue(); // durchsucht die jliste an der Stelle k //nach dem selektierten Wert if (name != null) // wenn der Wert ungleich null ist, wird die OptionPane aufgebaut { int löschen = JOptionPane.showConfirmDialog(fenster, "Wirklich löschen?",name, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); // if (löschen == 0) fenster.datamodellarray[j].removeElement(name); fenster.jliste[j].clearSelection(); break; // else // JOptionPane.showMessageDialog(fenster, "Name nicht gelöscht!"); // // fenster.datamodellarray[j].addElement(aenderung); } //fenster.jliste[j].clearSelection(); } } } } Zitieren
Pinhead Geschrieben 12. Juni 2007 Geschrieben 12. Juni 2007 Hab zwar von der Thematik kaum Ahnung aber so wie ich das verstehe, löscht du erst das Element und hebst danach die Auswahl auf. Wenn es allerdings das letzte Element war, ist ja nix mehr da zum Auswahl aufheben. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.