Avatar billede mora Nybegynder
26. marts 2005 - 02:16 Der er 5 kommentarer og
1 løsning

JTable opdatere/nyt indhold

Hvordan skal man opdatere en JTable ?

Jeg starter med at lave en tom table, og får senere dataerne til den (flere gange i samme program)

Ligenu laver jeg en ny instans af det panel der har tabellen, som fylder den med data under construction og repainter så både main gui, og det panel som tabellen ligger i, men den ændres ikke.

har prøvet at fylde data i fra start og det virker fint, så min metode i tabel panelet virker fint.

er der en anden måde hvor man kan geninitialisere tabellen med nye data (de fylder ikke det samme antal rækker, men altid det samme antal kolonner)
Avatar billede mikkelbm Nybegynder
26. marts 2005 - 08:24 #1
Må vi se den kode, hvor du fylder data i din JTable?
Avatar billede mora Nybegynder
26. marts 2005 - 13:50 #2
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

public class bottomPanel extends JPanel {
private EmployeeDataModel employeeModel;

private Vector result;

  public bottomPanel(Vector result) {
      this.result = result;
     
    String[][] rows = new String[result.size()][4];

    for (int i=0; i<result.size(); i++)
    {
        Pre pre = (Pre)result.get(i);
        rows[i][0] = ""+pre.getID();
        rows[i][1] = ""+pre.getTime();
        rows[i][2] = pre.getTitle();
        rows[i][3] = pre.getSection();
    }     
     
    try {
      jbInit(rows);
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  void jbInit(String[][] rows) throws Exception {
    setLayout(new BorderLayout());

    // Create data model
    employeeModel = new EmployeeDataModel(rows);

    // Create/setup table
    JTable table = new JTable(employeeModel);

    // Place table in JScrollPane
    JScrollPane scrollPane = new JScrollPane(table);

    // Add to Screen
    add(scrollPane, BorderLayout.CENTER);

  }
 
  class EmployeeDataModel
      extends AbstractTableModel {
String[][] rows;
public EmployeeDataModel(String[][] rows)
{
    this.rows = rows;
}

    // By extending AbstractTableModel, instead of
    // implementing TableModel yourself,
    // AbstractTableModel takes care of
    // TableModelListener list management

    String columns[] = {"ID", "Time", "Title", "Section"};

    private int numColumns = 4;
    private int numRows = result.size();

    public int getColumnCount() {
      return numColumns;
    }

    public int getRowCount() {
      return numRows;
    }

    public Object getValueAt(int row, int column) {
      return rows[row][column];
    }

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

    public void setValueAt(Object aValue,
                          int row, int column) {
      String cellValue;
      if (aValue instanceof String)
        cellValue = (String) aValue;
      else
        cellValue = aValue.toString();
      rows[row][column] = cellValue;
      fireTableCellUpdated(row, column);
    }

    public boolean isCellEditable(int row, int column) {
      return false;
    }

  }
}
Avatar billede mora Nybegynder
26. marts 2005 - 14:01 #3
og i main gui når den modtager resultat

    public void renderResult(Vector result)
    {
        bottom = new bottomPanel(result);
        bottom.repaint();
        this.repaint();
    }


bottom er den variabel som bottompanel er tildelt
Avatar billede _carsten Nybegynder
26. marts 2005 - 22:24 #4
Har lavet lidt om på din kode, så den burde fungere efter hensigten, det er godt nok ikke testet, men det burde virke.

Denne del skal du bruge alle steder hvorfra du fylder din tabel

        employeeModel.removeRows();
        employeeModel.fireTableDataChanged();

        for (int i=0; i<result.size(); i++)    {
            Pre pre = (Pre)result.get(i);
           
            Vector v = new Vector();
            v.add(""+pre.getID());
            v.add(""+pre.getTime());
            v.add(pre.getTitle());
            v.add(pre.getSection());
           
            employeeModel.addRow(v);
        }
        employeeModel.fireTableDataChanged();




Og så får du lige hele samlingen, så du kan se hvilke andre ting jeg har ændret, har blandt andet ændret lidt i modellens metoder og tilføjet et par i bunden.

class bottomPanel extends JPanel {
    private EmployeeDataModel employeeModel;
    private JTable table;
    private Vector result;
   
   
    public bottomPanel(Vector result) {
        this.result = result;
       
        employeeModel.removeRows();
        employeeModel.fireTableDataChanged();

        for (int i=0; i<result.size(); i++)    {
            Pre pre = (Pre)result.get(i);
           
            Vector v = new Vector();
            v.add(""+pre.getID());
            v.add(""+pre.getTime());
            v.add(pre.getTitle());
            v.add(pre.getSection());
           
            employeeModel.addRow(v);
        }
        employeeModel.fireTableDataChanged();
       
        try {
            jbInit(rows);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
   
  void jbInit(String[][] rows) throws Exception {
      setLayout(new BorderLayout());
     
      // Create data model
      employeeModel = new EmployeeDataModel();
      table = new JTable(employeeModel);
     
      // Place table in JScrollPane
      JScrollPane scrollPane = new JScrollPane(table);
     
      // Add to Screen
      add(scrollPane, BorderLayout.CENTER);
     
  }

  class EmployeeDataModel extends AbstractTableModel {
      private ArrayList rows;  // ArrayList eller Vector, dynamisk !
      private int numColumns = 4;
      private int numRows = result.size();
      private String columns[] = {"ID", "Time", "Title", "Section"};
     
      public EmployeeDataModel(){
          rows = new ArrayList();
      }
     
   
      // By extending AbstractTableModel, instead of
      // implementing TableModel yourself,
      // AbstractTableModel takes care of
      // TableModelListener list management
     
      public int getColumnCount() {
          return numColumns;
      }
     
      public int getRowCount() {
          return numRows;
      }
     
      public Object getValueAt(int row, int column) {
          return ((Vector)rows.get(row)).elementAt(column);
      }
     
      public String getColumnName(int columnIndex) {
          return columns[columnIndex];
      }
     
      public void setValueAt(Object aValue, int row, int column) {
          Vector vec = rows.get(row);
          vec.setElementAt(aValue,  column);
          fireTableCellUpdated(row, column);
      }
     
      public boolean isCellEditable(int row, int column) {
          return false;
      }
     
      public void removeRows(){
          rows = new ArrayList();
          fireTableDataChanged();
      }
     
      public void addRow(Vector v){
          rows.add(v);
      }
  }
}
Avatar billede mora Nybegynder
01. april 2005 - 13:03 #5
Virker med lidt småændringer :)

Smider du et svar ?
Avatar billede _carsten Nybegynder
01. april 2005 - 15:51 #6
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