Avatar billede swaq Nybegynder
02. januar 2003 - 21:51 Der er 4 kommentarer og
1 løsning

AbstractTabelModel

Hejsa :O)

Er i gang med at lave en klasse som skal behandler en anden klasses data, hentet fra en Access-database formateret i en Vector.
Ideen er, at klassen skal ende ud i en JTable magen til den man vil kunne se i Access ved et simpelt SQL-statement; "SELECT * FROM TABEL".
Til dette har jeg valgt at definere en AbstractTableModel, altså implementere metoderne;
    public int getColumnCount() { ... }
    public int getRowCount() { ... }
    public Object getValueAt(int row, int col) { ... }

Mit problem er, at den klasse som extender AbstractTabelModel, skal definere 2 konstanter, nemlig;
    final String [] columnNames = { ... };
    final Object [][] data = { { ... } };
Hvis ikke dette sker dør programmet af NullPointerException.
I min lille verden havde jeg håbet på, at man kunne erklære variablene globalt og tildele dem værdi i konstruktoren, hvilket så burde virke... (Er med på, at de ikke kan være final i ovenstående...)
I klassens konstruktor foregår følgende:
      public TableModel(){
          //vc er en Vector som returneres fra db,
          //indeholdende tabellens kolonnenavne
          vc = db.getColumnNames("SELECT * FROM Tabel");
          int size = vc.size();
          for(int i = 0; i<size; i++)           
            columnNames[i] = vc.get(i).toString();
        }

Ovenstående virker ikke, der kommer en NullPointerException i:
          "public int getColumnCount() { ... }"
som jeg jo er tvunget til at implementere. Jeg har en forestilling om, at årsagen til problemet skal finde i selve objektoprettelsesøjeblikket, hvor det implementerede interface tilsyneladende initialiseres førend konstruktoren.

Med håb om hjælp og på forhånd mange tak :-)
Avatar billede arne_v Ekspert
02. januar 2003 - 22:08 #1
Super klassens constructor bliver kaldt før sub klassens
constructor er færdig.

Sådan virker Java.

Du har brug for en workaround.
Avatar billede arne_v Ekspert
02. januar 2003 - 22:16 #2
Nu er jeg ikke skrap til Swing.

Men måske vil følgende virke:

public TableModel extends AbstractTableModel {
    private String x = null;
    public TableModel() {
        x = noget-fra-databasen;
        kommando-som-får-AbstractTableModel-til-at-kalde-getX-for-at-refreshe;
    }
    public String getX() {
        if(x != null) {
            return x;
        } else {
            return "";
        }
    }
}
Avatar billede swaq Nybegynder
02. januar 2003 - 22:51 #3
Hmm... du kender vel ikke tilfældigvis navnet på den kommando? :-)
Avatar billede arne_v Ekspert
03. januar 2003 - 06:51 #4
Prøv med:
  fireTableStructureChanged();
  fileTableDataChanged();
Avatar billede swaq Nybegynder
03. januar 2003 - 14:25 #5
det virkede 'sku :O)
tak for hjælpen!
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