sortierte JTable editieren

Unique86

Mitglied
Hallo zusammen,

ich habe da mal eine Frage.

Ich habe eine JTable mit einem eigenen TableModel um die Tabelle sortieren zu können.

Code:
import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;

import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;

/**
 * @author sb
 *
 */
public class SortableTableModel extends DefaultTableModel
{
  private static final long serialVersionUID = 1L;

  public SortableTableModel(String[] strTblAttributesHeadline, int i)
  {
    super(strTblAttributesHeadline, i);
  }

  /* (non-Javadoc)
   * @see javax.swing.table.AbstractTableModel#fireTableCellUpdated(int, int)
   */
  public void fireTableCellUpdated(int row, int column)
  {
    fireTableChanged(new TableModelEvent(this, row, row, column));
  }

  public void sortByColumn(final int clm)
  {
    Collections.sort(this.dataVector, new Comparator()
    {
      public int compare(Object o1, Object o2)
      {
        Vector v1 = (Vector) o1;
        Vector v2 = (Vector) o2;

        int size1 = v1.size();

        if (clm >= size1)
          throw new IllegalArgumentException("max column idx: " + size1);

        String s1 = (String) v1.get(clm);
        String s2 = (String) v2.get(clm);

        if (s1.compareTo(s2) > 0)
        {
          return s1.compareTo(s2);
        }
        else
        {
          return s2.compareTo(s1);
        }
      }
    });
  }
}

Und so reagiere ich auf den Tabellenheader

Code:
tblAttributes.getTableHeader().addMouseListener(new MouseAdapter()
{
    public void mousePressed(MouseEvent evt)
    {
        tblModAttributes.sortByColumn(tblAttributes.columnAtPoint(evt.getPoint()));
    }
});

Das funktioniert auch alles wunderbar ...
Jetzt möchte ich gerne in der Tabelle editieren können. Ich habe es soweit gebracht, das man die Tabellezelle mit einem Doppelklick in den Editiermodus versetzt.

Jetzt reagiere ich so auf das Editieren.

Code:
tblModelForAttributes.addTableModelListener(new TableModelListener()
{
    public void tableChanged(TableModelEvent e)
    {
        int editingColumn = tblAttributes.getEditingColumn();
        int editingRow = tblAttributes.getEditingRow();
 
        if (editingColumn != -1 && editingRow != -1)
        {
          String valueOfEditingTable = (String) tblAttributes.getValueAt(editiingRow, editingColumn);
        }
    }
});

Da bekomme ich ja den Wert herraus, welcher sich geändert hat. Klappt auch alles super, aber sobald die Tabelle sortiert wird, kann ich keine Zuordnung mehr treffen. Hört sich doof an, aber ich fülle die Tabelle mit folgender Funktion (sieht vllt. nen bisl tricky aus aber ich habe keine andere Möglichkeit gefunden)

Code:
private void fillTable(DefaultTableModel tableModel, Vector vector, int breakPoint)
{
    int row = 0;
    int column = 0;

    tableModel.setRowCount(vector.size() / breakPoint);

    for (int i = 0; i < vector.size(); i++)
    {
        tableModel.setValueAt(vector.get(i), row, column);
        column++;

        if (i % breakPoint - 1 == 0)
        {
            row++;
            column = 0;
        }
    }
}

nun kann ich nicht mehr zuordnen, welche Werte Paar wo und wann geändert wurde.
Hoffe ihr versteht was ich meine ^^

Vllt. kann mir einer helfen ... auch vllt. im Bezug um die Tabelle zu füllen

Gruss Sven

*UPDATE*

Ich brauche eventuell noch Hilfe, ich muss ne JList "drop" fähig machen ...
Vllt. kann mir dabei noch einer helfen

Nochmal Gruss Sven
 
Zuletzt bearbeitet:
Entweder machst du eine Spalte in der die reale Position vom Vector eingetragen wird, oder du machst dir ein Objekt welches sowohl die Daten als auch die Vector-Position enthält. Dann schreibst du einfach dieses Objekt in dein TableModel und lässt dieses mit einem TableCellRenderer darstellen (also einfach nur den String aus dem Objekt als Label). So stehen in jeder Tabellenzelle die kompletten Daten die du für andere Operationen vielleicht benötigtst. Das ist eine ganze schöne Sache an den Swing Tables.

Zu dem Drag und Drop findet man bei google ganz gut was.
 
Zurück