Avatar billede Slettet bruger
04. december 2012 - 23:18 Der er 4 kommentarer og
1 løsning

Opdatering af Jtabel

Hej,

Jeg har Jtabel hvor jeg har lavet min egen TabelModel, så det er muligt at sende et Person objekt og så bliver værdierne i objektet vist i en tabel.

Jeg har min TabelModel klasse som extends AbstractTableModel. I denne klasse har jeg en liste med de objekter, som skal vises i tabellen. Det virker fint, hvis jeg objekt er tilføjet til tabellen inden run-time.

I min GUI benytter jeg mig af følgende når jeg vil opdater min tabel (t er mit objekt):

TabelModel.addRow(t);
TabelModel.fireTableDataChanged();                       dataTabel.revalidate();                          dataTabel.repaint();


I TabelMOdel klassen har jeg en liste over alle de objekter, som skal vises i tabellen. Jeg kan se at denne liste bliver opdateret med det rigtige objekt, når jeg kalder addRow(t). Men der bliver kun vist det samme objekt, som jeg startede ud med bare en ekstra gang hvor hver gang jeg klikker på min Add knap.

Nogen som har en ide om, hvor jeg er galt på den?
Avatar billede arne_v Ekspert
04. december 2012 - 23:22 #1
kan du vise lidt mere kode?
Avatar billede Slettet bruger
04. december 2012 - 23:27 #2
Min modelTabel klasse

public class PRobotStatusTableModel extends AbstractTableModel {
    List<EStatusInterface> robotStatusList = new LinkedList<EStatusInterface>();
    EStatusInterface statusData;
    String[] columnName = {"Battery","Uptime","Weight","Status", "Recharges"};
 
    public PRobotStatusTableModel(EStatusInterface data){
        robotStatusList.add(data);
    }

......

    @Override
    public Object getValueAt(int row, int column) {

        System.out.println("ROW: " + row + " COL: " + column);
        for(EStatusInterface entity : robotStatusList) {
           
            switch (column) {
            case 0:
                return entity.getBatteryStatus();
            case 1:
                return entity.getUpTime();
            case 2:
                return entity.getWeight();
            case 3:
                return entity.getRobotStatus();
            case 4:
                return entity.getRecharges();
            default :
                return "--!!--";
            }
        }
        return "!! -- !!";
    }
   
    public String getColumnName(int col) {
        return columnName[col];
        }

    public void addRow (EStatusInterface data) {
            robotStatusList.add(data);
            fireTableDataChanged();
            System.out.println(robotStatusList);       
    }   
}


//////////////

Uddrag af min GUI klasse

t = stub.readDataFromRobot(2, nextDataID);
model.addRow(t);
model.fireTableDataChanged();                      dataTabel.revalidate();                          dataTabel.repaint();


Hvor nextDataID er en int, som tæller fra 0 til en slut værdi.
Avatar billede arne_v Ekspert
05. december 2012 - 03:36 #3
Det burde vaere nok bare at kalde fireTableDataChanged.

Eksempel:

package december;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

public class UpdateTable extends JFrame {
    private int n = 0;
    private MyModel model = new MyModel();
    public UpdateTable() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setTitle("Simple table");
        JTable tbl = new JTable(model);
        getContentPane().add(new JScrollPane(tbl), BorderLayout.CENTER);
        JButton btn = new JButton("Add");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                n++;
                model.add(n, "This is row " + n);
            }
        });
        getContentPane().add(btn, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new UpdateTable();
                f.setVisible(true);
            }
        });
    }
}

class MyModel extends AbstractTableModel {
    private List<String> colnam = new ArrayList<String>();
    private List<List<String>> data = new ArrayList<List<String>>();
    public MyModel() {
        colnam.add("F1");
        colnam.add("F2");
    }
    @Override
    public int getColumnCount() {
        return colnam.size();
    }
    @Override
    public int getRowCount() {
        return data.size();
    }
    @Override
    public String getColumnName(int colix) {
        return colnam.get(colix);
    }
    @Override
    public Object getValueAt(int rowix, int colix) {
        return data.get(rowix).get(colix);
    }
    public void add(int f1, String f2) {
        List<String> row = new ArrayList<String>();
        row.add(Integer.toString(f1));
        row.add(f2);
        data.add(row);
        fireTableDataChanged();
    }
}
Avatar billede Slettet bruger
05. december 2012 - 09:26 #4
Hej,

Tak for koden det hjælp. Jeg rettede i min getValueAt metode fra at have et loop til bare at hente det rette element ud fra min ArrayList.

Jeg takker mange gang. Du må gerne lige smide et svar.
Avatar billede arne_v Ekspert
05. december 2012 - 21:20 #5
svar
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