zapis/odczyt jtable do/z pliku

0

Witam,

Chciałbym zapisać jtable do pliku txt bądź exceel a następnie ten plik wczytywać do jtable.. Poniżej zamieszczam kod mojej tabeli opartej na DefaultTablemodel...
Bardzo poszę o pomoc, szukam w necie czegoś na ten temat, męczę się z tym od kilku dni. Jednak nadal nie umiem rozwiązać tego problemu..

String kolumna[] = {"Tytuł","Czas trwania","aa"}; // tytuły olumn tabeli
//,"Kategoria","Nośnik","Rok premiery","Opis","Obsada","Reżyser","Grafika"
model = new DefaultTableModel(data, headers); //definiowanie modeu tabeli

baza = new JTable(model);
setLayout(new FlowLayout(FlowLayout.CENTER));
JScrollPane js = new JScrollPane(baza,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
js.setPreferredSize(new Dimension(800,800)); // rozmiar obszaru tabeli
baza.setAutoCreateRowSorter(true); 

Próbowałem zapisywać do pliku w ten sposób i zapisuje, ale nie potrafie tego wczytać do jtable:

  int odpowiedz = jFileChooser4.showSaveDialog(usun);
       if (odpowiedz == jFileChooser4.APPROVE_OPTION){ 
           File a = jFileChooser4.getSelectedFile();

            BufferedWriter w = new BufferedWriter( new FileWriter(a + ".txt"));

            for ( i = 0; i < baza.getRowCount(); i++) {
                for (int j = 0; j < baza.getColumnCount(); j++) {
                    w.write(" "+baza.getValueAt(i, j)); 
                    w.newLine();
                }     
            }
            w.close();
       }
           }
            catch (IOException exx){  
            exx.getMessage();      
    }                      
0

Może stwórz sobie klasę opisującą to co trzymasz w JTable, wrzuć te obiekty do jakiejś kolekcji i tą kolekcję zapisz do pliku.

ArrayList<TwojaKlasa> objects=new ArrayList();
objects.add(...)

FileOutputStream fout = new FileOutputStream(path);
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(objects);
oos.close(); 

Wtedy odczyt wygląda następująco:

FileInputStream streamIn = new FileInputStream(path);
ObjectInputStream objectinputstream = new ObjectInputStream(streamIn);
readTransactions = (ArrayList<TwojaKlasa>) objectinputstream.readObject();
objectinputstream.close(); 

Jak już odczytasz to w pętli sobie dodajesz te obiekty do JTable:

for(TwojaKlasa tk : obiekty) {
Object[] object={tk.getField1(), tk.getField2().....}
jtable.addRow(object)
} 
0

ale każdą kolumne zapisywać do oddzielnej arraylisty? czy wszustkie do jednej?

1

Pytałeś w tym wątku Zapis działania programu. Napisałem Ci żebyś zapisywał cały model (wszystkie dane) jako jeden obiekt i podałem kod. Odczytanie będzie wyglądało mniej więcej tak:

            try
            {
                FileInputStream f = new FileInputStream(nameOfFile);
                ObjectInputStream ob = new ObjectInputStream(f);
                model = (DefaultTableModel) ob.readObject();
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null,e.getMessage(),"Czytanie pliku "+nameOfFile,JOptionPane.INFORMATION_MESSAGE);
            }
0

Jeśli dobrze rozumiem to jeden rząd reprezentuje jeden obiekt. Więc będzie to jedna kolekcja zawierająca reprezentacje wszystkich rzędów

0

no tak tylko, że coś nie działało a poza tym nie wiem jak to potem wczytac do jtable i próbuje różnymi sposobami, ale dalej nic..
P.S Sorry za spam

0

Zapisuje do pliku model, ale nie chce wczytać.. Wpisuję taki kod:

   try
            {
                FileInputStream f = new FileInputStream("tescik.txt");
                ObjectInputStream ob = new ObjectInputStream(f);
                model = (DefaultTableModel) ob.readObject();
            }
            catch(Exception exx)
            {
                //JOptionPane.showMessageDialog(null,exx.getMessage(),"Czytanie pliku "+"tescik.txt",JOptionPane.INFORMATION_MESSAGE);
                System.out.println (""+exx);

            } 
1

Po pierwsze, co to znaczy nie chce wczytać?
Po drugie, musisz powiązać model z tabelą. Nie znam Twojego kodu i nie wiem jak powiązać.

0

@bogdans:

Po pierwsze, co to znaczy nie chce wczytać?
Po drugie, musisz powiązać model z tabelą. Nie znam Twojego kodu i nie wiem jak powiązać.

nie chce wczytać to znaczy, że po kliknięciu przycisku nic się nie dzieje

a to jest mój kod...

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package wypozyczalnia_filmow;

import javax.swing.*; import java.awt.*;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.*;
import static oracle.jrockit.jfr.JFR.get;

class baza extends JFrame implements ActionListener
{

JButton dodaj,usun,edytuj,impo,ekspo,wyszukaj;
JTable baza;
Object wiersz[][]; //objektreprezentujący wiersz tabeli
DefaultTableModel model;
JFileChooser jFileChooser4= new JFileChooser();
JFileChooser jFileChooser3= new JFileChooser();

public void baza ()
{
setTitle("Baza"); //tytuł okna

String kolumna[] = {"Tytuł","Czas trwania","aa"}; // tytuły olumn tabeli
//,"Kategoria","Nośnik","Rok premiery","Opis","Obsada","Reżyser","Grafika"
model = new DefaultTableModel(wiersz, kolumna); //definiowanie modeu tabeli

baza = new JTable(model);
setLayout(new FlowLayout(FlowLayout.CENTER));
JScrollPane js = new JScrollPane(baza,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
js.setPreferredSize(new Dimension(800,800)); // rozmiar obszaru tabeli

dodaj = new JButton("Dodaj");
usun = new JButton("Usuń");
edytuj=new JButton("Edytuj");
impo=new JButton("Importuj");
ekspo=new JButton("Eksportuj");
add(dodaj);
add(usun);
add(edytuj);
add(impo);
add(ekspo);
add(js);

dodaj.addActionListener(this);
usun.addActionListener(this);
impo.addActionListener(this);
ekspo.addActionListener(this);

baza.setAutoCreateRowSorter(true);

setSize(1000,1000);

WindowListener sluchacz = new Zamykanie();
addWindowListener(sluchacz);   

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);   
setVisible(true);

}

class Zamykanie extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
int answer = JOptionPane.showConfirmDialog(null, "Zamknąć program ?", "Tytuł", JOptionPane.YES_NO_OPTION);

if (answer == JOptionPane.YES_OPTION)
{
        try
            {
                FileOutputStream f = new FileOutputStream("tescik.txt");
                ObjectOutputStream str = new ObjectOutputStream(f);
                str.writeObject(baza.getModel());
                str.flush();
                f.close();
            }
            catch(IOException z)
            {
                JOptionPane.showMessageDialog(null,z.getMessage(),"Zapisywanie do pliku "+"tescik.txt",JOptionPane.INFORMATION_MESSAGE);
            }

setVisible(false);
//dispose();
} 
}   
}
File a;
@Override
public void actionPerformed(ActionEvent e) {

Object z=e.getSource();

 if(z==dodaj)
{
    formularz_dodawania_filmow y= new formularz_dodawania_filmow(baza.this);
}

else if(z==usun)
{
    model = (DefaultTableModel) baza.getModel();
    model.removeRow(baza.getSelectedRow());
}

else if(z==edytuj)
{

}

else if(z==ekspo)
{ 
    try
            {
                  //int i = 0;
                 //int odpowiedz = jFileChooser4.showSaveDialog(this);
                 //if (odpowiedz == jFileChooser4.APPROVE_OPTION){ 
                 //  a = jFileChooser4.getSelectedFile();
                FileOutputStream f = new FileOutputStream("mojabazajestzapisana.txt");
                ObjectOutputStream str = new ObjectOutputStream(f);
                str.writeObject(baza.getModel());
                str.flush();
                f.close();
            }

            catch(IOException zz)
            {  
                //JOptionPane.showMessageDialog(null,zz.getMessage(),"Zapisywanie do pliku "+a,JOptionPane.INFORMATION_MESSAGE);
              JOptionPane.showMessageDialog(rootPane, "zapis");}

}

 else if(z==impo)
{

    /*  try
            {
                int b = jFileChooser3.showOpenDialog(this);
                if (b == jFileChooser3.APPROVE_OPTION) {
                  a = jFileChooser3.getSelectedFile();
                FileInputStream f = new FileInputStream(a);
                ObjectInputStream ob = new ObjectInputStream(f);

                model = (DefaultTableModel) 
                ob.readObject();
            }

            }
            catch(Exception oo)
            {
          // JOptionPane.showMessageDialog(null,oo.getMessage(),"Czytanie pliku "+a ,JOptionPane.INFORMATION_MESSAGE);
            JOptionPane.showMessageDialog(rootPane, "odczyt");

            }

    model.fireTableDataChanged();

}   */

  try
            {
                  //int b = jFileChooser3.showOpenDialog(this);
           // if (b == jFileChooser3.APPROVE_OPTION) {
            //File a = jFileChooser3.getSelectedFile();
                FileInputStream f = new FileInputStream("mojabazajestzapisana.txt");
                ObjectInputStream ob = new ObjectInputStream(f);
                model = (DefaultTableModel) ob.readObject();
            }

            catch(Exception y)
            {
                JOptionPane.showMessageDialog(null,y.getMessage(),"Czytanie pliku "+"mojabazajestzapisana.txt",JOptionPane.INFORMATION_MESSAGE);
            }
}
}
} 
0
  1. Wstawiaj kod w znaczniki <code class="java"></code>.
  2. To nie jest cały kod, brakuje metody main.
  3. Dlaczego napisałeś metodę o dziwnej sygnaturze
    public void baza ()

    zamiast konstruktorapublic baza ()

    
    ?
W tym miejscu
setVisible(false);
//dispose();
}

celowo zamieniłeś dispose(); na setVisible(false);? setVisible(false); nie kończy programu.

</li> </ol>

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0