TableRowSorter Bei Sortierung wird Icon nicht mitsortiert

Vicus

Grünschnabel
Hallo Community,

ich habe folgendes Problem. Ich schreibe zur Zeit eine Anwendung in welcher mann seine Ausgaben/Einahmen erfassen kann. Alle Buchungen werden in einer Tabelle gespeichert für welche ich einen eigenen TableCellRenderer geschrieben habe.
Folgender Code legt den Sorter für die Table fest:
Java:
TableRowSorter<TableModelBuchungsbelege> xTableRowSorter = new TableRowSorter<TableModelBuchungsbelege>();
    xTableRowSorter.setModel( m_xTableModelBuchungsbelege );
    xTableRowSorter.toggleSortOrder( 0 );
    m_xTableBuchungen.setRowSorter( xTableRowSorter );

Die betroffene Spalte sieht wie folgt aus:
bug.PNG

Wenn ich jetzt die Spalte per Klick auf den Header sortiere, werden zwar die Beträge richtig sortiert, die Icons bleiben jedoch unverändert stehen.
Ich speicher in jedem Datensatz(Zeile) ob es sich um eine Gutschrift (grüner Pfeil) oder um eine Belastung (roter Pfeil) handelt.

Bin für jeden Tip dankbar.

Nachtrag: Wenn ich einen der betroffenen Einträge ändere, wird das Icon aktualisiert. Das müsste doch heißen das ich irgendwie ein propertyChanged oder fireDataTableChange Event auslösen müsste?!
 
Zuletzt bearbeitet:

genodeftest

Erfahrenes Mitglied
klingt so, als würde dein TableCellRenderer falsche Werte zum Zeichnen verwenden…
Etwas mehr Code wäre hilfreich…
 

Vicus

Grünschnabel
klingt so, als würde dein TableCellRenderer falsche Werte zum Zeichnen verwenden…
Etwas mehr Code wäre hilfreich…

Habe für heute meine Programmiertätigkeit eingestellt ;) Werde Montag mal den Code nachreichen.

Vom Prinzip wird im Renderer der Eurobetrag aus dem Objekt ausgelesen und das Icon über eine If()-Bedingung gesetzt. Montag kommt der Code :)
 

Vicus

Grünschnabel
Hier der Code welchen ich verwende um besagte Celle zu zeichnen:

Java:
public class TableCellRendererBetrag
    extends DefaultTableCellRenderer
{
  @Override
  public Component getTableCellRendererComponent( JTable in_table, Object in_Object,
      boolean in_isSelected, boolean hasFocus, int row, int column )
  {
    super.getTableCellRendererComponent( in_table, in_Object, in_isSelected, hasFocus, row, column );

    setHorizontalTextPosition( SwingConstants.LEADING );
    ImageIcon xIcon_gutschrift = new ImageIcon( getClass().getResource( "/icons/gutschrift.png" ) );
    ImageIcon xIcon_belastung = new ImageIcon( getClass().getResource( "/icons/belastung.png" ) );
    setHorizontalAlignment( SwingConstants.RIGHT );
    Betrag xB = (Betrag) in_Object;
    NumberFormat xNumberFormat = NumberFormat.getCurrencyInstance();
    String strBetrag = xNumberFormat.format( xB.getHoehe() );

    setText( strBetrag );

    TableModelBuchungsbelege xTMB = (TableModelBuchungsbelege) in_table.getModel();
    if ( xTMB.getRow( row ).isGutschriftOderBelastung() )
    {
      setIcon( xIcon_gutschrift );
    }
    else
    {
      setIcon( xIcon_belastung );
    }
    return this;
  }
}
 

deepthroat

Erfahrenes Mitglied
Hi.

Du hast vergessen vom Tabellen Index in den Modell Index umzurechnen und greifst so auf das falsche Objekt zu (die Tabelle ist nur eine Sicht auf die Daten im Modell - die Modelldaten sind ganz anders geordnet als die Tabellendaten).

Java:
if ( xTMB.getRow( in_table.convertRowIndexToModel(row)).isGutschriftOderBelastung() )
  ...
\edit: Der Name des Prädikats ist aber auch sehr lustig. Entweder es ist eine Gutschrift oder es ist eine Belastung - es kann ja nicht beides sein. Du fragst aber im Grunde nach beidem: "isGutschriftOderBelastung"? Die Antwort kann eigentlich immer nur "ja" / true lauten. Ich würde es z.B. in "istGutschrift" umbenennen. (entweder Deutsch oder Englisch, nicht mixen).

Gruß
 
Zuletzt bearbeitet:

Vicus

Grünschnabel
Vielen Dank für die fixe Antwort. Das Problem ist damit gelöst :D.

Was meine Namensgebung betriffst hast du wohl Recht. Das Ideale Konzept zur Benennung habe ich noch nicht gefunden. Ich versuche Sie so zu Benennen, das es hoffentlich auch noch später nachvollziehbar ist.

Ich vermute mit meiner Anmeldung hier im Forum komme ich einem geordneten Code einen Schritt näher.