Avatar billede trp79 Nybegynder
07. juni 2004 - 13:27 Der er 14 kommentarer og
1 løsning

Opdatering af JTabel (tablemodel)virker ikke i alle kolonner

Hejsa
Jeg har en JTabel, hvortil der er knyttet en tablemodel.
Mit problem er ret underlig syntes jeg, da den godt vil opdaterer i nogle kolonner men ikke i en andre!:
                       
tableModel.setValueAt(new Boolean(false), i, 9);// Opdatering sker
tableModel.setValueAt(new Double(afstand),i,3);//Opdatering sker
Double oPris = (Double)tableModel.getValueAt(i,7);//Opdatering sker ikke!
double kmPris = oPris.doubleValue();
double pris = afstand*kmPris;
tableModel.setValueAt(new Double((pris)),i,7);

System.out.println("prisVariabel "+pris+"\nPrisTabel " +tableModel.getValueAt(i,7));//PrisTabel forbliver altså ved den gamle værdi, og opdateres ikke til den nye.

Håber, der er nogle, der har nogle ideer til, hvordan problemet kan løses.

Mvh
Torben
Avatar billede labanos Nybegynder
07. juni 2004 - 15:28 #1
Bruger du en DefaultTableModel? eller har du lavet din egen modelklasse der extender AbstractTableModel?
Avatar billede labanos Nybegynder
07. juni 2004 - 15:31 #2
AbstractTableModel har blot en "tom" implementation af setValueAt:
fra api'en:
"This empty implementation is provided so users don't have to implement this method if their data model is not editable."

Så hvis jeg ik husker helt forkert er det smart at lave et fireTableChanged kald efter ændringer i modellen..
Avatar billede trp79 Nybegynder
09. juni 2004 - 18:09 #3
Hej labanos
Beklager den lange svartid. Ja jeg extender AbstractTableModel. Men hvordan laver jeg en foreTableChanged? Den skal have en TableModelEvent som parameter. Det er jeg ikke lige med på hvad er. Altså jeg skal kalde tableModel.fireTableChanged(TableModelEvent), men jeg er ikke lige med på hvad parameteren skal være. Det er iøvrigt ikke en metode jeg har implementeret i min TableMode, som du kan se i nedenstående. Bør den ikke være der, eller?

package beregnafstand;

import javax.swing.table.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.util.ArrayList;

public class TableModelRouteResult extends AbstractTableModel {
    private String[] columns = { "Afgangssted", "Destination", "Stop nr.", "Afstand", "Kilde", "Samlet Afstand", "Km Pris", "Pris", "Samlet Pris", "Opdater Afstand"};
      private ArrayList data;

    public TableModelRouteResult() {
        data = new ArrayList();
    }

  public int getColumnCount() {
      return columns.length;
  }

  public int getRowCount() {
      return data.size();
  }

  public String getColumnName(int column) {
      return columns[column];
  }

  public Object getValueAt(int row, int column) {
      TableElementRouteResult element = (TableElementRouteResult)data.get(row);
      if( column == 0 )
            return element.getFirmaFra();
      else if( column == 1 )
              return element.getFirmaTil();
      else if( column == 2 )
              return element.getStopNr();
      else if( column == 3 )
              return element.getAfstand();
      else if( column == 4 )
              return element.getKilde();
      else if( column == 5 )
              return element.getSamletAfstand();
      else if( column == 6 )
              return element.getKmPris();
      else if( column == 7 )
              return element.getPris();
      else if( column == 8 )
              return element.getSamletPris();
      else if( column == 9 )
              return element.getOpdaterAfstand();

      return null;
  }

  public Class getColumnClass(int column) {
      return getValueAt(0, column).getClass();
  }

  public boolean isCellEditable(int row, int column) {
      if(column == 6)
        return true;
      if(column == 9)
        return true;
      else
        return false;
  }

  public void setValueAt(Object value, int row, int column) {
      switch( column ) {
          case 0: {
              ((TableElementRouteResult)data.get(row)).setFirmaFra((String)value);
          } break;
          case 1: {
              ((TableElementRouteResult)data.get(row)).setFirmaTil((String)value);
          } break;
          case 2: {
              ((TableElementRouteResult)data.get(row)).setStopNr((Integer)value);
          } break;
          case 3: {
            ((TableElementRouteResult)data.get(row)).setAfstand((Double)value);
          } break;
          case 4: {
            ((TableElementRouteResult)data.get(row)).setKilde((String)value);
          } break;
          case 5: {
              ((TableElementRouteResult)data.get(row)).setSamletAfstand((Double)value);
          } break;
          case 6: {
              ((TableElementRouteResult)data.get(row)).setKmPris((Double)value);
          } break;
          case 7: {
              ((TableElementRouteResult)data.get(row)).setPris((Double)value);
          } break;
          case 8: {
              ((TableElementRouteResult)data.get(row)).setSamletPris((Double)value);
          } break;
          case 9: {
              ((TableElementRouteResult)data.get(row)).setOpdaterAfstand((Boolean)value);
          } break;

      }
      fireTableCellUpdated(row, column);
    }

    public void addTableElement(TableElementRouteResult element) {
        data.add(element);
        fireTableRowsInserted(data.size(), data.size());
    }

    public void removeTableElementRouteResult(int index) {
        if( !(index == -1) ) {
            data.remove(index);
            fireTableRowsDeleted(index, index);
        }
    }
    public void removeAll() {
          int slut = data.size();
          data.clear();
          fireTableRowsDeleted(0, slut);
    }
}
Avatar billede trp79 Nybegynder
09. juni 2004 - 18:10 #4
Jeg troede egentlig, at det var nok med kaldet af  fireTableCellUpdated(row, column), som sker i setValueAt.
Avatar billede labanos Nybegynder
10. juni 2004 - 08:25 #5
ja fireTableCellUpdated burde være nok når man overskriver setValueAt..

Det var iøvrigt også fireTableDataChanged jeg mente i min tidligere besked.. huskede forkert...sorry
Avatar billede trp79 Nybegynder
10. juni 2004 - 16:13 #6
Ja, den(fireTableDataChanged) har jeg nemlig også prøvet, men det virkede ikke.
Du har ikke yderligere ideer. Det er super sort, at den godt vil opdaterer en celle men ikke en anden :(
Avatar billede labanos Nybegynder
10. juni 2004 - 16:29 #7
kan ikke huske om det er nødvendigt, det er meget lang tid siden jeg har brugt en table, men har du i din table kaldt:
model.addTableModelListener(this) //altså model er din TableModelRouteResult, this din jtable..
Avatar billede trp79 Nybegynder
14. juni 2004 - 12:14 #8
Ja det kald har jeg. Så det er heller ikke det :(
Avatar billede _carsten Nybegynder
14. juni 2004 - 17:17 #9
Mere for overskuelighedens skyld ville jeg rette setValue() til

  public void setValueAt(Object value, int row, int column) {
    TableElementRouteResult element = (TableElementRouteResult)data.get(row);
   
      switch( column ) {
          case 0: element.setFirmaFra((String)value); break;
          case 1: element.setFirmaTil((String)value); break;
          case 2: element.setStopNr((Integer)value); break;
          case 3: element.setAfstand((Double)value); break;
          case 4: element.setKilde((String)value); break;
          case 5: element.setSamletAfstand((Double)value); break;
          case 6: element.setKmPris((Double)value); break;
          case 7: element.setPris((Double)value); break;
          case 8: element.setSamletPris((Double)value); break;
          case 9: element.setOpdaterAfstand((Boolean)value); break;

      }
      fireTableCellUpdated(row, column);
    }

Tror du skal lede efter den fejl et andet sted, umiddelbart kan jeg ikke se nogen fejl i din kode, men jeg kigger på det igen senere på aftenen.
Avatar billede trp79 Nybegynder
17. juni 2004 - 13:44 #10
Hej Carsten. Jeg har nu implementeret din noget mere overskuelige metode.
Hvad angår min problem, så er det altså stadigvæk super underligt. Hvis jeg fx laver disse kald:
tableModel.setValueAt(new Double("99.99"),i,3);
tableModel.setValueAt(new Double("99.99"),i,6);
tableModel.setValueAt(new Double("99.99"),i,7);

så bliver tabellen opdateret ved de to første kald, men den sidste opdatering bliver ikke gennemført, og der kommer heller ingen exception.
Avatar billede trp79 Nybegynder
17. juni 2004 - 13:49 #11
Endelig!!! jeg tror fejlen er fundet, og at du havde ret carsten... fejlen liggr vist et andet sted i min kode. Jeg tjekker lige og melder tilbage med det samme...
Avatar billede trp79 Nybegynder
17. juni 2004 - 14:21 #12
Jeg havde en tåbelig fejl i en af mine set-metoder i TableElementRouteResult klassen.
Hvis du smider et svar carsten, så er der point for du havde jo ret igen:)

Endnu engang tak for hjælpen, mvh
Torben
Avatar billede _carsten Nybegynder
17. juni 2004 - 20:45 #13
Okay - det er jo hvad der kan ske :)
Avatar billede trp79 Nybegynder
17. juni 2004 - 21:35 #14
Ja desværre....

Der skal selvfølgelig også lyde et tak for dit forsøg på at hjælpe labanos!

Mvh
Torben
Avatar billede labanos Nybegynder
18. juni 2004 - 09:25 #15
Det var så lidt :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester