# JTable suchen in einer Spalte



## PollerJava (21. Aug 2007)

Hallo,

ich habe eine JTable mit 100 Zeilen und möchte in einer Spaltesuchen, ob schon ein gewisser Eintrag vorhanden ist, wenn nicht, dann möchte ich den Eintrag ganz oben einfügen und die unteren Einträge sollen sich eben um eins nach unten verschieben,

auch möchte ich Zeilen Löschen können und die Lücke sollte von den unteren Einträgen ausgefüllt werden,

ist da irgendwie einfach zu realisieren?

Wäre sehr dankbar für ein paar Tipps,

lg



```
tableList[x] = new JTable(TableModel, columnModel);
```


----------



## SlaterB (21. Aug 2007)

idealaerweise hast du ein TableModel,
in welchem die Daten in einer List oder Array vorliegen,
die Suche beschränkt sich dann auf die Suche in dieser Liste,
falls die JTable keine andere Reihenfolge (z.B. durch Sortierung) hat

dann noch Zeile aus der Liste entfernen,
irgendein fireTableXY(); und fertig

--------

wie siehst denn in der Realität mit dem TableModel und deinen Kenntnissen darüber aus?


----------



## PollerJava (21. Aug 2007)

Mein TableModel schaut so aus: 
Also in data sind alle meine daten drinnen

das mit dem  fireTableXY(); versteh ich jetzt nicht, wird wohl ein Observer sein der die Tabelle auf den neuesten stand bringt, oder??



```
import java.util.*;
 import javax.swing.*;
 import javax.swing.table.*;
 
 public class TableModel extends AbstractTableModel
    {
    private int sizeRow;
    private int sizeCol;
    private Hashtable data;
 
    public TableModel(int sizeRow, int sizeCol)
        {
        this.sizeRow = sizeRow;
        this.sizeCol = sizeCol;
        this.data = new Hashtable();
        }
    
    public TableModel(int size)
        {
        this.sizeRow = sizeRow;
        this.data = new Hashtable();
        }
 
    public int getRowCount()
        {
        return sizeRow;
        }
 
    public int getColumnCount()
        {
        return sizeCol;
        }
 
    public String getColumnName(int columnIndex)
        {
        return "C" + columnIndex;
        }
 
    public Class getColumnClass(int columnIndex)
        {
        return String.class;
        }
 
    public boolean isCellEditable(int rowIndex, int columnIndex)
        {
        return rowIndex < sizeRow && columnIndex < sizeCol;
        }
 
    public Object getValueAt(int rowIndex, int columnIndex)
        {
        String key = "[" + rowIndex + "," + columnIndex + "]";
        String value = (String)data.get(key);
        return value == null ? "-" : value;
        }
 
   public void setValueAt(Object aValue, int rowIndex, int columnIndex)
        {
        String key = "[" + rowIndex + "," + columnIndex + "]";
        String value = (String)aValue;
        if (value.length() <= 0) 
            {
            data.remove(key);
            } 
        else 
            {
            data.put(key, value);
            }
        }
}
```


----------



## SlaterB (21. Aug 2007)

hat das einen einen Sinn, dass du da eine Hashtable benutzt?
mit einer Liste von Listen/ Array wäre dein Zugriff schneller und die Suche einfacher


----------



## PollerJava (21. Aug 2007)

Nö, ist aus dem Java- Handbuch,

Wie meinst Du eine Liste von Listen??? -> Zeile und Spalten also ein 2 dim ListenFeld??


----------



## SlaterB (21. Aug 2007)

wenn du 2 Dim hast, dann sind die Elemente darin einzelne Felder,
Object[][] z.B.

oder dynamischer: eine Zeile ist eine Liste von Objekte,
die Tabelle eine Liste von Zeilen,
also Liste von Listen von Objekten


----------



## PollerJava (21. Aug 2007)

und wie Definiere ich sowas:

List<List<Integer>> dataList = new List<List<Integer>>(); ????


und wie schreib ich dann in diese List hinein?


jetzt schreib ich ja in die HashTable so:


```
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
        {
        String key = "[" + rowIndex + "," + columnIndex + "]";
        String value = (String)aValue;
        if (value.length() <= 0) 
            {
            data.remove(key);
            } 
        else 
            {
            data.put(key, value);
            }
        }
```


----------



## SlaterB (21. Aug 2007)

List<Integer> zeile = dataList.get(rowIndex);
zeile.put(columnIndex,value);

natürlich musst du die Listen vorher ausreichend groß anlegen und befüllen
(sizeRow, sizeCol)

und mit null-Werten hast du es nicht so leicht, da musst du schon explizit null in die liste schreiben


----------



## PollerJava (21. Aug 2007)

Nö, das kappier ich nicht,  ich dachte mir, Listen erweitern sich autom..

stimmt das von mir oben und wie passt das mit deinen Zeilen zusammen??


```
List<Integer> zeile = dataList.get(rowIndex);
zeile.put(columnIndex,value);
```

PS: bei einer List gibts ja nur add(), oder ??


----------



## PollerJava (21. Aug 2007)

bei der Zeile happerts noch, sonst ist mir alles klar, Du hast die JTable gemeint und nicht die List, alles klar



```
zeile.put(columnIndex,value);   // put geht nicht, add auch nicht, wie bekomme ich mein eWerte in die List
```

Vielen Dank!!!

lg


----------



## SlaterB (21. Aug 2007)

set heißt das,
wenn du natürlich von Listen wenig weißt, dann ist das ein gefährlicher Weg


----------



## PollerJava (21. Aug 2007)

Nö, set geht auch nicht, 
ich weiß schon einiges über Listen aber ich durchschau deinen Vorschlag nicht ganz


----------



## André Uhres (21. Aug 2007)

```
package table;
/*
 * SpaltenSucheDemo.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class SpaltenSucheDemo extends JFrame implements ActionListener{
    private JButton btLoesche, btSuche;
    private JTable tabelle;
    private JToolBar toolbar;
    private DefaultTableModel model;
    public SpaltenSucheDemo() {
        tabelle = new JTable();
        toolbar = new JToolBar();
        btSuche = new JButton("Suche");
        btLoesche = new JButton("Loesche");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        tabelle.setModel(new DefaultTableModel(
                new Object [][] {
                    {"1", "A", "a", "zwei"},
                    {"2", "B", "a", "zwei"},
                    {"3", "B", "c", "drei"},
                    {"3", "D", "d", "vier"}
        },
                new String [] {"Title 1", "Title 2", "Title 3", "Title 4"}
        ) {
            Class[] types = new Class [] {String.class, String.class, String.class, String.class};
            public Class getColumnClass(int columnIndex) {return types [columnIndex];}
        });
        model = (DefaultTableModel)tabelle.getModel();
        tabelle.setCellSelectionEnabled(true);
        getContentPane().add(new JScrollPane(tabelle), BorderLayout.CENTER);
        btSuche.addActionListener(this);
        toolbar.add(btSuche);
        btLoesche.addActionListener(this);
        toolbar.add(btLoesche);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        pack();
    }
    private void suche() {
        int selRow = tabelle.getSelectedRow();
        int selCol = tabelle.getSelectedColumn();
        if(selRow < 0) return;
        String val = model.getValueAt(selRow, selCol).toString();
        int row;
        for (row = 0; row < model.getRowCount(); row++) {
            if(row != selRow && model.getValueAt(row, selCol).toString().equals(val))
                break;
        }
        if(row == tabelle.getRowCount())
            model.moveRow(selRow, selRow, 0);
    }
    private void loesche() {
        int row = tabelle.getSelectedRow();
        if(row > -1)
            model.removeRow(row);
    }
    public static void main(final String args[]) {new SpaltenSucheDemo().setVisible(true);}
    
    public void actionPerformed(final ActionEvent e) {
        Object source = e.getSource();
        if(source == btSuche)suche();
        else loesche();
    }
}
```


----------



## SlaterB (21. Aug 2007)

set gibts übrigens nicht bei List, sondern nur bei ArrayList,
ich poste eben nur 'trocken', kann nicht alle Details beachten


----------



## PollerJava (21. Aug 2007)

Vielen dank Andre und SlaterB,

eine Frage hätte ich noch, wie kann ich bei meinem TableModel oben eine Methode implementieren, die mir eine Zeile löscht??

Steh momentan voll auf dem Schlauch,

Wäre sehr dankbar dafür,

lg


----------



## SlaterB (21. Aug 2007)

in der Map alle Elemente der Zeile löschen und alle weiteren mit neuen verringerten Index speichern ( :shock: )
in der Liste wie anfangs schon geschrieben,
im Zweifel fireTableDataChanged(), gibt aber vielleicht noch etwas genauere Operationen,
bei dir sicherlich auch noch rowSize und andere redundante Daten aktualisieren

im Beispiel von Andre siehe DefaultTableModel, API!
(fireTableRowsDeleted kann man da auch nachlesen)


----------



## PollerJava (21. Aug 2007)

ich bekomme folgende Fehlermeldung:



```
Fehler hier: java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
Fehler hier: java.lang.ArrayIndexOutOfBoundsException: 5 >= 0
Fehler hier: java.lang.ArrayIndexOutOfBoundsException: 6 >= 0
```

wenn ich folgendes schreibe:


```
MyTableModelListen model = (MyTableModelListen) tableList[xSeite].getModel();
                                           
                            model.removeRow(i);
```

MyTableModelListen schaut so aus:


```
public class MyTableModelListen extends DefaultTableModel
```


----------



## SlaterB (21. Aug 2007)

hängt wahrscheinlich davon ab, wie die Klasse MyTableModelListen aussieht..

klingt jedenfalls danach, als hättest du keine Zeilen angelegt,
wenn du in einer int-Variablen 5 Zeilen vorgibst, dann müssen auch soviele Zeilen da sein,

in der Map war es in der Hinsicht einfacher, auch eine leere Map stellte da eine beliebig große Tabelle dar


----------



## PollerJava (21. Aug 2007)

ja, MyTableModelListen ist eh die Klasse, welche ich oben aufgelistet habe,


----------



## SlaterB (21. Aug 2007)

die hatte damals eine Hashtable, da frage ich mich, wo du eine ArrayIndexOutOfBoundsException bekommst..


----------



## PollerJava (21. Aug 2007)

Habs so weit so gut geschafft,

Mein Problem ist jetzt, dass ich ja immer wieder mal eine Zeile lösche und mir dann irgendwann die Zeilen ausgehen, ich müsste also meine Zeile löschen (die die ich löschen möchte) und ganz unten eine leere Zeile wieder hinzufügen, damit es gleich bleibt,

Ist das möglich bzw. wie??


lg und herzlichen Dank für Eure hinlfreichen Antworten,


----------



## PollerJava (21. Aug 2007)

Habs schon, vielen Dank!!!


----------



## PollerJava (22. Aug 2007)

Gibts eigentlich eine StandardMethode, die mir die neuen Zeilen oben hinzufügt und nicht unten??

lg


----------



## SlaterB (22. Aug 2007)

immer diese halben Fragen..

wenn du dich auf ein DefaultTableModel beziehst: ja, siehe API

wenn du dich auf dein eigenens Model mit Map oder List oder was auch immer (verrätst du ja nie) beziehst:
ja, schreibe dir eine passende Operation und dann siehe API von ArrayList oder was auch immer..


----------



## PollerJava (22. Aug 2007)

ich habe DefaultTableModel, moveRow ist die Lösung,

vielen Dank,

lg


----------

