Tylko ostatni wiersz - JTable

0

Witam,
Jestem początkującym w tej dziedzinie...Szukałem na forum, ale nie znalazłem rozwiązania tego problemu...
Otóż gdy próbuje zczytać dane z bazy MySql do JTabel, pokazuje mi zawsze tylko ostatni wiersz,
a wiem, że w tabeli jest ich wiecej. Gdy wyszukuje w bazie, to pokazuje mi wszytkie rekordy, natomiast gdy chce to wrzucić do JTable, to po tej operacji, w JTable pokazuje mi się ostatni wiersz tylko. Liczę na wyrozumiałość, bo odp na to pytanie pewnie jest prosta, jednak mi nic do głowy nie przychodzi [glowa] :)
Załączam najważniejsze części kodu:

static JTable table(){
		
		String [] nazwyKolumn = {"id","gatunek","waga","długość","przyn_rodz",
				"przyn_opis","łowiska","data"};
		
Object [][]dane = {{value1,value2,value3,value4,value5,value6,value7,value8}};
				
	
		JTable tabelka = new JTable(dane, nazwyKolumn);
		
		return tabelka;
		}

następnie odczyt rekordów z bazy

static void SelectData(){
		
		String select = "SELECT * FROM spinning";
		
		try{
			stmt = conn.createStatement();
			ResultSet result = stmt.executeQuery(select);
			while(result.next()){
				value1 = result.getString("id");
				System.out.print(value1+"\n");
				value2 = result.getString("gatunek");
				System.out.print(value2+"\n");
				value3 = result.getString("waga");
				System.out.print(value3+"\n");
				value4 = result.getString("dlugosc");
				System.out.print(value4+"\n");
				value5 = result.getString("przyneta_rod");
				System.out.print(value5+"\n");
				value6 = result.getString("przyneta_opis");
				System.out.print(value6+"\n");
				value7 = result.getString("lowiski");
				System.out.print(value7+"\n");
				value8 = result.getString("data");
				System.out.print(value8+"\n");
				
				
				
			}
		}catch(Exception e){
			System.err.print("Pobranie danych z bazy nie powiodło się.");
		}
		
			}

i wyświetlenie tabeli:

static void GUI(){
		
		JFrame mainWindow = new JFrame("Database");
		
		JScrollPane scrollPane = new JScrollPane(table());
	
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(1,0));
		
		polatekstowe[0] = new JTextField();
		polatekstowe[1] = new JTextField();
		polatekstowe[2] = new JTextField();
		polatekstowe[3] = new JTextField();
		polatekstowe[4] = new JTextField();
		polatekstowe[5] = new JTextField();
		polatekstowe[6] = new JTextField();
		polatekstowe[7] = new JTextField();
		
	
		panel.add(polatekstowe[0]);
		panel.add(polatekstowe[1]);
		panel.add(polatekstowe[2]);
		panel.add(polatekstowe[3]);
		panel.add(polatekstowe[4]);
		panel.add(polatekstowe[5]);
		panel.add(polatekstowe[6]);
		panel.add(polatekstowe[7]);
		
		guzik.setBackground(Color.black);
		new Ryby(guzik);
		mainWindow.pack();
		mainWindow.getContentPane().add(BorderLayout.SOUTH,panel);
		mainWindow.getContentPane().add(BorderLayout.CENTER,guzik);
		mainWindow.getContentPane().add(BorderLayout.NORTH,scrollPane);
		mainWindow.setSize(1285, 505);
		mainWindow.setVisible(true);
		mainWindow.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
0

No super, tylko w którym miejscu SelectData() dodaje coś do tabeli?

0

W pierwszej funkcji zwracającej jako wynik tabelę.j.w.,załączam kod jeszcze raz:
value1,value2,...to sa wartosci pobrane z bazy danych z funkcji SelectData();

static JTable table(){
                
                String [] nazwyKolumn = {"id","gatunek","waga","długość","przyn_rodz",
                                "przyn_opis","łowiska","data"};
                
Object [][]dane = {{value1,value2,value3,value4,value5,value6,value7,value8}};
                                
        
                JTable tabelka = new JTable(dane, nazwyKolumn);
                
                return tabelka;
                }
0

Ty się dziwisz czemu wyświetla tylko ostatni rekord. Ja bym się dziwił gdyby wyświetlały się inne rekordy. Przecież zmienne value1,..,value8 mają zawsze wartości z ostatniego odczytanego rekordu.
pozdrawiam

0

Tylko, że jak odczytuje te wartości w funkcj SelectData(), to pokazuje mi wszystkie rekordy, dlatego myślełem, że jak te wartości przekaże do tablicy obiektów dla JTable, to również wyświetli wszystkie rekordy [???] . Wybaczcie za te laickie pytania, czyli muszę tablicę obiektów dla JTable, tworzyć za każym razem nową, czy pobierać to jakoś w pętli - tylko nie wiem jak :(. Pozdrawiam

0

Jedno z możliwych rozwiązań:

  1. Zdefiniuj (jeżeli jeszcze tego nie zrobiłeś) klasę Ryba z polami id,gatunek,... i konstruktorem
Ryba (String id,String gatunek,...)
{
   this.id=id;
  ....
}
  1. Utwórz zmienną (kolekcję) do przechowywania informacji odczytanych z bazy
  Vector<Ryba> rybki=new Vector<Ryba>(); 
  1. W pętli czytającej dane dodaj
  rybki.add(new Ryba(value1,...));
  1. Utwórz klasę
public class RybyModel extends AbstractTableModel
{
     ...
     private String [] nazwyKolumn = {"id","gatunek","waga","długość","przyn_rodz",
                                "przyn_opis","łowiska","data"};
     private Vector<Ryba> dane;
     ...
     public void setDane(Vector<Ryba> dane)
     {
         this.dane=dane;
         .....
     }
     .....
     public Object getValueAt(int wiersz,int kolumna)
     {
         Ryba r=dane.get(wiersz);
         switch(kolumna)
         {
             case 0:
                 return r.id;
                 //lub (jeśli pole jest private)
                 return r.getId();
             ....
         }  
     }
}
  1. W metodzie Gui() zrób tak:
    ....
    AbstractTableModel model=new RybyModel();
    JTable table=new JTable(model);
    JScrollPane scrollpanel=new JScrollPane(table); 
  1. Na zakończenie metody SelectData() wywołaj
   model.setDane(rybki);

pozdrawiam

0

Wybaczcie za upierdliwość :), ale dalej nie działa. @bogdans zrobiłem tak jak mówiłeś, tzn (tak mi się wydaje) i mam problem w miejscu wstawienia danych: model.setDane(rybki) w klasie Ryby();. Możesz zerknąć co zrobiłem nie tak? Pozdrawiam i ponownie liczę na wyrozumiałość :)

Klasa RybyModel

mport java.util.Vector;

import javax.swing.table.AbstractTableModel;

import com.sun.org.apache.bcel.internal.generic.RETURN;

public class RybyModel extends AbstractTableModel{

private String [] nazwyKolumn = {"id","gatunek","waga","długość","przyn_rodz",
            "przyn_opis","łowiska","data"};

private Vector<Ryba> dane;

	public void setDane(Vector<Ryba> dane){
		this.dane=dane;
	}
	
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 0;
	}

	public int getRowCount() {
		// TODO Auto-generated method stub
		return 0;
	}

	public Object getValueAt(int wiersz, int kolumna) {
		// TODO Auto-generated method stub
		Ryba r = dane.get(wiersz);
		
		switch(kolumna){
		case 0:
			return r.id;
		case 1:
			return r.gatunek;
		case 2:
			return r.waga;
		case 3:
			return r.dlugosc;
		case 4:
			return r.przyn_rodz;
		case 5:
			return r.przyn_opis;
		case 6:
			return r.lowisko;
		case 7:
			return r.data;
			
		}
		return null;
	}

}

GUI() w klasie Ryby();

static void GUI(){
	
	JFrame mainWindow = new JFrame("Database");
	AbstractTableModel model = new RybyModel();
	JTable table = new JTable(model);
	JScrollPane scrollPane = new JScrollPane(table);
	
	JPanel panel = new JPanel();
	panel.setLayout(new GridLayout(1,0));
	polatekstowe[0] = new JTextField();
	...
	polatekstowe[7] = new JTextField();
	
	panel.add(polatekstowe[0]);
	...
	panel.add(polatekstowe[7]);
	
	mainWindow.pack();
	mainWindow.getContentPane().add(BorderLayout.SOUTH,panel);
	mainWindow.getContentPane().add(BorderLayout.NORTH,scrollPane);
	mainWindow.setSize(1285, 505);
	mainWindow.setVisible(true);
	mainWindow.setDefaultCloseOperation(EXIT_ON_CLOSE);

}

SelectData() w klasie Ryby():

static void SelectData(){
	
	String select = "SELECT * FROM spinning";
	
	try{
		stmt = conn.createStatement();
		ResultSet result = stmt.executeQuery(select);
		while(result.next()){
			value1 = result.getString("id");
			value2 = result.getString("gatunek");
			value3 = result.getString("waga");
			value4 = result.getString("dlugosc");
			value5 = result.getString("przyneta_rod");
			value6 = result.getString("przyneta_opis");
			value7 = result.getString("lowiski");
			value8 = result.getString("data");
			
			rybki.add(new Ryba(value1,value2,value3,value4,value5,value6,value7,value8));
			model.setDane(rybki);//i właśnie w tym miejscu Eclipse podświetla mi,że "The method setDane(Vector<Ryba>) is undefined for the type AbstractTableModel";
		}
	}catch(Exception e){
		System.err.print("Pobranie danych z bazy nie powiodło się.");
	}
	
		}
0

mea culpa

static void GUI(){       
        JFrame mainWindow = new JFrame("Database");
        RybyModel model = new RybyModel();
        .....

powodzenia

0

zmień też dwie wygenerowane metody:

        public int getColumnCount() {
               
                return nazwy_kolumn.length;
        }

        public int getRowCount() {
                return dane.size();
        }
0

Teraz rzeczywiście program się kompiluje i uruchamia bez tego błędu, jednak jak pojawia się okno, to nie widać tabeli, a tymbardziej wyniku wyszukiwania :(

0

Napisałem prostą klasę testową (z innym modelem) i wszystko działa:

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

public class C
{
    static private JTextField polatekstowe[]=new JTextField[8];
    //----------------------
    public static void main(String[] args)
    {
        gui();
    }
    //------------------------
    static void gui()
    {
        JFrame mainWindow = new JFrame("Database");
        String[][] dane=new String[10][2];
        for (int i=0;i<10;i++)
            for (int j=0;j<2;j++)
                dane[i][j]="i = "+i+"  j = "+j;
        String[] kolumny={"Pierwsza","Druga"};
        JTable table=new JTable(dane,kolumny);
        JScrollPane sp=new JScrollPane(table);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1,0));
        //po to - między innymi - zostały stworzone pętle
        for(int i=0;i<8;i++)
        {
            polatekstowe[i]=new JTextField();
            panel.add(polatekstowe[i]);
        }
        // na wszelki wypadek, żeby mieć pewność jaki jest menadżer rozkładu
        mainWindow.setLayout(new BorderLayout());
        mainWindow.add(BorderLayout.SOUTH,panel);
        mainWindow.add(BorderLayout.NORTH,sp);
        // pack() dopiero po dodaniu wszystkich elementów, pack() i setSize() nie pasują do siebie
        // pack() żąda dopasowania wielkości okna do jego zawartości 
        mainWindow.pack();
        mainWindow.setVisible(true);
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
0

Rzeczywiście poprzedni przykład działał,nie naniosłem zmian, które jeszcze nie pojawiły się na forum jak pisałem odpowiedź. Wielkie dzięki :).
Powiedz mi jeszcze tylko dlaczego nie podaje nazw kolumn z tego co jest w tablicy NazwyKolumn, tylko podaje jako te nazwy "A" , "B", itd...?

0

O nazwach kolumn decyduje metoda getColumnName(...) w modelu
Dodaj do klasy RybyModel tę metodę:

    public String getColumnName(int kolumna)
    {
    	return nazwyKolumn[kolumna];
    }
0

Wielkie dzięki @bogdans za cierpliwość i wyrozumiałość oraz za odpowiednie podejście do tematu :-). Pisałeś wcześniej, że to jest jedna z możliwości rozwiązania tego problemu, a jakie są jeszcze inne. Jak możesz to napisz chociaż ogólnie :)
Pozdrawiam i jeszcze raz dzięki

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