Avatar billede halden Nybegynder
24. februar 2003 - 11:45 Der er 4 kommentarer og
1 løsning

Dynamisk JTable med knapper

Jeg har et lille problem med JTable og knapper. Jeg har en vector med vectorer og for hver vektors sidste plads i hovedvektoren skal der være en knap. Dette må ikke ske når jeg laver vektoren men skal ske efter jeg har sat den in di tabellen.
Det store problem er Actionlistener. Der skal jo tilføjes en Actionlistener til hver knap, men for at kunne gøre det skal knappen jo have en specifikt navn. Hvordan gøres dette???
Kan jeg oprette knapper i en for med forskellige navne???
Er det ikke noget med at man kan have en ActionPerformed til mange knapper, hvis jeg bruger f.eks. navnet på knappen til at identifisere hvilken event det er???

Her er metoden...

private void visbiler() {
        javax.swing.table.DefaultTableModel t = new javax.swing.table.DefaultTableModel();
        table.setModel(t);
        Vector vec = null;
        t.addColumn((Object)"Bil_ID");
        t.addColumn((Object)"Mærke");
        t.addColumn((Object)"Model");
        t.addColumn((Object)"Årgang");
        t.addColumn((Object)"Km kørt");
        t.addColumn((Object)"Pris");
        t.addColumn((Object)"Info");
        t.addColumn((Object)"Slet");
       
        try {
            Vector vec = gui.admin_control.getBiler();
        }
        catch (java.rmi.RemoteException e) {
            VariableBesked vindue = new VariableBesked("Fejl - biler ikke modtaget! " + e);
            vindue.show();
        }
       
        //Det er i denne for jeg gerne vil have
        //en knap med ationlistener på.
        for (int i=0; i<vec.size(); i++) {
            Vector mid = vec.elementAt(i);
            t.addRow(mid);
            JButton infoknap = new JButton("Info");
            infoknap.setName(mid.elementAt(1));
            infoknap.addActionlis..........
            table.setValueAt(infoknap, t.getRowCount(), 7);
        }
    }
Avatar billede viht Nybegynder
24. februar 2003 - 12:24 #1
Idet dine JButtons er anonyme i Vectoren er du nødt til at spørge i din actionPerformed metode hvilken knap der er tale om.

Freehand:

public class MyClass implements ActionListener {
...
...
public void actionPerformed(ActionEvent event) {
  Vector underVector1 = (Vector)mainVector.get(0);
  Vector underVector2 = (Vector)mainVector.get(1);
  Vector underVector3 = (Vector)mainVector.get(2);
  ...
  if( event.getSource() == underVector1.lastElement() ) {
      ...
  }
  else if( event.getSource() == underVector2.lastElement() ) {
      ...
  }
  else if( event.getSource() == underVector3.lastElement() ) {
      ...
  }
...
}
Avatar billede viht Nybegynder
24. februar 2003 - 12:29 #2
Det er vel bedre at have undervektorerne liggende som private variabler, så de ikke skal instatieres hver gang metoden actionPerformed kaldes.
Avatar billede halden Nybegynder
24. februar 2003 - 12:35 #3
har selv fundet ud af det og sådan ser det ud:

private void visbiler() {
        javax.swing.table.DefaultTableModel t = new javax.swing.table.DefaultTableModel();
        table.setModel(t);
        Vector vec = null;
        t.addColumn((Object)"Bil_ID");
        t.addColumn((Object)"Mærke");
        t.addColumn((Object)"Model");
        t.addColumn((Object)"Årgang");
        t.addColumn((Object)"Km kørt");
        t.addColumn((Object)"Pris");
        t.addColumn((Object)"Info");
        t.addColumn((Object)"Slet");
       
        try {
            Vector vec = gui.admin_control.getBiler();
        }
        catch (java.rmi.RemoteException e) {
            VariableBesked vindue = new VariableBesked("Fejl - biler ikke modtaget! " + e);
            vindue.show();
        }
       
       
        final JButton infoknap = new JButton("Info");
        final JButton sletknap = new JButton("Slet");
        for (int i=0; i<vec.size(); i++) {
            Vector mid = (Vector)vec.elementAt(i);
            mid.addElement(infoknap);
            mid.addElement(sletknap);
            infoknap.setName((String)mid.elementAt(1));
            sletknap.setName((String)mid.elementAt(1));
            t.addRow(mid);
            infoknap.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    visInfoActionPerformed(infoknap.getName());
                }
            });
            sletknap.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    visSletActionPerformed(sletknap.getName());
                }
            });
           
        }
    }
Avatar billede viht Nybegynder
24. februar 2003 - 12:40 #4
Jeg ved ikke hvor mange undervektorer du har, men jeg håber da det er et fast antal. Hvis det ikke er et fast antal får du et problem med at identificere de enkelte knapper...

public void actionPerformed(ActionEvent event) {
  for( int i = 0; i < mainVector.size(); i++ ) {
      Vector v = (Vector)mainVector.get(i);
      if( event.getSource() == v.lastElement() ) {
        switch(i) {
            case 1: { ... } break;
            case 2: { ... } break;
            ...
        }
      }
  }
}
Avatar billede viht Nybegynder
24. februar 2003 - 12:45 #5
Det kan du selvfølgelig også.. så slipper du også for at lave opslag i hovedvektoren. Det fylder så bare en anelse mere i koden, men det er vel til at leve med.
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