# JListe aktualiesieren



## JonnieWalker (31. Mrz 2010)

Hi Leute
kann mir mal jemand sagen warum er meine Liste nicht aktualisiert.
in der Liste lass ich mir daten anzeigen und dann selektiere ich ein datensatz und lösch ihn.
klappt super.aber der datensatz soll auch sofort dann verschwinden.

ich habs so versucht:


```
db.loescheWort((Words) jList1.getSelectedValue());
 jList1.repaint();
 JOptionPane.showMessageDialog(this, "Wort entfernt");
```


----------



## Michael... (31. Mrz 2010)

Die Frage ist wo wird was gelöscht. Löscht Du auch den Eintrag aus dem Datenmodell?
Ein repaint() auf die JList aufzurufen ist dabei überflüssig.
Details s. Sun Tutorial: How to use Lists


----------



## JonnieWalker (31. Mrz 2010)

ja der eintrag wird auch in der datenbank gelöscht, so soll es sein.
ok ich such da mal. danke


----------



## eRaaaa (31. Mrz 2010)

Was du im Moment hast ist ein einfaches read-only ListModel. 
Du brauchst also ein anderes Modell, welches/wie usw. findest du im Link oben


----------



## JonnieWalker (31. Mrz 2010)

hi da bin ich
das problem ist ich arbeite mit NetBeans und da hab ich einfach die SwingJList genommen.
ich kann da nichts dan verändern. die liste habe ich nicht selber erstellt:S


----------



## JonnieWalker (31. Mrz 2010)

wenn ich diese Liste einem defaultmodel zuweise dann mekkert er in seinem generierten text das die liste schon vorhanden ist und nichts verändert werden darf.

das muss doch mit einem oder zwei befehlen gehen:S:S:S:S


----------



## eRaaaa (31. Mrz 2010)

Also auch in Netbeans geht das! Bei den Eigenschaften bei *model* klicken..dann in der COmboBox "Angepaßter Quelltext" auswählen und halt so das Model zuweisen. (vllt gehts auch einfacher, ich benutze normal kein Netbeans)


----------



## JonnieWalker (31. Mrz 2010)

ok danke basti du bist echt eine hilfe
ja es gibt echt keinen anderen ausweg das steht überall so in den foren und sonst wo immer mit default list model dann liste zuweisen und ab gehts.

aber danke erstmal und viel spass noch bis morgen


----------



## JonnieWalker (21. Apr 2010)

Leute ich hab alles versucht repaint();, clear();, refresh();, das geht nicht mal
wie schaf ich es wenn ich auf mein Button löschen gehe, und er das Wort löscht aus meiner JList
das diese JList auch aktualisiert wird?

Vielen dank schon mal:

Hier das Event mit der Methode:

```
db.loescheWort((Words) jList1.getSelectedValue());
        st.StatWortLoeschen();
        JOptionPane.showMessageDialog(this, "Wort entfernt");
```
Ich habe kein ListModel oder änliches,weil ich mit NetBeans arbeite und mir die JList einfach ins Panel gezogen habe!


----------



## Hogli (21. Apr 2010)

Hallo,
normalerweise nimmt man:

```
jList1.validate();
```

Vorausgesetzt man hat vorher aus der Liste gelöscht:

```
jList1.remove(jList1.getSelectedIndex());
```

Grüße


----------



## JonnieWalker (21. Apr 2010)

ne das klappt leider auch nicht:S
Hat jemand noch ein Vorschlag?

So sieht alles aus:

```
db.loescheWort((Words) jList1.getSelectedValue());
        jList1.validate();
```
also db.loescheWort((Words)jList1.getSelectedValue());
die Methode übergebe ich und sag ihm das er dann auktualisieren soll.
jList1.validate(); funktioniert leider nicht:S


----------



## Gast2 (21. Apr 2010)

Du musst dein Object auch aus dem ListModel entfernen. Sonst wird das nix


----------



## JonnieWalker (21. Apr 2010)

wie denn?
ich hab kein ListModel weil ich mit NetBeans einfach die JList ins Panel gezogen habe.
Kannst du mir bitte sagen wie und ich mach das

Danke


----------



## Gast2 (21. Apr 2010)

Guck dir mal mein Beispiel an:


```
import javax.swing.DefaultListModel;


public class ListBsp extends javax.swing.JFrame {

    /** Creates new form ListBsp */
    public ListBsp() {
        initComponents();
        // add some test data
        DefaultListModel model = (DefaultListModel)jList.getModel();

        model.addElement("Wort1");
        model.addElement("Wort2");
        model.addElement("Wort3");
        model.addElement("Wort4");
        model.addElement("Wort5");
        model.addElement("Wort6");
        model.addElement("Wort7");
        model.addElement("Wort8");
        model.addElement("Wort9");
        model.addElement("Wort10");

    }

    private void removeWord(Object o){
        DefaultListModel model = (DefaultListModel)jList.getModel();
        System.out.println("Removing "+o);
        model.removeElement(o);
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jList = new javax.swing.JList();
        jButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jList.setModel(new DefaultListModel());
        jScrollPane1.setViewportView(jList);

        jButton.setText("remove selected item");
        jButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 258, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void jButtonActionPerformed(java.awt.event.ActionEvent evt) {
        Object[] selectValues = jList.getSelectedValues();
        for(Object o : selectValues){
            removeWord(o);
        }
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ListBsp().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton;
    private javax.swing.JList jList;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration

}
```

das ist auch mit Netbeans grade zusammengeklickt. Du solltest auch in Netbans ein ListModel setzen. Klick dazu einfach auf die Liste, dann auf Properties und bei model auf die drei Punkte. Im Dialog wählst du dann im Dropdown "Custom Code" und gibst ein: new DefaultListModel().

Fertig. Macht dir vieles einfacher.


----------



## JonnieWalker (21. Apr 2010)

Ok danke, ich schau mir das mal an jetzt
Jetzt hab ich aber noch ein kleines Problem.
Ich kann in meiner Liste ein Wort selektieren und in eine Andere Liste übergeben.
Das klappt auch.
Aber was ist denn falsch an meiner Anweisung, weil er das Wort immer noch in der Liste drinn lässt und er schreibt es noch in die andere. Das soll eigendlich nicht so sein:S

```
Hier die Methode:
public void selectiereWort(Words w) {
        try {
            String sql = null;
            sql = "insert into eloftswords(word) values (?) ";
            PreparedStatement befehl = v2.prepareStatement(sql);
            befehl.setString(1, w.toString());
            befehl.executeUpdate();
            befehl.close();
        } catch (Exception ex) {
        }
    }
```


----------



## Gast2 (21. Apr 2010)

Falscher Codeauschnitt? 

Wenn du das Wort verschieben willst musst du es natürlich erst in die zweite Liste einfügen, dann aus der ersten entfernen.


----------



## JonnieWalker (21. Apr 2010)

Hmm... sorry aber ich versteh dein Code nicht:S
Also den mit der ArrayList also mit der JList


----------



## JonnieWalker (21. Apr 2010)

wie meinst du das jetzt?
hab ich die zeilen vertauscht oder so?


----------



## Michael... (21. Apr 2010)

Mein Vorschlag wird Dir nicht unbedingt gefallen:
Verwende ein Model (DefaultListModel würde schon genügen) für die JList und entferne den Eintrag nicht nur aus der Datenbank, sondern auch aus dem Model.

Möglich wäre auch, die JList nach dem Löschvorgang mit den Daten aus der DB neu zu befüllen.


----------



## JonnieWalker (21. Apr 2010)

Ich hab diese zwei Methoden!

Wort löschen aus der Liste:
Das funktioniert auch sofort:

```
public void loescheWort(Words w) {
        try {
            String sql = null;

            sql = "delete from eloftwords where word =? ";
            PreparedStatement befehl = v2.prepareStatement(sql);
            befehl.setString(1, w.toString());
            befehl.executeUpdate();
            befehl.close();
        } catch (Exception ex) {
        }
    }
```

und dann noch jetzt die Methode von eben die ist gleich unter der loescheWort();


----------



## JonnieWalker (21. Apr 2010)

Dein Vorschlag hört sich gut an also ich füge meine JList in ein ListModel.
Dann kann ich das einfach in dem Actionevent beim LöschenButton ausführen
Meinst du das so?


----------



## Gast2 (21. Apr 2010)

Hast du dir ansatzweise meinen code angesehn? Das ist alles drin 

Hier noch ein verschieben beispiel:


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * ListBsp.java
 *
 * Created on 21.04.2010, 12:58:16
 */

package teste;

import javax.swing.DefaultListModel;
import javax.swing.JList;

public class ListBsp extends javax.swing.JFrame {

    /** Creates new form ListBsp */
    public ListBsp() {
        initComponents();
        // add some test data
        DefaultListModel model = (DefaultListModel)jListA.getModel();

        model.addElement("Wort1");
        model.addElement("Wort2");
        model.addElement("Wort3");
        model.addElement("Wort4");
        model.addElement("Wort5");
        model.addElement("Wort6");
        model.addElement("Wort7");
        model.addElement("Wort8");
        model.addElement("Wort9");
        model.addElement("Wort10");

    }

    private void removeWord(Object o){
        DefaultListModel model = (DefaultListModel)jListA.getModel();
        System.out.println("Removing "+o);
        model.removeElement(o);
    }

    private void moveObjectToList(Object o, JList source, JList target){

        System.out.println("Removing "+o);
        ((DefaultListModel)source.getModel()).removeElement(o);
        System.out.println("Adding to "+o);
        ((DefaultListModel)target.getModel()).addElement(o);
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jListA = new javax.swing.JList();
        jButtonRemoveA = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        jListB = new javax.swing.JList();
        jButtonRemoveB = new javax.swing.JButton();
        jButtonMoveB = new javax.swing.JButton();
        jButtonMoveA = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jListA.setModel(new DefaultListModel());
        jScrollPane1.setViewportView(jListA);

        jButtonRemoveA.setText("remove");
        jButtonRemoveA.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonRemoveAActionPerformed(evt);
            }
        });

        jListB.setModel(new DefaultListModel());
        jScrollPane2.setViewportView(jListB);

        jButtonRemoveB.setText("remove");
        jButtonRemoveB.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonRemoveBActionPerformed(evt);
            }
        });

        jButtonMoveB.setText(">>");
        jButtonMoveB.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonMoveBActionPerformed(evt);
            }
        });

        jButtonMoveA.setText("<<");
        jButtonMoveA.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonMoveAActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jButtonRemoveA, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButtonMoveB)
                    .addComponent(jButtonMoveA))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jButtonRemoveB, 0, 0, Short.MAX_VALUE)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 121, Short.MAX_VALUE))
                .addContainerGap(10, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(65, 65, 65)
                        .addComponent(jButtonMoveB)
                        .addGap(18, 18, 18)
                        .addComponent(jButtonMoveA))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 169, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                    .addComponent(jButtonRemoveA)
                                    .addComponent(jButtonRemoveB))))))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    private void jButtonRemoveAActionPerformed(java.awt.event.ActionEvent evt) {
        Object[] selectValues = jListA.getSelectedValues();
        for(Object o : selectValues){
            removeWord(o);
        }
}

    private void jButtonRemoveBActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
}

    private void jButtonMoveAActionPerformed(java.awt.event.ActionEvent evt) {
        Object[] selectValues = jListB.getSelectedValues();
        for(Object o : selectValues){
            moveObjectToList(o,jListB,jListA);
        }
}

    private void jButtonMoveBActionPerformed(java.awt.event.ActionEvent evt) {
        Object[] selectValues = jListA.getSelectedValues();
        for(Object o : selectValues){
            moveObjectToList(o,jListA,jListB);
        }

    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ListBsp().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButtonMoveA;
    private javax.swing.JButton jButtonMoveB;
    private javax.swing.JButton jButtonRemoveA;
    private javax.swing.JButton jButtonRemoveB;
    private javax.swing.JList jListA;
    private javax.swing.JList jListB;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    // End of variables declaration

}
```


----------



## JonnieWalker (21. Apr 2010)

Hab ich aber mir sagt er wenn ich es in properties mache wie bei dir 
cannot cast jList1 to DefaultList....


----------



## Gast2 (21. Apr 2010)

Guck mal hier:


----------



## JonnieWalker (21. Apr 2010)

ich kann mir das nicht angucken,
weil ich keine rechte habe.
unter meinem namen steht immer wartet auf aktivierung.
kann mich mal jemand aktivieren????


----------



## JonnieWalker (21. Apr 2010)

Leute ich hab gerade ein richtiges Problem Festegestellt.

Meine Wortliste zeig mir alle Wörter aus der Datenbank an.
Das soll auch so sein.
Ich hab ein Button-"Doppelte Wörter anzeigen", wenn ich den klicke,
öffnet sich eine zweite Liste und zeigt mir die worte aus der Wortliste die öffters vorkommen an.

Wenn ich mit meiner Methode aber lösche, dann ist das Wort aus der Wortliste auch weg,:S
das soll aber nicht so sein!!!!!!!!!!!!!OMG. hier die Methode:


```
public void loescheDoppelteWoerter(Words w) {
        try {
            String sql = null;
            sql = "delete from eloftwords where word =? ";
            PreparedStatement befehl = v2.prepareStatement(sql);
            befehl.setString(1, w.toString());
            befehl.executeUpdate();
            befehl.close();
        } catch (Exception ex) {
        }
    }
```

also Liste 1:
a
b
c
d
a
a
a

Liste doppelte wörter:
a
a
a
a

dann geh ich auf löschen und er soll mir aber das a aus Liste1 lassen 
sindern nur die a(s)aus Liste zwei löschen


----------



## JonnieWalker (21. Apr 2010)

Hier ist noch meine Methode aus der Datenbankklasse die mir erstmal die Worte holt dir mehr
als einmal vorkommen:


```
Mit der Unterabfrage:
 public ArrayList<Words> getDoppelteWoerter() {
        Words Datensatz;
        ResultSet daten;
        ArrayList<Words> DoppelteWoerter = new ArrayList<Words>();

        try {
            Statement anweisung = v2.createStatement();
            daten = anweisung.executeQuery("SELECT eloftwords.word, wordID FROM eloftwords "
                    + "WHERE word IN"
                    + "(SELECT eloftwords.word FROM eloftwords "
                    + "GROUP BY eloftwords.word "
                    + "HAVING COUNT(*) > 1) ");
            DoppelteWoerter.clear();
            while (daten.next()) {
                Datensatz = new Words(
                        daten.getString("word"),
                        daten.getInt("wordID"));
                DoppelteWoerter.add(Datensatz);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        }
        return DoppelteWoerter;
    }
```

nur ich hab das gefühl ich muss garnicht diese Methode ändern sondern nur die andere da drüber.
Er soll mir auf jedenfall das a in der Wortliste lassen und nur die 3 anderen a(s)anzeigen und die dann löschen in der zweiten liste


----------



## Gast2 (21. Apr 2010)

Aktivieren -> musst du mal die Mail rauskramen die du nach deiner anmeldung bekommen hast, da ist ein Aktivierungslink drin. Evtl kann man den auch neu anfordern, musst mal bei deinen user preferences gucken.

Zu deinem ganzen Listenkram und Problemen. Mal ganz ehrlich. Ich glaube du hast überhaupt keine Struktur in deinem Projekt. Mal sind die Daten in einer JList, dann in einer ArrayList, das nächste mal machst du die modifikationen direkt in der DB. Alle Methoden schrubben auf der DB rum, aber keine ändert das ListenModel etc...

Du musst als aller erstes dein Projekt sauberer strukturieren. Du kannst nur die GUI vernünftig aufbauen wenn dir das Datenmodel klar ist. Sonst hast du sowas wie jetzt, dass Model und Benutzerinteraktion inkonsistent sind. 

Ich glaube auch das du da nicht mehr selber so ganz dran langblickst was du eigentlich machen willst. 

Versuch doch mal in 10 Sätzen zu beschreiben was dein Programm tun soll, und wie du dir gedfacht hast das es das erreichen soll. Dann kann man mal gucken was du schon hast und wo man evtl das ganze besser strukturieren kann. So wie das aussieht läufst du voll vor die Wand.

Ist zumindest meine Meinung nach all den Threads die ich gesehen habe von dir.


----------



## JonnieWalker (21. Apr 2010)

Also mein Programm ist ein Volltextsuch-Programm.
Ein Dokument wird eingescannt und die Worte des Dokumentes werden in die Datenbank in die Tabelle words abgelegt mit einer ID.

Ich hole mir mit eine Methode alle diese Worte aus der Datenbank und lasse sie mir in meiner
JList anzeigen. Das funktioniert auch super.

Problem.
Meine Methode mit der Unterabfrage zeigt mir in einer anderen Liste alle Worte die mehr als einmal vorkommen an. 
Ich dachte mir ok das ist gut so weil, diese Worte können ja einfach dann gelöscht werden, wer braucht die schon.Deswegen auch diese andere kleinere Methode die ich gepostet habe.

Was ich festgestellt habe ist,das er mir nicht nur die Worte die mehr als einmal vorkommen löscht, was ja so sein soll sondern auch das Wort aus der Wortliste.
Also a ist in Wirtliste 3 mal.
In der anderen Liste zeigt er mir das auch an a kommt 3 mal vor also:
a
a
a
dann dachte ich mir lösch nur die zwei a aus der Liste und lass ein a da um es in der ersten Liste weiterhin zu sehen.
Es geht nur darum er soll die zwar löschen aber eins drinn lassen, nur seine häufigkeit.
Das dummeist er macht es auch auf Datenbankebene, dann ist das Wort ganz weg:S


----------



## Gast2 (21. Apr 2010)

Eben, du hast Datenbank, GUI und GUI Model vollkommen vermischt.

1) Definere deine Datenbank operationen.
2) Definere deine GUI Operationen
3) Trenne Anzeige von dem DatenModel

Definere einen sauberen Workflow, sprich was soll passieren wenn auf Button a geklickt wird. Überlege dann welche Methoden du dazu in welcher Reihenfolge aufrufen musst.

Was ich allerdigns nciht verstehe ist - warum legst du worte doppelt in der DB ab? Ich würde es so machen:

Tabelle Word mit Wort und ID
Tabelle Documente mit Documentname und ID
Tabelle WordsInDoc mit DocumentId, WortId und Count

Dann kannst du dir den Rest sparen. Dein Datenmodel ist schon mal Käse an für sich. Du musst ja nicht per Hand arbeit erledigen die dir eigentlich das relationale Datenbankmodel abnehmen kann.

Dann kannst du bei deiner suche einfach selektieren nach: Such mir alle Dokumente die das Wort x mit der Häufigkeit y enthalten. Alles in einem sauberen Select.


----------



## JonnieWalker (21. Apr 2010)

Hej fassy schau mal,
Das ist meine Methode zum importieren einer Textdatei in meine JList.
Wieso gibt er mir ein leeres Array wieder und zeigt mir die Liste nicht an?
Vllt kannst du mir helfen.


```
public void StoppImport(){
        //Den String hab ich deklariert weil ich den Pfad selber angebe und er nicht statisch sein soll
        String tfTabellenName = FensterStoppImp.tfTabellenName.getText();
        BufferedReader datei = null;
        try {
            String file = tfTabellenName;
            datei = new BufferedReader(new FileReader(file));
            String line;
            while ((line = datei.readLine())!= null) {
                list.add(line);
                if (!(line == null)) {
                    System.out.println(line);
                }
            }
            datei.close();
        }catch (Exception ex) {
           }
       }
```
Hiermit hol ich mir eine Liste die ich auf meinem Rechner abgespeichert habe ab.
Bis gestern ging das noch:S.
Vll überseh ich da i-etwas:S


----------



## JonnieWalker (21. Apr 2010)

Das ist mein Button Event.
Das Fenster heisst hier FensterStopImp
Dort gebe ich den Pfad und Dateinamen ein und drücke auf den Button importieren:


```
private void StoppListeImportActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        db.StoppImport();
        //jListStopp ist meine JList aus dem FensterStoppwort, dort soll die Liste gezeigt werden
        FensterStoppwort.jListStopp.setListData(db.list.toArray());
        this.dispose();
        fs.setVisible(true);
    }
```


----------



## Gast2 (21. Apr 2010)

Wenn keine System.out.prints auf die Konsole kommen ist die Datei wohl leer 

Oder aber er rappelt eine Exception raus, das siehst du aber nicht, da dein Catch Block leer ist. 

Versuche mal:

```
}catch (Exception ex) {
              ex.printStackTrace();
        }
```


----------



## JonnieWalker (21. Apr 2010)

Hmm..jetzt macht er das, warscheinlich hatte er ein Problem mit der Datei.
Jetzt klappt es wieder


----------



## JonnieWalker (21. Apr 2010)

So Leute jetzt etwas neues.
Ich möchte gerne zwei Listen in eine JList anzeigen lassen.
Das problem ist momentan zeigt er mir nur die letzte.

Was mach ich falsch?

```
public void StoppImportZwei(){
        //Mein erstes Textfeld wo ich den Pfad zur ersten Liste angebe
        String tfTabellenName = FensterListen.tfListe1Import.getText();
        //Mein zweites Textfeld wo ich den Pfad zur zweiten Liste angebe
        String tfTabellenName2 = FensterListen.tfListe2Import.getText();
        BufferedReader datei = null;
        try {
            String file = tfTabellenName;
            String file2 = tfTabellenName2;
            datei = new BufferedReader(new FileReader(file));
            datei = new BufferedReader(new FileReader(file2));
            String line;
            while ((line = datei.readLine())!= null) {
                list.add(line);
                if (!(line == null)) {
                }
            }
            datei.close();
        }catch (Exception ex) {
               ex.printStackTrace();

           }
       }
```
Hab das Gefühl,dass ist ein richtiger Anfängerfehler:S


----------



## JonnieWalker (21. Apr 2010)

So funktioniert es.
Ich weiss nicht ob das eine saubere Lösung ist, aber ich Poste das mal trozdem.
Vllt braucht das ja mal der ein oder andere.


```
public void StoppImportZweiListen() {
        String tfTabellenName = FensterListen.tfListe1Import.getText();
        String tfTabellenName2 = FensterListen.tfListe2Import.getText();
        BufferedReader datei = null;
        BufferedReader datei2 = null;
        try {
            String file = tfTabellenName;
            String file2 = tfTabellenName2;
            datei = new BufferedReader(new FileReader(file));
            datei2 = new BufferedReader(new FileReader(file2));
            String line;
            String line2;
            while ((line = datei.readLine()) != null) {
                list.add(line);
                if (!(line == null)) {
                }
            }
            while ((line2 = datei2.readLine()) != null) {
                list.add(line2);
                if (!(line2 == null)) {
                }
            }

            datei.close();
            datei2.close();
        } catch (Exception ex) {
            ex.printStackTrace();

        }
    }
```


----------



## Gast2 (21. Apr 2010)

Ist unschön....


Du solltest lieber eine Methode definieren die als argument das File object oder den Pfad nimmt und diese dann zweimal aufrufen.


----------



## Gast2 (21. Apr 2010)

Diese Methode ist btw wieder ein Beispiel das du da vieles vermischt anstatt sauber zu trennen.

Die Aufgabe eine Datei zu lesen hat nicht direkt was damit zu tun auch den Inhalt in einer Liste anzuzeigen. Was machst du z.b. wie oben wenn du drei Datein lesen und anzeigen willst? Den code noch mal duplizieren?

wie wäre es mit:


```
public List<String> getFileContent(String path){
  return getFileContent(new File(path));
}

public List<String> getFileContent(File file){
    ArrayList<String> lines = new ArrayList<String>();
        BufferedReader reader = null;
        try {
            Sring line = null;
            reader = new BufferedReader(new FileReader(file));
            while ((line = datei.readLine()) != null) {
               lines.add(line);
            }        
        } catch (Exception ex) {
            ex.printStackTrace();
 
        } finally {
            reader.close();
        }
        
        return lines;
}
```

Dann rufst du das halt immer auf. Die ArrayList die zurück kommt kannst du dann in dein ListModel überführen, oder ausdrucken oder was auch immer damit machen.


----------



## JonnieWalker (21. Apr 2010)

Wow danke das ist echt viel schöner als die erste Lösung
Schönen Tag noch


----------



## JonnieWalker (22. Apr 2010)

Hallo Leute,
kann mir Jemand sagen wieso ich eine NullPointer bekomme.?
Ich hole mir zwei Textdateien aus einem Ordner und lasse sie mir
in meiner JList anzeigen.
Das funktioniert auch echt gut.
Dann geh ich auf mein Button "Listen-Exportieren" und gebe meinen Pfad ein wo ich sie hin haben will.
Ab dem mom. wo ich den Button klicke, kommt diese Fehlermeldung:


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
```

Hier meine Methode zum exportieren der zusammengestellten Liste aus der Datenbankklasse:

```
String tfTabelleAbsp = FensterStoppExp.tfTabelleAbsp.getText();
        BufferedWriter datei = null;
        Component rootPane = null;
        try {
            String file = tfTabelleAbsp;
            datei = new BufferedWriter(new FileWriter(file));
            //Meine ArrayList heisst "list", mit der lass ich mir erstmal die Tabellen anzeigen
            for (int i = 0; i < list.size(); i++) {
                datei.write(list.get(i).toString());
                datei.newLine();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                datei.close();
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(rootPane, "Bitte einen gültigen Pfad und Dateinamen      angeben");
                return;
            }
        }
    }
```


----------



## JonnieWalker (22. Apr 2010)

So hab das Array umbenannt und auch die Ausgabe in ein neues Fenster verlegt.
Es kommt keine NullPointer mehr aber ein Leeres Array:S

Hier die Methode:


```
public void StoppExportierenZwei() {

        String tfTabellenAbsp = FensterZusammengeführteListenExp.tfTabellenAbsp.getText();
        BufferedWriter datei = null;
        Component rootPane = null;
        try {
            String file = tfTabellenAbsp;
            datei = new BufferedWriter(new FileWriter(file));
            for (int i = 0; i < ZusListen.size(); i++) {
                datei.write(ZusListen.get(i).toString());
                datei.newLine();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                datei.close();
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(rootPane, "Bitte einen gültigen Pfad und Dateinamen angeben");
                return;
            }
        }
    }
```


----------



## JonnieWalker (22. Apr 2010)

In der Methode selber hab ich mal ein 
	
	
	
	





```
System.out.println(ZusListen);
```
, gemacht und er gibt mir die Worte aus. Nur wenn ich halt bei meinem Button "Listen-Exportieren" klicke, macht er auch
und erstellt mir eine leere Textdatei:S

Hier der Event auf den Button:

```
private void NeueTabExpActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        //tfTabellenAbsp.getText(), so heisst meine Pfadeingabe wo ich bestimme wo die Datei hin soll
        if(tfTabellenAbsp.getText().equals("")){
            JOptionPane.showMessageDialog(this, "Bitte Pfad Zielpfad angeben");
            return;
        }
        //Die Methode aus der Datenbank übergeben.
        db.StoppExportierenZwei();
        //Und eine Meldung damit ich weiss das er es getan hat.
        JOptionPane.showMessageDialog(this, "Liste exportiert");
        //Bei dem System.out. ist die ausgabe so> [], also leer!
        System.out.println(db.ZusListen);
    }
```


----------



## JonnieWalker (22. Apr 2010)

Ich hab das Problem erkannt.
Bei der Methode hier wo ich eine aktuell dargestellte Liste abspeichere also exportiere,
hab ich die Methode übergeben.
Ich hab eine Methode getStoppWords(); die mir die Wörter aus der Datenbank holt.

Hier die MethodeNur das wichtigste dargestellt)

```
public void StoppExportieren() {

        String tfTabelleAbsp = FensterStoppExp.tfTabelleAbsp.getText();
        try {
            String file = tfTabelleAbsp;
            datei = new BufferedWriter(new FileWriter(file));
            Hier hol ich mir die Methode und somit auch die Stoppwörter aus der Datenbank.
            for (int i = 0; i < getStoppWords().size(); i++) {
                datei.write(getStoppWords().get(i).toString());
                datei.newLine();

    }
```

Das Problem hier ist, ich kann mir die Worte holen also zwei Textdateien und es wird auch eine dann.
Nur wieso kann ich jetzt nicht ihm sagen, schreib mir jetzt diese Texdateien als Eine i-wo hin.
Hier übergebe ich keine Methode sondern ein Array.
Hat jemand ne Idee?

```
public void StoppExportierenZwei() {

        String tfTabellenAbsp = FensterZusammengeführteListenExp.tfTabellenAbsp.getText();
        BufferedWriter datei = null;
        Component rootPane = null;
        try {
            String file = tfTabellenAbsp;
            datei = new BufferedWriter(new FileWriter(file));
            //Was muss ich hier übergeben, damit er keine leere Datei mir abspeichert sondern das was
            //mir gerade in meiner JList angezeigt wird?????
            for (int i = 0; i < ZusListen.size(); i++) {
                datei.write(ZusListen.get(i).toString());
                datei.newLine();
                System.out.println(ZusListen);
```


----------



## Gast2 (22. Apr 2010)

Ein allerletzer Versuch meinerseits:

Woher sollen wir wissen was in deinen JLists angezeigt wird? Ich gehe mal davon aus das [c]ZusListen[/c] die JList ist? Hast du der jetzt ein Listmodel zugewiesen? 

Hast du mal drüber nachgedacht was ich in meinem letzen Beitrag über die Struktur von deinem Programm geschrieben habe?


----------



## JonnieWalker (22. Apr 2010)

Ja hab ich.
Das Problem ist, ich versuch jetzt das was soweit funktioniert vernünftig über die Bühne zu bringen.
Der Termin für die Abgabe erfolgt Montag,weil unsere Lehrer verpennt hat uns das Mitzuteilen.
Eine Woche früher als geplant.

Sonst hätte ich die Datenbank geändert und alles andere auch, nur es ist keine Zeit mehr da.


----------

