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?
Annonceindlæg fra Infor
04. december 2012 - 23:22
#1
kan du vise lidt mere kode?
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.
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(); } }
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.
05. december 2012 - 21:20
#5
svar
Kurser inden for grundlæggende programmering