Avatar billede datamatikeren Nybegynder
11. marts 2003 - 21:39 Der er 12 kommentarer og
1 løsning

Opdatering af en JTable

Hvordan opdatere man en JTable?

Object[][] data = {{"Mary", "Campione"},{"Alison", "Humle"}};
String[] columnNames = {"First Name", "Last Name"};
JTable table = new JTable(data, columnNames);

Derefter vil jeg gerne gøre det muligt at opdatere denne JTable med nogle andre data. (Slette de der er, og vise nogle nye)

Nogen der har et eksempel på dette??
Avatar billede soreno Praktikant
11. marts 2003 - 21:55 #1
Der er et fint eksempel med i jdk'en, se:
"c:\Program Files\jdk\demo\jfc\TableExample"
Avatar billede riversen Nybegynder
11. marts 2003 - 22:03 #2
jeg vil foreslå du nedarver fra AbstractTableModel. Her skal du så override følgende metoder:
  public int getRowCount();
  public int getColumnCount();
  public Object getValueAt(int row, int column);

du smider dine data og columnnames deri, så du skal også override getcolumnname.
Når så du ændrer på data i din tablemodel kalder du en af fire-metoderne...fx fireDataChanged();
Avatar billede riversen Nybegynder
11. marts 2003 - 22:03 #3
fireTableDataChanged() selvfølgelig
Avatar billede viht Nybegynder
12. marts 2003 - 00:14 #4
fireTableDataChanged() er ikke god, fordi den resulterer i at alle celler bliver repaintet. Det er naturligvis ikke nødvendigt at gentegne celler der ikke er ændrede.

Bedre er det at bruge
fireTableCellUpdated(int startIndex, int slutIndex) og
fireTableRowsInserted(int startIndex, int slutIndex) og
fireTableRowsDeleted(int startIndex, int slutIndex);

Her er et eksemepel, hvor du kan oprette og slette emner i en tabel. Tabelcellerne er repræsenteret af objektet TableElement, som du selv kan modificere. Tabellens model er ATableModel som arbejder på en ArrayList af TableElement objekter. Både sletninger af elementer og tilføjelse af dem opdateres præcist på tabellen, så der kun sker de repaints der er nødvendige.

Marker et eller flere elementer og højreklik for at slette dem.

// TableElement.java:
public class TableElement {
   
  private String navn;
  private String adresse;
  private String telefonnummer;


    public TableElement(String navn, String adresse, String telefonnummer) {
        this.navn = navn;
        this.adresse = adresse;
        this.telefonnummer = telefonnummer;
    }
   
    public void setNavn(String navn) {
        this.navn = navn;
    }

    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }

    public void setTelefonnummer(String telefonnummer) {
        this.telefonnummer = telefonnummer;
    }
    public String getNavn() {
        return (this.navn);
    }

    public String getAdresse() {
        return (this.adresse);
    }

    public String getTelefonnummer() {
        return (this.telefonnummer);
    }

    public String toString() {

        StringBuffer toString = new StringBuffer();
        toString.append("\nnavn = ");
        toString.append(navn);
        toString.append("\nadresse = ");
        toString.append(adresse);
        toString.append("\ntelefonnummer = ");
        toString.append(telefonnummer);
        toString.append("\n");
       
        return new String(toString);
    }
}

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

import java.util.*;

public class ATableModel extends AbstractTableModel {
    private String[] columns = { "Navn", "Adresse", "Telefonnummer" };
    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.getNavn();
           
        if( column == 1 )
            return element.getAdresse();
           
        return element.getTelefonnummer();
    }

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

    public void setValueAt(Object value, int row, int column) {
        switch( column ) {
            case 0: {
              ((TableElement)data.get(row)).setNavn((String)value);
            } break;
            case 1: {
                ((TableElement)data.get(row)).setAdresse((String)value);
            } break;
            case 2: {
                ((TableElement)data.get(row)).setTelefonnummer((String)value);
            } break;
        }
        fireTableCellUpdated(row, column);
    }
   
    public void addTableElement(TableElement element) {
        data.add(element);
        fireTableRowsInserted(data.size(), data.size());
    }
   
    public void removeTableElement(int[] indexes) {
        if( indexes != null ) {
            for( int i = indexes.length-1; i >= 0; i-- ) {
                int index = indexes[i];
                data.remove(index);
                fireTableRowsDeleted(index, index);
            }
        }
    }
}

// TableTest.java:
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.*;
import java.awt.event.*;
import java.awt.*;

public class TableTest extends JFrame {
   
    private JTable table;
    private ATableModel tableModel;
   
    private JPopupMenu popup;

    public TableTest() {
        super("TableTest");
        setSize(400,400);
        getContentPane().setLayout(new BorderLayout());
       
        tableModel = new ATableModel();
        table = new JTable(tableModel);
        table.getTableHeader().setReorderingAllowed(false);
        table.getTableHeader().setResizingAllowed(false);
        table.addMouseListener(new PopupListener());
       
        popup = new JPopupMenu();
        JMenuItem sletItem = new JMenuItem("Slet");
        sletItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
              deleteElements();
            }
        });
        popup.add(sletItem);
       
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
       
        JPanel buttons = new JPanel();
        JButton addButton = new JButton("Tilføj");
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
              addElement();
            }
        });
        buttons.add(addButton);
        getContentPane().add(buttons, BorderLayout.SOUTH);
      }
   
    private void addElement() {
   
        JTextField navnField = new JTextField("Navn");
        JTextField adresseField = new JTextField("Adresse");
        JTextField tlfField = new JTextField("Telefonnummer");
       
        Object[] messages = { navnField, adresseField, tlfField };
        String[] options = { "Ok", "Annuller" };
       
        int ret = JOptionPane.showOptionDialog(this,
                                                            messages,
                                                            "Indtast",
                                                            JOptionPane.DEFAULT_OPTION,
                                                            JOptionPane.INFORMATION_MESSAGE,
                                                            null,
                                                            options,
                                                            options[0] );
        if( ret == 0 ) {
            TableElement element = new TableElement(navnField.getText(), adresseField.getText(), tlfField.getText());
            tableModel.addTableElement(element);
        }
       
    }
   
    private void deleteElements() {
        int[] indexes = table.getSelectedRows();
        tableModel.removeTableElement(indexes);
    }
   
    private  class PopupListener extends MouseAdapter {
          public void mousePressed(MouseEvent e) {
          maybeShowPopup(e);
          }
   
          public void mouseReleased(MouseEvent e) {
          maybeShowPopup(e);
          }
   
          public void mouseClicked(MouseEvent e) {
          maybeShowPopup(e);
          }
   
          public void maybeShowPopup(MouseEvent e) {
          if (e.isPopupTrigger()) {
              popup.show(e.getComponent(), e.getX(), e.getY());
          }
          }
    }
}

class TestTableTest {
   
    public static void main(String[] args) {
        new TableTest().show();
    }
}
Avatar billede viht Nybegynder
12. marts 2003 - 00:16 #5
Og lige en rettelse til mig selv...
Sådan her: fireTableCellUpdated(int række, int kolonne);
Avatar billede riversen Nybegynder
12. marts 2003 - 07:11 #6
viht: han skriver ikke særlig detaljeret hvor meget der opdateres, så derfor bruger jeg fireTableDataChanged...og jeg skriver fx ;-)
Avatar billede viht Nybegynder
12. marts 2003 - 08:44 #7
Du har ret.. jeg er bare Swing fetischist :)
Avatar billede riversen Nybegynder
12. marts 2003 - 09:18 #8
vi har alle vores særheder...nogen større end andre...hmmmmm ;-)
Avatar billede datamatikeren Nybegynder
12. marts 2003 - 13:10 #9
Det er HELE tabellen der skal opdateres med andre data.
Avatar billede viht Nybegynder
12. marts 2003 - 13:47 #10
fireTableRowsDeleted(0, list.size());
Avatar billede datamatikeren Nybegynder
12. marts 2003 - 20:16 #11
Tak for hjælpen
Avatar billede riversen Nybegynder
12. marts 2003 - 20:52 #12
damatikeren: hvilken skole og semester?
Avatar billede viht Nybegynder
12. marts 2003 - 21:26 #13
Jeg forstår ikke hvorfor du afviser mit 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