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??
Annonceindlæg fra Kommando
11. marts 2003 - 21:55
#1
Der er et fint eksempel med i jdk'en, se: "c:\Program Files\jdk\demo\jfc\TableExample"
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();
11. marts 2003 - 22:03
#3
fireTableDataChanged() selvfølgelig
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(); } }
12. marts 2003 - 00:16
#5
Og lige en rettelse til mig selv... Sådan her: fireTableCellUpdated(int række, int kolonne);
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 ;-)
12. marts 2003 - 08:44
#7
Du har ret.. jeg er bare Swing fetischist :)
12. marts 2003 - 09:18
#8
vi har alle vores særheder...nogen større end andre...hmmmmm ;-)
12. marts 2003 - 13:10
#9
Det er HELE tabellen der skal opdateres med andre data.
12. marts 2003 - 13:47
#10
fireTableRowsDeleted(0, list.size());
12. marts 2003 - 20:16
#11
Tak for hjælpen
12. marts 2003 - 20:52
#12
damatikeren: hvilken skole og semester?
12. marts 2003 - 21:26
#13
Jeg forstår ikke hvorfor du afviser mit svar??!
Kurser inden for grundlæggende programmering