łączenie modelu bazy z zapisanym plikiem?

0

Witam,

Chcę zrobić odczyt modelu bazy z pliku w oddzielnej klasie, ale model bazy nie jest wtedy wyłapywany, kiedy mam kod odczyu w tej samej klasie co model tabeli jest ok, ale kiedy chce zrobić w innej klasie pokazuje, że plik jest pusty.. Próbowałem to zrobić poprzez dziedziczenie.. Może ma ktoś jakiś pomysł? Poniżej 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 java.io.FileInputStream;
import java.io.ObjectInputStream;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Marek
 */
public class wczytywanie_przy_otwieraniu extends baza {
       
public wczytywanie_przy_otwieraniu()
{   
    try
{

FileInputStream h = new FileInputStream("bazapozamknieciu.txt");
ObjectInputStream obe = new ObjectInputStream(h);
super.model = (DefaultTableModel) obe.readObject();
super.baza.setModel(super.model);
super.model.fireTableDataChanged();   
}
catch(Exception exx)
{
JOptionPane.showMessageDialog(null,exx.getMessage(),"Czytanie pliku "+"bazapozamknieciu.txt",JOptionPane.INFORMATION_MESSAGE);


}    
    
    
    
    
}
    
}
 
0

ref

0

Po pierwsze, dziedziczenie

public class wczytywanie_przy_otwieraniu extends baza

jest bez sensu.
Po drugie, działa.

0

nie działa, bo jak wywołam tą klasę w innej klasie to wyrzuca mi to zamiast wczytać plik:

catch(Exception exx)
{
JOptionPane.showMessageDialog(null,exx.getMessage(),"Czytanie pliku "+"bazapozamknieciu.txt",JOptionPane.INFORMATION_MESSAGE);
 
 
}     

i nie mogę dojśc do tego dlaczego tak się dzieje

0

Może nie ma pliku bazapozamknieciu.txt, Twój ostatni program pisał do pliku mojabazajestzapisana.txt.

0

Jest, bo sprawdzałem to w pierwszej kolejności

0

Ok, napisałem

Po pierwsze, dziedziczenie

public class wczytywanie_przy_otwieraniu extends baza

jest bez sensu.

Zmieniłem zdanie, to dziedziczenie jest idiotyczne i zupełnie bez sensu.
W czasie czytania tworzysz obiekt klasy wczytywanie_przy_otwieraniu i w nim zmieniasz model. Oryginalnego obiektu klasy baza (tego który wyświetlasz) nie aktualizujesz.
U mnie działa, bo ja rozpocząłem od usunięcia tego głupiego dziedziczenia.

0

w takim razie czym zastąpiłeś dziedziczenie? bo szczerze mówiąc to nie wiem jak to zrobić nie używając dziedziczenia

0

Piszesz program, który zdecydowanie przekracza Twoje aktualne umiejętności.
Przekazałem referencję.
W klasie baza

new wczytywanie_przy_otwieraniu(this);


import java.io.FileInputStream;
import java.io.ObjectInputStream;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

public class wczytywanie_przy_otwieraniu
{
    baza mainWindow = null;    
 
    public wczytywanie_przy_otwieraniu(baza mainWindow)
    {   
        this.mainWindow = mainWindow;
        try
        {
            FileInputStream h = new FileInputStream("mojabazajestzapisana.txt");
            ObjectInputStream obe = new ObjectInputStream(h);
            mainWindow.baza.setModel((DefaultTableModel) obe.readObject());
            mainWindow.model.fireTableDataChanged();
            h.close();
        }
        catch(Exception ex)
        {
            JOptionPane.showMessageDialog(null,ex.getMessage(),"Czytanie pliku "+"mojabazajestzapisana.txt",JOptionPane.INFORMATION_MESSAGE);
        }    
    }
}
0

@bogdans
Masz rację, ale muszę to skończyć i zal ten przedmiot...

 mainWindow.baza.setModel((DefaultTableModel) obe.readObject());
            mainWindow.model.fireTableDataChanged(); 

coś jest nie tak, bo w tych dwóch linijkach podkreśla mi baza i model na czerwono i jest napisane, że nie ma takich zmiennych a są

0

ref

0

A jaki te zmienne mają modyfikator dostępu? Jeśli protected, to po usunięciu dziedziczenia nie masz do nich dostępu, jeśli private, to i tak nie masz do nich dostępu. Ustaw na public, albo lepiej napisz do nich gettery i settery. Pokaż klasę baza.

0

Tutaj jest klasa baza zapis/odczyt jtable do/z pliku

0

Nieprawda, miałeś w klasie baza dopisać wiersz

new wczytywanie_przy_otwieraniu(this);

W kodzie, do którego podałeś link, tego wiersza nie ma.
Jeżeli dopisałeś wiersz w klasie Wypozyczalnia, to powinien on wyglądać nieco inaczej:

public class Wypozyczalnia
{
    public static void main(String[] args) 
    {
        baza n = new baza();
        n.baza();
        new wczytywanie_przy_otwieraniu(n); 
    } 
}
0
/*
 * 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.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;



class baza extends JFrame implements ActionListener
{
   
File a;
JButton dodaj,usun,edytuj,impo,ekspo,wyszukaj;
JTable baza;
Object wiersz[][]; //objektreprezentujący wiersz tabeli
DefaultTableModel model;
JFileChooser chooserzapis= new JFileChooser();
JFileChooser chooserodczyt= new JFileChooser();


  
public   baza()
{//new wczytywanie_przy_otwieraniu(this);
     new wczytywanie_przy_otwieraniu(this);

setTitle("Baza"); //tytuł okna
String kolumna[] = {"Tytuł","Czas trwania","Kategoria","Nośnik","Rok premiery","Opis","Obsada","Reżyser"}; // tytuły kolumn tabeli
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(700,700)); // rozmiar obszaru tabeli





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

add(dodaj);
add(usun);
add(edytuj);
add(impo);
add(ekspo);
add(wyszukaj);
add(js);

dodaj.addActionListener(this);
usun.addActionListener(this);
impo.addActionListener(this);
ekspo.addActionListener(this);
baza.setAutoCreateRowSorter(true);


setSize(1000,1000);
setVisible(true);
wczytywanieprzyotwieraniu();
WindowListener sluchacz = new Zamykanie();
addWindowListener(sluchacz);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);      
}

// Zamykanie okna
class Zamykanie extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
int answer = JOptionPane.showConfirmDialog(null, "Czy na pewno chcesz zamknąć program", "Koniec", JOptionPane.YES_NO_OPTION);
if (answer == JOptionPane.YES_OPTION)
{
 try
{
FileOutputStream f = new FileOutputStream("as.txt");
ObjectOutputStream str = new ObjectOutputStream(f);
str.writeObject(baza.getModel());
str.flush();
f.close();
}
catch(IOException exx)
{
JOptionPane.showMessageDialog(null,exx.getMessage(),"Zapisywanie do pliku "+"as.txt",JOptionPane.INFORMATION_MESSAGE);
}
 dispose();
}   
}
}
//Wczytywanie danych z pliku przy otwieraniu programu
public void wczytywanieprzyotwieraniu()
{
try
{
     FileInputStream f = new FileInputStream("as.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);
}
}


@Override
public void actionPerformed(ActionEvent e) {

Object z=e.getSource(); // Stworzenie obiektu, który jest źródłem sygnału

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

//Zapis tabeli do pliku
 else if(z==impo)
{ 
 try
{
                
int i = 0;
int odpowiedz = chooserzapis.showSaveDialog(this);
if (odpowiedz == chooserzapis.APPROVE_OPTION){ 
File a = chooserzapis.getSelectedFile();
FileOutputStream f = new FileOutputStream(a+ ".txt");
ObjectOutputStream str = new ObjectOutputStream(f);
str.writeObject(baza.getModel());
str.flush();
f.close();
}
}
catch(IOException zz)
{
JOptionPane.showMessageDialog(rootPane, "Zapis");
}  
}

 
//Wczytanie modelu tabeli z pliku  
else if(z==ekspo)
{ 
    
try
{
int b = chooserodczyt.showOpenDialog(this);
if (b == chooserodczyt.APPROVE_OPTION) {
a = chooserodczyt.getSelectedFile();
FileInputStream f = new FileInputStream(a);
ObjectInputStream ob = new ObjectInputStream(f);
model = (DefaultTableModel) ob.readObject();
baza.setModel(model);
model.fireTableDataChanged();   
}
}

catch(Exception ex)
{
JOptionPane.showMessageDialog(null,ex.getMessage(),"Czytanie pliku "+a,JOptionPane.INFORMATION_MESSAGE);


}  

}
}
}



 

Mam tą linijkę w klasie baza i nadal to samo

0

Czy zdarza Ci się pomyśleć podczas programowania?

new wczytywanie_przy_otwieraniu(this); //W TYM MOMENCIE NIE ISTNIEJE ANI MODEL, ANI TABELA, są tworzone trzy wiersze później
setTitle("Baza"); //tytuł okna
String kolumna[] = {"Tytuł","Czas trwania","Kategoria","Nośnik","Rok premiery","Opis","Obsada","Reżyser"}; // tytuły kolumn tabeli
model = new DefaultTableModel(wiersz, kolumna);
baza = new JTable(model);
0

To nic nie zmienia, nadal to samo

0

Nie napisałeś co zmieniłeś, zatem zdanie

To nic nie zmienia
nie przekazuje żadnej informacji. Zupełnie nie panujesz nad programem, zmiany wprowadzasz losowo. Jeśli chcesz pomocy, to udostępnij aktualne wersje klas baza, wczytywanie_przy_otwieraniu i Wypozyczalnia.

0

Klasa WCZYTYWANIE_PRZY_OTWIERANIU

  
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
 
public class wczytywanie_przy_otwieraniu
{
    baza mainWindow = null;    
 
    public wczytywanie_przy_otwieraniu(baza mainWindow)
    {   
        this.mainWindow = mainWindow;
        try
        {
            FileInputStream h = new FileInputStream("mojabazajestzapisana.txt");
            ObjectInputStream obe = new ObjectInputStream(h);
            mainWindow.baza.setModel((DefaultTableModel) obe.readObject());
            mainWindow.model.fireTableDataChanged();
            h.close();
        }
        catch(Exception ex)
        {
            JOptionPane.showMessageDialog(null,ex.getMessage(),"Czytanie pliku "+"mojabazajestzapisana.txt",JOptionPane.INFORMATION_MESSAGE);
        }    
    }
}

KLASA BAZA:

/*
 * 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.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;



class baza extends JFrame implements ActionListener
{
   
File a;
JButton dodaj,usun,edytuj,impo,ekspo,wyszukaj;
JTable baza;
Object wiersz[][]; //objektreprezentujący wiersz tabeli
DefaultTableModel model;
JFileChooser chooserzapis= new JFileChooser();
JFileChooser chooserodczyt= new JFileChooser();


  
public void  baza()
{//new wczytywanie_przy_otwieraniu(this);
    
setTitle("Baza"); //tytuł okna
String kolumna[] = {"Tytuł","Czas trwania","Kategoria","Nośnik","Rok premiery","Opis","Obsada","Reżyser"}; // tytuły kolumn tabeli
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(700,700)); // rozmiar obszaru tabeli




new wczytywanie_przy_otwieraniu(this);
dodaj = new JButton("Dodaj");
usun = new JButton("Usuń");
edytuj=new JButton("Edytuj");
impo=new JButton("Importuj");
ekspo=new JButton("Eksportuj");
wyszukaj=new JButton("Wyszukaj");

add(dodaj);
add(usun);
add(edytuj);
add(impo);
add(ekspo);
add(wyszukaj);
add(js);

dodaj.addActionListener(this);
usun.addActionListener(this);
impo.addActionListener(this);
ekspo.addActionListener(this);
baza.setAutoCreateRowSorter(true);


setSize(1000,1000);
setVisible(true);
wczytywanieprzyotwieraniu();
WindowListener sluchacz = new Zamykanie();
addWindowListener(sluchacz);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);      
}

// Zamykanie okna
class Zamykanie extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
int answer = JOptionPane.showConfirmDialog(null, "Czy na pewno chcesz zamknąć program", "Koniec", JOptionPane.YES_NO_OPTION);
if (answer == JOptionPane.YES_OPTION)
{
 try
{
FileOutputStream f = new FileOutputStream("as.txt");
ObjectOutputStream str = new ObjectOutputStream(f);
str.writeObject(baza.getModel());
str.flush();
f.close();
}
catch(IOException exx)
{
JOptionPane.showMessageDialog(null,exx.getMessage(),"Zapisywanie do pliku "+"as.txt",JOptionPane.INFORMATION_MESSAGE);
}
 dispose();
}   
}
}
//Wczytywanie danych z pliku przy otwieraniu programu
public void wczytywanieprzyotwieraniu()
{
try
{
     FileInputStream f = new FileInputStream("as.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);
}
}


@Override
public void actionPerformed(ActionEvent e) {

Object z=e.getSource(); // Stworzenie obiektu, który jest źródłem sygnału

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

//Zapis tabeli do pliku
 else if(z==impo)
{ 
 try
{
                
int i = 0;
int odpowiedz = chooserzapis.showSaveDialog(this);
if (odpowiedz == chooserzapis.APPROVE_OPTION){ 
File a = chooserzapis.getSelectedFile();
FileOutputStream f = new FileOutputStream(a+ ".txt");
ObjectOutputStream str = new ObjectOutputStream(f);
str.writeObject(baza.getModel());
str.flush();
f.close();
}
}
catch(IOException zz)
{
JOptionPane.showMessageDialog(rootPane, "Zapis");
}  
}

 
//Wczytanie modelu tabeli z pliku  
else if(z==ekspo)
{ 
    
try
{
int b = chooserodczyt.showOpenDialog(this);
if (b == chooserodczyt.APPROVE_OPTION) {
a = chooserodczyt.getSelectedFile();
FileInputStream f = new FileInputStream(a);
ObjectInputStream ob = new ObjectInputStream(f);
model = (DefaultTableModel) ob.readObject();
baza.setModel(model);
model.fireTableDataChanged();   
}
}

catch(Exception ex)
{
JOptionPane.showMessageDialog(null,ex.getMessage(),"Czytanie pliku "+a,JOptionPane.INFORMATION_MESSAGE);


}  

}
}




 

new wczytywanie_przy_otwieraniu(this);// linijka jest wrzucona po utworzeniu modelu i tabeli, więc wszystko powinno być w porządku, bo kod obejmuje swoim zasięgiem tabele i model.

0

ref

0

W klasie wczytywanie_przy_otwieraniu brakuje

package wypozyczalnia_filmow;

Ja tego wiersza nie napisałem, u mnie wszystkie klasy (Wypozyczalnia, baza i formularz... były w pakiecie domyślnym i ten wiersz był zbyteczny, a nawet błędny.

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