# Selektierte Zeilen von JTable



## may24 (3. Apr 2012)

Hi zusammen,

ich habe folgendes vor:
ein JTable ist mit Werten gefüllt. wird nun eine Zeile angecklickt (und somit markiert) wird diese in einem Vector gespeichert. Mehrfachselektion soll möglich sein.
Über ein Button sollen nun diese Zeilen gelöscht werden.
Ist keine Zeile selektiert soll auch nichts gelöscht werden.
Und genau das ist das Problem. Denn meine "Konstruktion" speichert immer den letzten Wert und drückt man auf löschen so fliegt die Zeile raus obwohl man das gar nicht will.

Der komplette Code wäre etwas viel, daher hier der Auszug um den es geht:

```
dtm.addTableModelListener(new TableModelListener() 						// use the standard TableModelListener
		{
		      public void tableChanged(TableModelEvent e) 
		      {
					if (unlockDataFlow)
					{
						//Object cellValue = ((Vector<Object[]>) dtm.getDataVector().elementAt(xy[1])).elementAt(xy[0]);
						Object cellValue = dtm.getValueAt(xy[1],xy[0]);
						dataModel.getCellInfoAndData(xy[0], xy[1], cellValue );
					}
		      }
		});
		
		table.setCellSelectionEnabled(true);
		table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		
		rowLSM = table.getSelectionModel();
		colLSM = table.getColumnModel().getSelectionModel();
		
		rowLSM.addListSelectionListener(new ListSelectionListener() 
		{

			@Override
			public void valueChanged(ListSelectionEvent e) 
			{
				if (e.getValueIsAdjusting())
				{
					return;														// works here like break
		                }

                ListSelectionModel lsm = (ListSelectionModel)e.getSource();
                
                if (lsm.isSelectionEmpty())
                {
                	xy[1] = -1;
                }
                else
                {
                	int selectedRow = lsm.getMinSelectionIndex();
                        xy[1] = selectedRow;
                }
			}
		
		});
		

		colLSM.addListSelectionListener(new ListSelectionListener() 
		{

			@Override
			public void valueChanged(ListSelectionEvent e) 
			{
				if (e.getValueIsAdjusting())
				{
					return;
				}

                ListSelectionModel lsm = (ListSelectionModel)e.getSource();
                
                if (! lsm.isSelectionEmpty()) 
                {
                	int selectedCol = lsm.getMinSelectionIndex();
            		xy[0] = selectedCol;
                } 
                
			}
		
		});
```


----------



## SlaterB (3. Apr 2012)

> Denn meine "Konstruktion" speichert immer den letzten Wert und drückt man auf löschen so fliegt die Zeile raus obwohl man das gar nicht will.

du meinst, auch wenn die Selektion aufgehoben wird, bleibt noch der Wert einer bestimmten Zeile gespeichert?
das wäre komisch, kommt kein Selektionsevent beim Aufheben? mit isSelectionEmpty(), oder Zeilenindex -1?
schau dir genau an, evtl. mit Logging, welche Events wann kommen,

wenn doch -1 gespeichert wird und das beim Löschen-Button ein Problem macht musst du dort natürlich schauen
ob -1 oder sonst ein komischer Wert zu löschen ist und dann eben nicht löschen, nix tun, 
oder den Button disablen oder irgendwas arbeiten

wo genau besteht also nun ein Problem?


----------



## Michael... (3. Apr 2012)

may24 hat gesagt.:


> wird nun eine Zeile angecklickt (und somit markiert) wird diese in einem Vector gespeichert. Mehrfachselektion soll möglich sein.


Versteh ich das richtig, Du speicherst die Information darüber welche Zeilen selektiert sind in einem eigenen Vector? Ist das nicht doppelt gemoppelt? Die selektierten Zeilen werden doch bereits im SelectionModel gespeichert. Evtl. verstehe ich Dein Vorhaben auch falsch.


----------



## may24 (3. Apr 2012)

@Michael: Nein, du verstehst mich nicht falsch. Doch wie komme ich an diese Daten heran ? Besonders bei Mehrfachselektion ?
Ich denke das ist auch genau mein Problem. Den in den Vector wird ja erst eine neue Position gespeichert soblad etwas in der Tabelle angecklickt wurde. Sonst behält er logischerweise den Letzten da er nicht überschrieben wird. Seltsamerweise auch nicht wenn die Selektion "aufgehoben" wird ...


----------



## SlaterB (3. Apr 2012)

> Seltsamerweise auch nicht wenn die Selektion "aufgehoben" wird 
seltsam muss da nichts bleiben, siehe mein Posting,

allerdings kannst du auch wirklich einfach das SelectionModel als Speicher verwenden,
an der Stelle, an der du den Array-Wert abfragst, kannst du doch genau das ListSelectionModel  holen und dort fragen?
mehrere Werte bei Mehrfachselektion, die du im geposteten Code auch kaum berücksichtigst, kannst du doch genauso abfragen

es sei denn es spricht konkret etwas dagegen, z.B. kein Weg zum Model


----------



## may24 (3. Apr 2012)

Wenn "lsm" das ListSelectionModel ist, wie komme ich dann aber an all Daten der selektierten Zeilen ?

```
getMinSelectionIndex
```
 liefert mir ja nur ein Element ...


----------



## SlaterB (3. Apr 2012)

ist das in der derzeitigen Lösung mit dem Event anders? oder bekommst du da mehrere Events und so die Information?
ich sollte es besser alles selber wissen, aber wenn du schon gerade dabei bist..

JList selber bietet nebenbei
> getSelectedIndices()
> Returns an array of all of the selected indices, in increasing order.


----------



## may24 (4. Apr 2012)

Hm, scheint aber irgentwie nur bei der JList zu funktionieren.
Weder der Jtable, noch das ListSelectionModel kennt "getSelectedIndices"


----------



## SlaterB (4. Apr 2012)

ganz vergessen nachzuschauen was du dir konkret hattest,
die Methode arbeitet intern eh mit dem SelectionModel, kannst du dir für andere Zwecke kopieren:

```
/**
     * Returns an array of all of the selected indices in increasing
     * order.
     *
     * @return all of the selected indices, in increasing order
     * @see #removeSelectionInterval
     * @see #addListSelectionListener
     */
    public int[] getSelectedIndices() {
        ListSelectionModel sm = getSelectionModel();
        int iMin = sm.getMinSelectionIndex();
        int iMax = sm.getMaxSelectionIndex();

        if ((iMin < 0) || (iMax < 0)) {
            return new int[0];
        }

        int[] rvTmp = new int[1+ (iMax - iMin)];
        int n = 0;
        for(int i = iMin; i <= iMax; i++) {
            if (sm.isSelectedIndex(i)) {
                rvTmp[n++] = i;
            }
        }
        int[] rv = new int[n];
        System.arraycopy(rvTmp, 0, rv, 0, n);
        return rv;
    }
```
wäre natürlich gut wenn sie in ListSelectionModel selber vorhanden wäre

von der ursprünglichen Frage, warum du überhaupt ein separates Array brauchst, ist das aber nach wie vor recht weit entfernt,
es sei denn du brauchst das Array aus trotz mehrfachen Nachfragen unbeantworteten Gründen für Mehrfachselektion,
na falls dir durch die letzten Postings irgendwie geholten ist, soll mir das Recht sein


----------



## Michael... (4. Apr 2012)

may24 hat gesagt.:


> Hm, scheint aber irgentwie nur bei der JList zu funktionieren.
> Weder der Jtable, noch das ListSelectionModel kennt "getSelectedIndices"


JTable liefert dazu eine fertige Methode:
JTable (Java Platform SE 6)


----------



## may24 (12. Apr 2012)

Hm, es scheint tatsächlich besser zu sein das [c]getSelectedRows[/c] auf den table anzuwenden und nicht so umständlich über einen ListSelectionListener zu gehen. 


```
public Vector <Object[]> getSelectedCells()
	{
		int numberOfSelectedRows = table.getSelectedRowCount();
		cellData.clear();
		int[] tempRowArray = new int[numberOfSelectedRows];
		tempRowArray = table.getSelectedRows();
		
		for (int i = 0; i<numberOfSelectedRows; i++)
		{
			int x = table.getSelectedColumn();
			int y = tempRowArray[i];
			Object cellValue = dtm.getValueAt(y,x);
			Object[] tempCellLine = new Object[] {x,y,cellValue};
			cellData.add(tempCellLine);
		}	
		return cellData;
	}
```

Danke für euere Hilfe


----------

