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 ()

?
4. W tym miejscu 
```java
setVisible(false);
//dispose();
}

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

0
bogdans napisał(a):
  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 ()

?
> 4. W tym miejscu 
```java
setVisible(false);
//dispose();
}

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

W main tylko wyświetlam tą klasę

/*
 * 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;

/**
 *
 * @author Marek
 */
public class Wypozyczalnia_filmow {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
     baza n= new baza();
     n.baza();
        
      // okno_glowne j= new okno_glowne();
       //j.okno_glowne();

       
    }
    
} 
Faktycznie można to zmienić na klasę public...</li> SetVisible false dlatego, że chcę żeby to okno było ukrywane po kliknięciu yes, gd użytkownik będzie chciał wyjść z programu, bo będę to chciał wykorzystać w innym oknie..</li> </ol>

Na tą chwilę największym problemem jest wczytanie tego modelu tabli z pliku do modelu tabeli w programie..

1

Jeszcze raz nie użyjesz znaczników <code class="java"></code> i wątek wyląduje w koszu.
Nie chodzi o zmianę klasy na publiczną, chodzi o zmianę metody public void baza(), na **konstruktor ** public baza().

try
{
     FileInputStream f = new FileInputStream("mojabazajestzapisana.txt");
     ObjectInputStream ob = new ObjectInputStream(f);
     model = (DefaultTableModel) ob.readObject();
     baza.setModel(model);
     model.fireTableDataChanged();                
}
 
catch(Exception y)
{
     JOptionPane.showMessageDialog(null,y.getMessage(),"Czytanie pliku "+"mojabazajestzapisana.txt",JOptionPane.INFORMATION_MESSAGE);
}

Nie mam jak sprawdzić - brakuje kodu pozwalającego dopisać film.
Powinieneś ten kod umieścić w innym miejscu, np. w konstruktorze. Umieszczeniu go w obsłudze przycisku Import spowoduje, że jeśli użytkownik wpierw dopisze filmy ręcznie, potem wykona import bazy, to dopisane uprzednio filmy znikną.

0

Działa, dziękuję

0

Jednak nadal pojawia się problem ...

W formularzu wychodzi tabela i zasłania wszystkie pola .. Poniżej screen:

<image>form.png</image>

 /*
 * 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 java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Marek
 */
//@SuppressWarnings("serial")
public class formularz_dodawania_filmow extends baza  {
    
    JButton dodajfilm,anuluj;
    JLabel ltytul, lnosnik,lkategoria,lrokpremiery,lczastrwania,lopis,lobsada,lrezyser,graf;
    JTextField ttytul,tczastrwania,topis,tobsada,trezyser;
    JComboBox kategorielista,nosnik,rokpremiery;
    String txtytul,txopis,txobsada,txrezyser;
       JCheckBox polecane;
    baza oknoBazy; 
   // public lista_filmow b = new l(1000); 
    //@SuppressWarnings("unchecked")
    public formularz_dodawania_filmow(baza oknoBazy)
    {
        this.oknoBazy = oknoBazy; 
        setTitle("Dodaj film");
        setTitle("Dodaj film");
        setSize(500,500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);
        lkategoria= new JLabel("Kategoria:");
        kategorielista= new JComboBox();
        kategorielista.setBounds(200,20,180,20);
        kategorielista.addItem("Wybierz kategorię filmu");
        kategorielista.addItem("Akcja");
        kategorielista.addItem("Dramat");
        kategorielista.addItem("Horror");
        kategorielista.addItem("Kryminał");
        kategorielista.addItem("Wojenny");
        kategorielista.addItem("Thriller");
        add(kategorielista);
        
         lnosnik= new JLabel("Rodzaj nośnika:");
        nosnik= new JComboBox();
        nosnik.setBounds(20,20,150,20);
        nosnik.addItem("Rodzaj nośnika");
        nosnik.addItem("CD");
        nosnik.addItem("DVD");
        nosnik.addItem("Blu-ray");
        add(nosnik);
        
        
        ltytul= new JLabel("Tytuł filmu:");
        ltytul.setBounds(20,40,170,40);
        add(ltytul);
        ttytul= new JTextField("");
        ttytul.setBounds(160,50,250,20);
        add(ttytul);
        
        txtytul=ttytul.getText();
        
        
        rokpremiery= new JComboBox();
        rokpremiery.setBounds(160,80,250,20);
        rokpremiery.addItem("Wybierz rok premiery");
        rokpremiery.addItem("2016");
        rokpremiery.addItem("2015");
        rokpremiery.addItem("2014");
        rokpremiery.addItem("2013");
        rokpremiery.addItem("2012");
        rokpremiery.addItem("2011");
        add(rokpremiery);
      
        
        lczastrwania= new JLabel("Długość trwania:");
        lczastrwania.setBounds(20,100,230,100);
        add(lczastrwania);
        tczastrwania= new JTextField("");
        tczastrwania.setBounds(160,140,250,20);
        add(tczastrwania);
        
        
        lrezyser= new JLabel("Reżyser:");
        lrezyser.setBounds(20,120,250,120);
        add(lrezyser);
        trezyser= new JTextField("");
        trezyser.setBounds(160,170,250,20);
        add( trezyser);
        
        
        
        lobsada= new JLabel("Obsada:");
        lobsada.setBounds(20,140,270,140);
        add(lobsada);
        tobsada= new JTextField("");
        tobsada.setBounds(160,200,250,100);
        add(tobsada);
        
        
             
        lopis= new JLabel("Opis fabuły:");
        lopis.setBounds(20,235,290,160);
        add(lopis);
        topis= new JTextField("",500);
        topis.setBounds(160,325,250,100);
        add(topis);
        setVisible(true);
      
        dodajfilm= new JButton("Dodaj film");
        dodajfilm.setBounds(160,435,100,20);        
        add(dodajfilm);
            dodajfilm.addActionListener(this);
            dodajfilm.setActionCommand("dodajfilm");
                //Definiowanie przycisku anuluj
        anuluj= new JButton("Anuluj");
        anuluj.setBounds(305,435,100,20);        
        add(anuluj);
        anuluj.addActionListener(this);
      
         txtytul=ttytul.getText();
          txrezyser=trezyser.getText();
       
          String h= ttytul.getText();

      
        
            
    }
  
@Override
public void actionPerformed(ActionEvent e) {
   
Object z=e.getSource();

       
       
 if(z==dodajfilm)
{       
       
        oknoBazy.model = (DefaultTableModel) oknoBazy.baza.getModel();
        /*oknoBazy.model.addRow(new Object[]{ttytul.getText().toString(),tczastrwania.getText().toString(),
        kategorielista.getSelectedItem().toString(),nosnik.getSelectedItem().toString(),rokpremiery.getSelectedItem().toString(),
        topis.getText().toString(),tobsada.getText().toString(),trezyser.getText().toString(),image});*/
        oknoBazy.model.addRow(new Object[]{ttytul.getText(),tczastrwania.getText()});
        
       oknoBazy.model.fireTableDataChanged();
        
        dispose();

 
}
       
else if (z==anuluj)
{
    
    dispose();
}
       
  
 }

       

  
        
}
    
    
    
    
   
    

1

Jeżeli skompiluje się kody, które zamieściłeś na forum (klasy baza i formularz_dodawania_filmow), to zjawiska zasłaniania formularza nie występuje. Wniosek, masz w domu inne kody.
Program działa błędnie (a niekiedy idiotycznie).
Po zamknięciu formularza dodawania filmów (kliknięcie w krzyżyk) program kończy działanie.
Po kliknięciu w przycisk Usuń program się sypie jeżeli żaden film nie jest zaznaczony.
Moim zdaniem, okno typu formularz_dodawania_filmow powinno być tworzone raz (w konstruktorze klasy baza) i nie wyświetlane od razu. Jeśli okno nazwiesz oknoDopisywania
A potem

 if(z == dodaj)
{
    oknoDopisywania.setVisible(true);
}

a w klasie formularz_dodawania_filmow

setVisible(false); //zamiast dispose);

W aktualnej wersji programu użytkownik może otworzyć i ze sto formularzy dopisywania. Jeśli omyłkowo jeden z formularzy zamknie, to straci dane wpisane w tym formularzu i we wszystkich pozostałych.

0

Już wszystko działa, temat do zamknięcia, dzięki

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