Avatar billede eremit Nybegynder
10. december 2002 - 17:09 Der 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?
Avatar billede cannes Nybegynder
10. december 2002 - 17:40 #1
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;

    Besked(String afsend, String tekst, Date dead, Date nu, String type, boolean sendt){
        beskedTekst = tekst;
        afsender = afsend;
        deadLine = dead;
        datoForBesked = nu;
        this.type=type;
        this.sendt = sendt;
    }

    String getAfsender(){
        return afsender;
    }

    String getBeskedTekst(){
        return beskedTekst;
    }

    Date getDeadLine(){
        return deadLine;
    }

    public String getType()
    {
        return type;
    }

    Date getDatoForBesked(){
        return datoForBesked;
    }

    public void setSendt (boolean b)
    {
        sendt = b;
    }

    public boolean getSendt ()
    {
        return sendt;
    }

    public Vector toVector ()
    {
        Vector ret = new Vector ();
        ret.add (datoForBesked.toString());
        ret.add (afsender);
        ret.add (type);
        ret.add (deadLine.toString());
        if (sendt)
        ret.add ("true");
        else
        ret.add ("false");
        ret.add (beskedTekst);
        return ret;
    }

    public String toString ()
    {
        String ret = afsender + " " + beskedTekst + " " + datoForBesked.toString() + " " + deadLine.toString() + " " + type + " " + sendt;
        return ret;
    }
}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;
import java.util.*;
import java.text.*;

class Inbox extends JFrame implements ActionListener, MouseListener
{
    public static int WIDTH = 800;
    public static int HEIGHT = 400;
    public static String TITLE = "Inbox";

    Send send;
    Profil profil;
    Besked besked;

    JMenuBar menuBar;
    JMenu fileMenu;
    JMenuItem exit;

    JButton ok = new JButton ("Ok");

    JPanel contentPanel = new JPanel();

    Vector overskrifter;

    Vector beskeder2 = new Vector();

    TableModel dataModel;
    JScrollPane scrollPane;
    JTable tableView;


    Inbox (Profil profil)
    {
        super(TITLE);
        this.profil = profil;
        buildGUI();
        setSize(WIDTH,HEIGHT);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        show();
    }

//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);
    }

    public void mousePressed (MouseEvent me)
    {

    }

    public void mouseClicked (MouseEvent me)
    {
        boolean sendt;
        int row = tableView.getSelectedRow();
        Vector temp = (Vector) beskeder2.elementAt(row);
        String beskedAfsender = (String) temp.elementAt(1);
        String beskedTeksten = (String) temp.elementAt(5);
        Date deadLine=null, sendtDato= null;
        DateFormat DF = DateFormat.getDateInstance();
        String deadLineString =  (String)temp.elementAt(3);
        String deadlineString = FormatDate.formatDate(deadLineString);
        String sendtDateString = FormatDate.formatDate((String)temp.elementAt(0));
        if (((String)temp.elementAt(4)).equals("true"))
        sendt = true;
        else
        sendt = false;
        try
        {
            deadLine = DF.parse(deadlineString);

        }
        catch (Exception e)
        {System.out.println ("Inde i catch");}
        try
        {
            sendtDato = DF.parse (sendtDateString);
        }
        catch (Exception e)
        {
            System.out.println("Inde i catch nummer 2");
        }
        String type = (String) temp.elementAt(2);
        besked = new Besked (beskedAfsender, beskedTeksten, deadLine, sendtDato, type, sendt);
        dispose();
        send = new Send (profil, besked);
    }

    public void mouseReleased (MouseEvent me)
    {

    }

    public void mouseEntered (MouseEvent me)
    {

    }

    public void mouseExited (MouseEvent me)
    {

    }

    protected void buildBeskedTable ()
    {
        overskrifter = new Vector();
        overskrifter.add("Date");
        overskrifter.add("Afsender");
        overskrifter.add("Type");
        overskrifter.add("Deadline");
        overskrifter.add("Sendt");

        Besked temp;
        try
        {
            for (Enumeration e = HovedProgram.beskeder.elements(); e.hasMoreElements();)
            {
                temp = (Besked) e.nextElement();
                beskeder2.add(temp.toVector());
            }
        }
        catch (NullPointerException e)
        {

        }

        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);
    }


    void buildGUI()
    {
        buildMenu();
        buildBeskedTable();
        setupButtons();
        setJMenuBar(menuBar);
    }

//placerer knapperne i framen
    void setupButtons()
    {
        contentPanel.setLayout (new AbsoluteLayout());

        addItem (ok, .4, .8, .2, .05);
        ok.addActionListener(this);

        scrollPane = new JScrollPane(tableView);
        scrollPane.setBorder(new BevelBorder(BevelBorder.LOWERED));
          scrollPane.setPreferredSize(new Dimension(430, 200));
        addItem (scrollPane, .05, .15, .9, .6);

        getContentPane().setLayout (new BorderLayout());
        getContentPane().add(contentPanel, BorderLayout.CENTER);
    }

//Håndterer tryk på diverse knapper
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == ok)
        {
            dispose();
        }
        if (e.getSource() == exit)
        {
            HovedProgram.writeProfiles(HovedProgram.profiler);
            HovedProgram.writeBeskeder(HovedProgram.beskeder);
            System.exit(0);
        }
    }
}
Avatar billede eremit Nybegynder
10. december 2002 - 18:14 #2
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?
Avatar billede cannes Nybegynder
10. december 2002 - 19:41 #3
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...
Avatar billede eremit Nybegynder
11. december 2002 - 14:41 #4
OK. Jeg prøver det. Tak for hjælpen.
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