Avatar billede casualty Nybegynder
23. august 2003 - 21:47 Der er 17 kommentarer og
2 løsninger

Object i jtable

Når jeg laver en JTable så putter jeg en DefaultTableModel i den således:

String[] kolonner = {"by","postnummer"};
DefaultTableModel model = new DefaultTableModel(kolonner,0);
JTable table = new JTable(kolonner);

derefter adder jeg rows med:
String[] row = {"Lyngby","2800"};
model.add(row);

Fint nok Men hvis nu at "By" er et object med 2 variabler i (by og postnummer) Kan man så ikke direkte associere et "row" med et object??

Så hvis man henter et rownummer så kan man også hente objektet som dataene er tilknyttet?
altså:
model.add(by);

på nuværende tidspunkt har jeg en tabel og en collection med objekter. Skal jeg bruge noget må jeg finde den selectede row, hente værdien og derefter løbe min collection igennem efter det matchende object...Lidt øv...

Mvh Casualty
Avatar billede bearhugx Nybegynder
23. august 2003 - 21:49 #1
Nu er det et stykke tid siden at jeg har arbejdet med Swing - men kan du ikke skrive en TableModel selv, som godtager et By objekt....
Avatar billede bearhugx Nybegynder
23. august 2003 - 21:51 #2
så vidt jeg husker kan du extende DefaultTableModel og så bare tilføje en metode med .add(By byObj)
Avatar billede casualty Nybegynder
23. august 2003 - 21:52 #3
Jo se det var en rigtig god ide jeg ikke havde tænkt over...Jeg kan lave en klasse der arver fra tablemodel og derefter bygge videre...
Avatar billede casualty Nybegynder
23. august 2003 - 21:52 #4
Jeg vender tilbage :)
Avatar billede bearhugx Nybegynder
23. august 2003 - 21:53 #5
i deres tutorials omkring JTable mener jeg at de har et eksempel
Avatar billede trp79 Nybegynder
23. august 2003 - 21:58 #6
Måske du kan bruge det her til noget - det er noget jeg tidligere har fået hjælp til her på exp. Nu håber jeg det er det du mener:

//ATableModel.java:
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.util.ArrayList;

public class ATableModel extends AbstractTableModel {
    private String[] columns = { "Firma", "Omsætning", "Budget", "budget vs oms", "% af total oms." };
      private ArrayList data;

    public ATableModel() {
        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) {
      TableElement element = (TableElement)data.get(row);
      if( column == 0 )
            return element.getFirma();
      else if( column == 1 )
              return element.getOms();
      else if( column == 2 )
              return element.getBudget();
      else if( column == 3 )
              return element.getBudgetPct();
      else if( column == 4 )
              return element.getPct();

      return null;
  }

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

  public boolean isCellEditable(int row, int column) {
      return false; // alle celler er ikke editerbare
  }

  public void setValueAt(Object value, int row, int column) {
      switch( column ) {
          case 0: {
              ((TableElement)data.get(row)).setFirma((String)value);
          } break;
          case 1: {
              ((TableElement)data.get(row)).setOms((Integer)value);
          } break;
          case 2: {
              ((TableElement)data.get(row)).setBudget((Integer)value);
          } break;
          case 3: {
              ((TableElement)data.get(row)).setBudgetPct((Double)value);//    if ( værdi < 0 )

          } break;
          case 4: {
              ((TableElement)data.get(row)).setPct((Double)value);
          } break;

      }
      fireTableCellUpdated(row, column);
    }

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

    public void removeTableElement(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 bearhugx Nybegynder
23. august 2003 - 21:58 #7
Her er en artikel, hvor der er lagt fokus på at tabel-grid'et skal være hurtig i optrækket, men mon du ikke kan finde en sample TableModel der et eller andet sted

http://java.sun.com/products/jfc/tsc/articles/ChristmasTree/
Avatar billede bearhugx Nybegynder
23. august 2003 - 22:06 #8
Det må have noget med denne funktion at gøre

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


hvis du prøver at lave koden om til følgende :
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.util.ArrayList;

public class ByTableModel extends AbstractTableModel {
    private String[] columns = { "PostNr", "By" };
    private ArrayList data;

    public ByTableModel() {
        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) {
        By byObj = (By)data.get(row);

        if( column == 0 )
            return byObj.getPostNr();
        else if( column == 1 )
            return byObj.getByNavn();

        return null;
    }

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

    public boolean isCellEditable(int row, int column) {
        return false; // alle celler er ikke editerbare
    }

    public void setValueAt(Object value, int row, int column) {
        switch( column ) {
            case 0: {
                ((By)data.get(row)).setPostNr((String)value);
            } break;
            case 1: {
                ((By)data.get(row)).setByNavn((String)value);
            } break;
        }
        fireTableCellUpdated(row, column);
    }

    public void addBy(By byObj) {
        data.add(byObj);
        fireTableRowsInserted(data.size(), data.size());
    }

    public void removeTableElement(int index) {
        if( !(index == -1) ) {
            data.remove(index);
            fireTableRowsDeleted(index, index);
        }
    }

    public void removeAll() {
        int slut = data.size();
        data.clear();
        fireTableRowsDeleted(0, slut);
    }
}

så tror jeg den fanger den :-) - men du skal så add'e med 
  model.addBy( byObj );
Avatar billede bearhugx Nybegynder
23. august 2003 - 22:07 #9
trp79 >> he he -- jeg troede det var noget kode, som cas arbejdede med -- lod mig simpelthen rive med :-))))
Avatar billede casualty Nybegynder
23. august 2003 - 22:16 #10
Taktak begge to..det er lige præcis, det jeg mener...kan i ikke begge oprette et svar så deler jeg points´ne imellem jer. (bearhugx kom først og ledte mig på sporet og trp79 gav mig koden...
Avatar billede bearhugx Nybegynder
23. august 2003 - 22:32 #11
^svar^
Avatar billede trp79 Nybegynder
23. august 2003 - 22:33 #12
Det var så lidt :o)

Vil du have koden for table element også eller har du den?
mvh
Torben
Avatar billede casualty Nybegynder
23. august 2003 - 22:38 #13
trp79->> Nej ellers tak den laver jeg selv :)
Avatar billede casualty Nybegynder
23. august 2003 - 23:05 #14
Extra spørgsmål. Hvad bruger man denne metode til?

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

Den kommer med en nullPointerException når jeg prøver at sætte ind via.

public void addTableElement(MyFile myFile)
{
  data.add(myFile);
  fireTableRowsInserted(data.size(), data.size());
}

PS: Jeg har hordCodet lidt og erstattet "table element" objektet med mit eget ("MyFile")
Avatar billede casualty Nybegynder
23. august 2003 - 23:23 #15
Bare glem det ;)
Avatar billede bearhugx Nybegynder
24. august 2003 - 00:05 #16
cas >> skulle du ikke bruge det, eller fandt du ud af det selv ? -- for jeg kan godt yde en forklaring på det spørgsmål... :-)
Avatar billede casualty Nybegynder
24. august 2003 - 00:13 #17
Jo jeg vil meget gerne vide hvad den ClassLoader(hedder det ikke det?)gør...Jeg løste selv fejlen men ved stadig ikke hvad den gør :)
Avatar billede bearhugx Nybegynder
24. august 2003 - 00:23 #18
metoden getColumnClass(int) bruges af CellRender'en til at finde ud af, hvilken klasse, data i den pågældende kolonne er af - og dermed, hvordan den skal vise det data, som vil optræde i den pågældende kolonne...

Hvis det f.eks. er String, så vil CellRenderen normalt bare skrive tekststrengen (formentligt som et JPanel)...

Men forestil dig at Class'en for den kolonne var Boolean - så er standarden at afbillede en checkboks (som er sat, hvis den boolske værdi er sand) -- hvis Class'en er en form for List (Collection) vises cellen derimod tit som en drop-down liste, med Listen valgmuligheder i....

I dit tilfælde er både PostNr og ByNavn en String (antager jeg), så derfor kan du faktisk lave en metode, som udelukkende sender String tilbage.

// DENNE METODE VIL ALTID RETURNERE CLASS FOR java.lang.String.
public Class getColumnClass(int bruges_ikke) {
  String dummy = new String();
  return dummy.getClass();
  // Der er sikkert en måde man kan bruge uden at skulle instantiere en dummy
  // - det lader jeg andre til at finde ud af :-)
}
Avatar billede casualty Nybegynder
24. august 2003 - 22:12 #19
bearhugx ->> Tak for udredningen...Nu er jeg bedre med.. :)

Mvh Casialty
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