Avatar billede funkyloonie Nybegynder
16. februar 2003 - 17:27 Der 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.
Avatar billede riversen Nybegynder
16. februar 2003 - 17:31 #1
når du ændrer på din tablemodel skal du kalde en af firemetoderne
Avatar billede riversen Nybegynder
16. februar 2003 - 17:31 #2
så får tabellen besked om at der er sket en ændring og opdaterer
Avatar billede funkyloonie Nybegynder
16. februar 2003 - 19:45 #3
jeg kan ikke finde ud af at bruge firePropertyChange. har prøvet men har ingen ide om hvad det er jeg skal bruge som parameter
Avatar billede riversen Nybegynder
16. februar 2003 - 19:47 #4
brug fireTableStructureChanged()
Avatar billede funkyloonie Nybegynder
16. februar 2003 - 19:53 #5
hmm. den eneste fire-metode jeg kan finde på min table er firePropertyChange... du skulle ikke have et mindre eksempel?
Avatar billede funkyloonie Nybegynder
16. februar 2003 - 19:57 #7
jeg bruger vist ikke en table model. Jeg opretter min JTable med to vektorer table = new JTable(rowData, columnNames); jeg kigger lige på linket.
Avatar billede ulrikm Nybegynder
16. februar 2003 - 20:35 #8
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(); 
  }
}
Avatar billede funkyloonie Nybegynder
16. februar 2003 - 20:53 #9
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.
Avatar billede viht Nybegynder
16. februar 2003 - 21:14 #10
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.

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 java.util.Vector;

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());
    }
   
    public void removeTableElement(int index) {
        if( !(index == -1) ) {
            data.removeElementAt(index);
            fireTableRowsDeleted(index, index);
        }
    }
}

TableTest.java:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class TableTest extends JFrame {
   
    private JTable table;
    private ATableModel tableModel;
   
    private JButton addButton;
    private JPopupMenu popup;
    private JMenuItem sletItem;
   
    public TableTest() {
        super("TableTest");
        setSize(400,400);
        getContentPane().setLayout(new BorderLayout());
       
        tableModel = new ATableModel();
        table = new JTable(tableModel);
        table.addMouseListener(new PopupListener());
        table.getTableHeader().setReorderingAllowed(false);
      table.getTableHeader().setResizingAllowed(false);
       
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
       
        JPanel buttons = new JPanel();
        addButton = new JButton("Tilføj");
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                addElement();
            }
        });
        buttons.add(addButton);
        getContentPane().add(buttons, BorderLayout.SOUTH);
       
        popup = new JPopupMenu("Valgmuligheder");
        sletItem = new JMenuItem("Slet felt");
        sletItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                removeElement();
            }
        });
        popup.add(sletItem);
    }
   
    private void addElement() {

        JTextField navn = new JTextField("Navn");
        JTextField adresse = new JTextField("Adresse");
        JTextField telefon = new JTextField("Telefonnummer");
       
        Object[] messages = new Object[3];
        messages[0] = navn;
        messages[1] = adresse;
        messages[2] = telefon;
        String[] options = { "Ok", "Annuller" };
       
        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();
    }
}
Avatar billede funkyloonie Nybegynder
16. februar 2003 - 21:18 #11
viht>> tak for eksemplet. jeg vil kigge på det.
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