Avatar billede extremecode Nybegynder
07. maj 2003 - 16:01 Der er 19 kommentarer og
1 løsning

brug af Vector med JTable

ok jeg vil oprette en Jtable ved brug af vektorer
jeg får en vector tilbage fra min database som indeholder
object(navn,vare,pris), object(navn,vare,pris)
disse ting er gemt i vectoren, og det er disse ting jeg gerne vil have smidt ud i jtables

statestiknavne = new Vector();
statestiknavne.addElement("Personalenummer");
statestiknavne.addElement("Varenavn");
statestiknavne.addElement("Antal");

WorkFlowHandler wkf=new WorkFlowHandler();
v=wkf.statistik("1234");
DefaultTableModel model = new DefaultTableModel(((Vector)(v.elementAt(1))), statestiknavne);

statestik = new JTable(model);

wkf.statistik("1234") er den metode som returnere førnævnte vector
men hvis jeg køre dette kommer den med en runtime error.

for følgende fejl
Exception in tread "main" java.lang.classCastException

hvordan hulen kan jeg nemt få vist mine data fra vektoren i en JTable...
Har siddet med det i flere timer nu og er ikke kommet nærmere en løsning
help help

P.s havde oprette en post med dette spørgsmål før, men kom til at trykke acceptere svar til mig selv derfor denne post igen
Avatar billede arne_v Ekspert
07. maj 2003 - 16:09 #1
#v=wkf.statistik("1234");
#wkf.statistik("1234") er den metode som returnere førnævnte vector

må betyde at v er en Vector.

Og så undrer den her mig:

((Vector)(v.elementAt(1)))

Du hiver det andet element ud af Vector'en v og typecaster det
til Vector ...

Er det det du vil ?

(altså at du har en Vector inden i en Vector)
Avatar billede viht Nybegynder
07. maj 2003 - 16:14 #2
Her er et eksempel på en simpelt TableModel, der godt nok arbejder på en ArrayList.
Jeg har implementeret metoder i modellen til at tilføje og fjerne elementer i tabellen.

//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()) {
              int row = table.rowAtPoint(new Point(e.getX(), e.getY()));
              if(row != -1) {
                  table.setRowSelectionInterval(row, row);
                  popup.show(e.getComponent(), e.getX(), e.getY());
              }
          }
          }
    }
}

class TestTableTest {

    public static void main(String[] args) {
        new TableTest().show();
    }
}
Avatar billede disky Nybegynder
07. maj 2003 - 16:22 #3
Kunne du bruge det hjælp du fik i din tidligere tråd hvor du accepterede eget svar ved en fejl ?
Avatar billede extremecode Nybegynder
07. maj 2003 - 16:29 #4
nej ville bare have svaret tilbage...

jeps arne wkf.statistik("1234") returnere en vector..
typcastnigen blev brugt fordi jeg prøvede mig lidt frem..for at får vectorens data ud og smidt ind i JTables.
arrays irretere mig da de ikke er dynamiske..
grunden til at jeg bruger en vector er fordi indeholdet kan variere i størrelsen...
hvis jeg skal til at smide vectorens indhold ind i en array hvad er så formålet ved at bruge en vector???
mener der er en konstruktor i JTables som hedder
JTable(Vector rowdata, Vector coulmndata)
men hvorledes man kan bruge den har jeg ikke kunne finde eksempler på.
på Suns HP står der bare kort at man kan bruge denne konstroktor ingen eksempler eller noget...

mener er der ingen nem måder til at få vectorens indhold smidt ind i en JTable??
eller er det bare noget jeg bilder mig ind
Avatar billede disky Nybegynder
07. maj 2003 - 16:33 #5
har du kigget på det link jeg sendte til dig ? Der er flere eksempler.
Avatar billede arne_v Ekspert
07. maj 2003 - 16:36 #6
D.v.s. at du puttet en eller flere Vector'er ind i en Vector ??
Avatar billede arne_v Ekspert
07. maj 2003 - 16:38 #7
Eller mener du:

DefaultTableModel model = new DefaultTableModel(v, statestiknavne);

?
Avatar billede extremecode Nybegynder
07. maj 2003 - 16:42 #8
jeps dinky har kigget på det link du sendte mig men der står kun hvordan man bruger arrays ikke vector..af hvad jeg kan se...har nemlig også printet det link ud og nærlæst det

Arne nej det er en vector som indeholder et object af statistik altså
eks.
vector(new statistik("1234","salat",23))
altså vectoren indeholder et eller flere object/er af statistik

dette skulle gerne ud i en JTable:
Personalenummer:  Vare:    Antal:   
1234              Salat    23
Avatar billede extremecode Nybegynder
07. maj 2003 - 16:43 #9
jeps mener
DefaultTableModel model = new DefaultTableModel(v, statestiknavne);
men den giver mig stadig en fejlmeddelese
Avatar billede disky Nybegynder
07. maj 2003 - 16:51 #10
extremcoder, så overfører du bare et Array fra din DB handler klasse istedet, eller henter data ud fra din Vector til et Array og bruger det istedet.

SOm jeg skrev tidligere kan SUN jo ikke vide hvad og hvordan du har gemt data i din Vector.
Avatar billede extremecode Nybegynder
07. maj 2003 - 16:54 #11
hmmm ja det kan du jo have ret i..men hvorfor så implemenetere en konstruktor med vectorer..hvis man ikke ved det?
Avatar billede arne_v Ekspert
07. maj 2003 - 16:56 #12
Jeg formoder at Swing bare hiver elementerne ud af Vector'en og kalder
toString på dem.
Avatar billede arne_v Ekspert
07. maj 2003 - 20:27 #13
Kan du poste noget mere kode ?

Vi komme rnok ikke videre uden mere information.
Avatar billede extremecode Nybegynder
07. maj 2003 - 22:50 #14
har ikke mere kode til Jtables ud over det jeg har postet..tror jeg vil bruge en array istedet da jeg ikke ved nok om hvorledes man brugere vectorer til Jtables vil desværre ikke give point til nogen da jeg som sådan ikke har fået noget svar på mit spørgsmål..
Avatar billede viht Nybegynder
07. maj 2003 - 22:56 #15
Meget vel, men hvis du kigger på min tablemodel kan du nemt konvertere den til at bruge en Vector. Det er bare ikke nutidigt at bruge Vector, ArrayList er væsentligt mere brugt i dag.

Sæt dig ind i hvordan metoderne på AbstractTableModel fungerer og så kan du nemt lave en dynamisk model.
Avatar billede disky Nybegynder
07. maj 2003 - 23:01 #16
viht:
Du kan med fordel ændre lidt på dit eksempel.

Du gør:
ArrayList liste=new ArrayList();

Du kan med fordel bruge:
List liste=new ArrayList();

Det har den fordel at du ved parameteroverførsel skriver:

void minMetode(List liste)

istedet for

void minMetode(ArrayList liste)

Det vil sige for f.eks. at bruge en LinkedList retter du KUN:

List liste=new LinkedList();
Avatar billede arne_v Ekspert
07. maj 2003 - 23:07 #17
Godt råd hvis den var public.

Men som private betyder det ikke rigtigt noget.
Avatar billede disky Nybegynder
07. maj 2003 - 23:09 #18
Det er altid god kotume at gøre det på den måde.

Hvorfor kun gøre det når de er public ?

Selv hvis du bare har en get eller en set metode gavner det.
Avatar billede arne_v Ekspert
07. maj 2003 - 23:16 #19
Fordi formålet med den lille øvelse er at skille interfacet fra
implementationen, men når den er private så er den selv en del af
implementationen.

Om der er en:
  public List getData()
betyder ikke noget for om data skal erklæres til interface eller
implementation.

Hvis der er en:
  public void setData(List data)
så skal den selvfølgelig være List ellere compiler den ikke.
Avatar billede disky Nybegynder
08. maj 2003 - 09:25 #20
Ja men det ændrer ikke på man ligeså godt kan gøre det ordentligt fra starten
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