10. december 2002 - 17:09Der er
3 kommentarer og 1 løsning
Gemme data fra JTable i array
Hjæælp! Jeg har et JTable, som man skal kunne skrive en masse data i. Hvordan skal man så arrangere det, så man kan gemme disse data i noget der ligner et array? Jeg har selv forestillet mig, at hvert felt i mit JTable bliver gemt i en plads i arrayet. Men hvordan?? Noget med en while-løkke måske?
Jeg ville foreslå at du bruger Vector istedet for array sammen med dit JTable. Vector er meget nemmere at håndtere Her er en del kode hvor jeg har brugt Vector du skal nok bruge lidt tid til at sætte dig ind i det, men når du har sat dig ind i det vil du blive glad for at kunne bruge det i al fremtid :) Den første klasse (Besked) er bare for at du kan se hvad det er for nogle objekter jeg propper ind i vectoren. Det er først i klassen Inbox der virkelig sker noget Meget af det er standard kode til at opbygge et JTable Du skal fokusere på metoden: buildBeskedTable () Her bliver der oprettet et AbstractTableModel og i denne er der foruddefineret nogle metoder some skal være tilstede, dem skal man så bare udfylde med sine egne data. Læg da mærke til hvor nemt det er bare at give den en vector med overskrifterne (overskrifter) og en vector med data (beskeder2) Så finder den selv ud af resten. MouseListeneren er der så rækkerne i dit JTable fungerer som links!
De filer du får her kan ikke umiddelbart køres da de er en del af et større program, men det skulle ikke være det store problem at modificere dem så de kan køres for sig
import java.io.*; import java.util.*;
class Besked implements Serializable{
String beskedTekst, afsender, type; Date deadLine, datoForBesked; boolean sendt;
class Inbox extends JFrame implements ActionListener, MouseListener { public static int WIDTH = 800; public static int HEIGHT = 400; public static String TITLE = "Inbox";
//metode til at sætte componenter ind i contentpanelet public void addItem (Container item, double x, double y, double w, double h) { contentPanel.add (item, new AbsoluteConstraints ((int)(x*WIDTH), (int)(y*HEIGHT), (int)(w*WIDTH), (int)(h*HEIGHT))); }
private void buildMenu() { menuBar = new JMenuBar(); fileMenu = new JMenu("File"); menuBar.add(fileMenu); exit = new JMenuItem("Exit"); exit.addActionListener(this); fileMenu.add(exit); }
dataModel = new AbstractTableModel() { public int getColumnCount() { return overskrifter.size(); } public int getRowCount() { return beskeder2.size();} public Object getValueAt(int row, int col) { return ((Vector)beskeder2.elementAt(row)).elementAt(col); } public String getColumnName(int column) {return (String)overskrifter.get(column);} public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) {return true;} public void setValueAt(Object aValue, int row, int column) { //beskeder[row][column] = aValue; } }; tableView = new JTable(dataModel); tableView.addMouseListener(this); }
Jeg tvivler ikke på, at løsningen er bedre, men umiddelbart ser den noget pebret ud. Er det helt umuligt med et array, eller kan det gøres med noget lidt simplere?
Du skal ikke lade dig overvælde af al den kode, langt det meste er kode der sikkert ikke direkte har relevans for dig. Det du bare skal gøre er mere eller mindre copy-paste metoden: buildBeskedTable () oprette en toVector metode i klassen for de objekter som du gerne vil proppe ind i dit JTable. I løsningen her er beskederne proppet ind i en static HashTable som bliver hentet ud i disse linier: try { for (Enumeration e = HovedProgram.beskeder.elements(); e.hasMoreElements();) { temp = (Besked) e.nextElement(); beskeder2.add(temp.toVector()); } } catch (NullPointerException e) {
} Det er egentligt kun disse linier der er svaret på dit spørgsmål. Resten er bare hjælpe kode. Jeg syntes bare jeg ville give dig det i en ordentlig sammenhæng. Prøv at kigge på det en gang til. Hvis der er konkrete ting du ikke forstår, så besvarer jeg gerne spørgsmål til det...
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.