16. februar 2003 - 17:27Der er
10 kommentarer og 1 løsning
Dynamisk JTable
Jeg savner et eksempel på en JTable som ved klik på en knap tilføjes flere rækker. Jeg kan sagtens loade JTable ved start men kan ikke finde ud af at opdatere den når den først er oprettet.
Jeg har leget en del med problemet men er løbet tør for ideer. Håber nogen har et eksempel som jeg kan lære af.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Der vil altid være en table model tilknyttet en JTable - nedenfor er et eksempel hvor der tilføjes rækker dynamisk. Her bruges DefaultTableModel som ved hvert kald af addRow() vil gøre din JTable opmærksom på at den skal gentegnes - dette behøver ikke være tilfældet hvis du laver din egen table model.
Hvis du laver din egen table model som nedarver fra AbstractTableModel skal du selv sørge for at fireTableRowsInserted() bliver kaldt på et passende tidspunkt - dette behøver jo ikke være hver eneste gang en metode lignende addRow() i din egen table model kaldes..
public class JTableExample extends javax.swing.JFrame implements java.awt.event.ActionListener { private javax.swing.JTextField col1Field = new javax.swing.JTextField(10); private javax.swing.JTextField col2Field = new javax.swing.JTextField(10); private javax.swing.JButton addRowButton = new javax.swing.JButton("Add row");
private javax.swing.JTable table = new javax.swing.JTable(); private javax.swing.table.DefaultTableModel tableModel;
public JTableExample() { super("JTableExample");
javax.swing.JPanel controlPanel = new javax.swing.JPanel(); controlPanel.setLayout( new java.awt.FlowLayout(java.awt.FlowLayout.LEFT) ); controlPanel.add( new javax.swing.JLabel("Column 1:") ); controlPanel.add( col1Field ); controlPanel.add( new javax.swing.JLabel("Column 2:") ); controlPanel.add( col2Field ); controlPanel.add( addRowButton );
addRowButton.addActionListener( this );
tableModel = (javax.swing.table.DefaultTableModel)table.getModel(); // tilføj 2 tomme kolonner - kolonner skal eksistere // før rækker kan tilføjes tableModel.addColumn("Column 1"); tableModel.addColumn("Column 2");
getContentPane().setLayout( new java.awt.BorderLayout() ); getContentPane().add( new javax.swing.JScrollPane(table), java.awt.BorderLayout.CENTER ); getContentPane().add( controlPanel, java.awt.BorderLayout.SOUTH ); pack(); }
public void actionPerformed( java.awt.event.ActionEvent e ) { if( e.getSource() == addRowButton ) { tableModel.addRow( new String[]{ col1Field.getText(), col2Field.getText()} ); } }
public static void main( String[] args ) { new JTableExample().show(); } }
mit behov opfyldes i dit eksempel ulrikm. jeg har ikke lyst til at skrive min egen tablemodel. har tidligere gjort da jeg skulle have farve i nogle celler, men jeg synes det er lidt omstændigt at lave egne klasser til en JTable.
Det er nu temmelig enkelt at skrive sin egen TableModel og også langt det bedste af hastighedsårsager.
Her er et eksempel jeg har lavet med: en simpel datamodel: ATableModel et objekt der repræsenterer en række i tabellen: TableElement en JFrame klasse der viser en tabel samt nogle funktioner på den.
Højreklik på et element i tabellen for at fjerne det og tryk på tilføj knappen for at tilføje et.
public class ATableModel extends AbstractTableModel { private String[] columns = { "Navn", "Adresse", "Telefonnummer" }; private Vector data;
public ATableModel() { data = new Vector(); }
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.elementAt(row); String value = ""; switch( column ) { case 0: { value = element.getNavn(); } break; case 1: { value = element.getAdresse(); } break; case 2: { value = element.getTelefonNummer(); } break; } return value; }
public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); }
public boolean isCellEditable(int row, int col) { return false; }
public void setValueAt(Object value, int row, int column) { switch( column ) { case 0: { ((TableElement)data.elementAt(row)).setNavn((String)value); } break; case 1: { ((TableElement)data.elementAt(row)).setAdresse((String)value); } break; case 2: { ((TableElement)data.elementAt(row)).setTelefonNummer((String)value); } break; } fireTableCellUpdated(row, column); }
public void addTableElement(TableElement element) { data.add(element); fireTableRowsInserted(data.size(), data.size()); }
int result = JOptionPane.showOptionDialog(this, messages, "Indtast", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0] ); if( result == 0) tableModel.addTableElement(new TableElement(navn.getText(), adresse.getText(), telefon.getText())); } private void removeElement() { tableModel.removeTableElement(table.getSelectedRow()); } 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()) {
JTable table = (JTable)e.getComponent(); Point point = new Point(e.getX(), e.getY()); table.setRowSelectionInterval(table.rowAtPoint( point ),table.rowAtPoint( point )); table.setColumnSelectionInterval(table.columnAtPoint( point ),table.columnAtPoint( point )); String columnName = table.getColumnName(table.getSelectedColumn()); popup.show(e.getComponent(), point.x, point.y); } } } }
class TestTableTest {
public static void main(String[] args) { new TableTest().show(); } }
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.