Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MySQL i JTable problem oko citanja

[es] :: Java :: MySQL i JTable problem oko citanja

[ Pregleda: 2432 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

gnenad

Član broj: 63702
Poruke: 5
*.3dnet.co.yu.



Profil

icon MySQL i JTable problem oko citanja15.07.2005. u 10:10 - pre 227 meseci
Pozdrav ...imam problem sa citanjem podataka iz baze, dakle ...kada unosim nove podatke u bazu dok ne resetujem program on nece da mi izbaci nove unete podatke ...i za sve uneto mora da ugasim i upalim program da bi refresh-ovao podatke ...sve se prikazuje u JTable.

Sa ovom klasom vadim podatke iz baze:
Code:

package poslodavac.izlaz;

import poslodavac.tabela.tabelaP;

import javax.swing.table.*;
import javax.swing.*;
import java.sql.*;

public class izlazP extends AbstractTableModel
{

    protected static int numRows = 0;
    static String[] names = {("Ime i Prezime"), ("Naziv Firme"), ("Home Page"), ("Email"), ("Telefon"), ("Sediste Firme"), ("Zanimanje"), ("Datum Upisa"), ("Napomena")};
    protected Object[][] data;
    static ResultSet rset;
    static Connection conn;
    static String jdbcURL = "jdbc:mysql://localhost/svrle";
    static String username = "root";
    static String password = "";

    public izlazP()
    {
        data = new Object[100][names.length];
        try
        {
            Class.forName("org.gjt.mm.mysql.Driver");
        }catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, "Driver for JDBC isn't found in it's directory! Check if you have installed the JDBC and MySQL!", "Driver not found!", JOptionPane.OK_OPTION);
            System.err.println("Ha, ha! Database error!");
            e.printStackTrace();
        }
        read();

    }

    public synchronized void read()
    {
        try
        {
            conn=DriverManager.getConnection(jdbcURL, username, password);
            Statement stat = conn.createStatement();
            rset = stat.executeQuery("SELECT * FROM poslodavac");

            while(rset.next())
            {
                data[numRows][0]=rset.getString(1);
                data[numRows][1]=rset.getString(2);
                data[numRows][2]=rset.getString(3);
                data[numRows][3]=rset.getString(4);
                data[numRows][4]=rset.getString(5);
                data[numRows][5]=rset.getString(6);
                data[numRows][6]=rset.getString(7);
                data[numRows][7]=rset.getString(8);
                data[numRows][8]=rset.getString(9);
                numRows++;

            }

            stat.close();
            conn.close();
        } catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Read table error!", JOptionPane.OK_OPTION);
            System.out.println("DBase error!");
            e.printStackTrace();
        }
        fireTableDataChanged();
    }

//    public synchronized void perdel(int[] arr)
//    {
//        for (int k=arr.length-1; k>=0; k--)
//        {
//            for(int j=arr[k]; j<numRows; j++)
//            {
//                for (int i=0; i<names.length; i++)
//                {
//                    data[j][i]=data[j+1][i];
//                }
//            }
//        }

//        numRows-=arr.length;
//        fireTableDataChanged();
//    }

    public synchronized String getColumnName(int column)
    {
        return names[column];
    }
    public int getColumnCount()
    {
        return names.length;
    }
    public synchronized int getRowCount()
    {
        return numRows;// = data.length;
    }
    public synchronized Object getValueAt(int row, int column)
    {
        return data[row][column];
    }
}



A ovo je tabela u koju se smestaju podaci

Code:

package poslodavac.tabela;


import poslodavac.izlaz.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.sql.SQLException;

public class tabelaP extends JFrame implements ActionListener
{

    JPanel Glavni = new JPanel(new BorderLayout());
    JPanel Dole = new JPanel(new FlowLayout());

    JButton del=new JButton("Obrisi");
    JButton find=new JButton("Nadji");
    JButton exit=new JButton("Izadji");

   public static JTextField pret=new JTextField("",7); //Ovde pocinje String koji koristim za pretragu


    static JTable Table = new JTable(new izlazP());

    JScrollPane scrollPane = new JScrollPane(Table);

    public tabelaP()
    {
        find.addActionListener(this);
        find.setActionCommand("find");
        del.addActionListener(this);
        del.setActionCommand("del");
        exit.addActionListener(this);
        exit.setActionCommand("exit");

        Table.setGridColor(Color.blue);
        Table.setAutoResizeMode(Table.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
        Table.setDragEnabled(true);
        Table.setSurrendersFocusOnKeystroke(true);
        Table.setFont(new Font("Times New Roman",Font.PLAIN,14));

         Dole.add(pret);
         Dole.add(find);
         Dole.add(del);
         Dole.add(exit);
                Glavni.add(Dole,BorderLayout.SOUTH);
                Glavni.add(scrollPane);
        setContentPane(Glavni);


     }
    public void pret()
    {

    }


    public void actionPerformed(ActionEvent ae)
    {

         if(ae.getActionCommand()=="find")
                {
//
                            JFrame Win = new tabelaS();
                            Win.setSize(430,400);//x,y
                            Win.setVisible(true);
                            Win.setLocation(75,80);
                    



         }
         if(ae.getActionCommand()=="del")
                {

                }
         if(ae.getActionCommand()=="exit")
                {
                               this.dispose();
                }
    }
}


Sa ovom funkcijom pokrecem iscitavanje iz baze:

Code:

if(ae.getActionCommand()=="pretP")
                      {
                            JFrame Win = new tabelaP();
                            Win.setSize(430,400);//x,y
                            Win.setVisible(true);
                            Win.setLocation(75,80);


napomena: Proveravao sam sa Front-om , program ubaci sve u bazu ali ima problema pri iscitavanju ...ali nisam siguran da li je do baze ili do AbstractTableModel

Svaka pomoc je dobrodosla ovaj problem me muci vec mesec dana

Unapred hvala
 
Odgovor na temu

me-tuzalem
mensur tuzalemovic
novi pazar

Član broj: 25730
Poruke: 116
*.pat-pool.bgd.sbb.co.yu.



Profil

icon Re: MySQL i JTable problem oko citanja15.07.2005. u 13:33 - pre 227 meseci
Problem je mnogo manji nego što sam u početku pomislio(mislim lako sam ga uočio, što ne znači da ga je lako otkloniti).
Pošto imaš

Code:
  static JTable Table = new JTable(new izlazP());

ti praktično tabeli poturaš instancu klase izlazP, a ona u svom konstruktoru pročita sve što imaš u bazi i ispiše.
Kasnije promene u sadržaju baze se nigde ne dodaju toj instanci klase izlazP, pa samim tim se tvoj TableModel ne ažurira.
Ti moraš u klasi izlazP da imaš metode kojima se podaci(Object[][] data) dopunjuju i okida fireTableDataChanged();
Da bi to postigao, moraš instancirati izlazP, i referencu na tu instancu čuvati, kako bi joj prosledio poruku o promeni sadržaja baze.
Sve skupa, koliko vidim moraš kod prilično reorganizovati. Razdvoj klase za učitavanje baze od TableModela.

PS. Poštuj Java konvencije o imenovanju(mala, velika slova). Ovako otežavaš čitanje ljudima od kojih tražiš pomoć.
 
Odgovor na temu

gnenad

Član broj: 63702
Poruke: 5
*.3dnet.co.yu.



Profil

icon Re: MySQL i JTable problem oko citanja27.07.2005. u 15:45 - pre 227 meseci
Evo pokusao sam ovako da sredim taj problem ...ali i ovde iskrslo par stvari :(

Ovo je TableModel ali mi nije jasno kako da mu poturim Object u kojem se nalaze podaci koje sam izvukao iz baze ?
Code:

package podaci;

import javax.swing.table.AbstractTableModel;
import java.sql.*;

public class MyTableModel extends AbstractTableModel
 {
    public MyTableModel()
    {

    }
    public String getColumnName(int col) {
        return citaj.names[col].toString();
    }
    public int getRowCount()
    {
    return citaj.data.length;
    }
    public int getColumnCount()
    {
     Settings | File Templates.
    }
    public Object getValueAt(int rowIndex, int columnIndex)
     {
    return citaj.data[rowIndex][columnIndex];
    }
    public void setValueAt(Object value, int row, int col) {
            citaj.data[row][col] = value;
            fireTableCellUpdated(row, col);
        }

}


Sa ovom klasom vadim podatke iz baze
Code:

package podaci;

import java.io.Serializable;
import java.sql.*;

public class citaj implements Serializable
{
    public static Object[][] data;
    public static int num = 0;
    public static final String[] names = {"Naziv proizvoda", "Proizvodjac", "Model", "Cena"};
     Statement stmt;
    String url = "jdbc:mysql://localhost/dw";

    public citaj()
    {
        try
         {

               Class.forName("com.mysql.jdbc.Driver");//.newInstance();
             System.out.println("Ucitan driver");
     
         }
        catch (ClassNotFoundException e)
                  {
                      System.out.println("Ne mogu da pronadjem Driver");
     
                  }
         try
                {
                    Connection con = DriverManager.getConnection(url, "root", "");
                    System.out.println("Ostvarena konekcija");

                     stmt = con.createStatement();
                    System.out.println("Kreiran Statement");
                    
            ResultSet rs = stmt.executeQuery("SELECT * FROM jedinicna");
             System.out.println("Izvrsen Statement - ResultSet");
                    while (rs.next())
                    {
                        System.out.println("Izvrsava se while petlja");
                                data[num][0]=rs.getString("nazivA");
                data[num][1]=rs.getString("proizvodjacA");
                data[num][2]=rs.getString("modelA");
                                data[num][3]=rs.getString("cenaA");
                num++;
                    }
                }
                catch (SQLException e)
                {
                   System.out.println("Ne mogu da ostvarim konekciju sa bazom"+e.getMessage());
                   System.out.println("SQLState: " + e.getSQLState());
                   System.out.println("VendorError: " + e.getErrorCode());
                 
                }
    }
}


Pretpostavljam da bi data[][] trebalo da procita table model i da ga ispise
Ali nikako ne mogu da ubacim data u TableModel

Da li mozda imas ideju kako to na neki drugi nacin moze da se uradi ?

 
Odgovor na temu

me-tuzalem
mensur tuzalemovic
novi pazar

Član broj: 25730
Poruke: 116
*.pat-pool.bgd.sbb.co.yu.



Profil

icon Re: MySQL i JTable problem oko citanja27.07.2005. u 19:05 - pre 227 meseci
Ovlaš sam pogledao novi kod, nadam se da mi nije promaklo nešto bitno.
Ovako, pokušao si da razdvojiš čitanje baze od TableModela i to je OK, samo se još malo mučiš. Jedan od načina je sledeći.
Kreiraš klasu, npr. Poslodavac koja ima atribute kao i polja u bazi, i odgovarajuće getter metode. Kreiraš klasu koja predstavlja kolekciju svih Poslodavac instanci, (može da poslući i običan java.util.Vector), Prilikom čitanja iz baze od svakog reda napraviš new Poslodavac(...), dodaš ga u kolekciju. Tu kolekciju iskoristiš kao argument za konstruktor tvog TableModela, npr:
Code:

public MyTableModel(Vector sviPoslodavci){
super();
.....
}

ostale metode koje moraš da imaš u TableModelu prilagodiš prema strukturi svoje kolekcije.
Ali to ne rešava onaj osnovni problem iz tvog prvog posta, a to je da se svako dodavanje zapisa u bazu vidi i u tabeli.
Prvo, da bi se to postiglo dodavanje zapisa u bazu se MORA obaviti samo kroz tvoju aplikaciju.
Tvoja klasa, metoda.... koja to radi mora da signalizira da se dodavanje zapisa dogodilo.
To se radi tako što ili primeniš šablončić po ugledu na Event model u javi (pročitaj malo o Eventima, EventListenerima ...) ili malo jednostavnije, tako što će tvoja klasa MyTableModel ili ona kolekcija od maloprei imati metodu koja će biti vidljiva metodi koja dodaje zapis u bazi.
Pa scenario može da ide otprilike ovako:
1. Metoda za dodavanje zapisa u bazu obavesti kolekciju da ima još jedan Poslodavac.
2. Kolekcija preuzma tu instancu klase Poslodavac, doda ga u Vector i obavesti MyTableModel da se dogodila promena.
3. MyTableModel u toj metodi okida fireTableDataChanged() (metoda nasleđena od AbstractTableModela ...
i ti vidiš u JTabeli promenu.
Ako ti ovo deluje komplikovano, probaj prvo da simuliraš celu priču, ali bez baze, ali na ovaj način.
A, ako ipak hoćeš da hvataš i promene u bazi koje su se dogodile izvana, moguće je da za pojedine baze postoji Java API koji to mogućuje, ali sumnjam(možda eventualno Hsqldb i sl. koje su razvijene u Javi).
Zaro bi mogao ili da imaš neki <Refresh. JBUtton koji bi aktivirao čitanje baze, ili neki Thread koji bi to radio u nekom vremenskom intervalu. Za sada ti ipak predlažem da tu varijantu isključiš, skoncentriši se samo na ta da je sve deo tvoje aplikacije.
Ako imaš pitanja pitaj, ali zbog GO očekuj sporiji odgovor.
 
Odgovor na temu

gnenad

Član broj: 63702
Poruke: 5
*.3dnet.co.yu.



Profil

icon Re: MySQL i JTable problem oko citanja01.08.2005. u 00:04 - pre 227 meseci
Evo napredujem polako :) ...sada sam izvukao iz baze koliko redova imam ali su svi NULL

Uklasi koja iscitava iz baze se nalazi while petlja
Code:

 while(rs.next())
        {
             SetGet my=new SetGet(rs);
            
        }



SetGet je klasa u kojoj mi se nalazi ime kolone
Code:

package podaci;

import java.sql.ResultSet;

public class SetGet
{
   public static String nazivA;

    public SetGet(ResultSet rs)
    {
                  System.out.println(nazivA);
    }

}


I kada pokrenem sve to on izbaco 10xNULL
kako da dobijem podatak iz baze ...i da li da radim sa kolekcijama ili da u klasu SetGet napravim onoliko stringova koliko imam kolona u bazi i to da bacim u tabelu ?
 
Odgovor na temu

gnenad

Član broj: 63702
Poruke: 5
*.3dnet.co.yu.



Profil

icon Re: MySQL i JTable problem oko citanja01.08.2005. u 00:32 - pre 227 meseci
Ubacio sam u klasu SetGet.java

Code:

package podaci;

import java.sql.ResultSet;
import java.sql.SQLException;

public class SetGet
{
   public static String nazivA;
    
    public SetGet(ResultSet rs)
    {
        try
        {
           rs.getString("nazivA");

        } catch (SQLException e)
        {
          System.out.println("problem u klasi SetGet sa rs-om!!!");  //To change body of catch statement use File | Settings | File Templates.
        }
         System.out.println("Klasa SetGet.java: "+nazivA);
    }


Isada mi izbacuje podatke koji se nalaze u bazi ...kako to da smestim u tabelu JTable prima Object ili Vector a ja imama string.

Pretpostavljam da treba da koristim AbstractTableModel ?
 
Odgovor na temu

[es] :: Java :: MySQL i JTable problem oko citanja

[ Pregleda: 2432 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.