JTable a modyfikacja bazy danych

0

witam

Mam nastepujacy problem:
Modyfikuje baze danych dodajac nowy rekord. Tabele prubuje odswiezyc pobierajac rekordy z bazy danych i tworzac nowy model tabeli. Niestety ten sposob nie dziala i nie mam pojecia dlaczego :/

Okno programu sklada sie z 2 zakladek. Pierwsza sluzy do wprowadzania nowych rekordow do bazy danych, druga do prezentacji zawartosci tabeli. Sluchacz zdarzenia przypisany do obiektu JTabbedPane wykonuje metode aktualizujDane() kiedy uzytkownik zmieni zakladke.

Ponizej fragment kodu zrodlowego:

class PanelPrezentacji extends JPanel{
	
	public PanelPrezentacji( JTabbedPane zakladki){
		
		panel = zakladki;
		try{
		
			Connection con = DriverManager.getConnection("jdbc:mysql:///ksiegarnia", "marcin", "marcin");
			DatabaseMetaData meta = con.getMetaData();
			System.out.println(meta.supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY));
								
			Statement stat = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			rs = stat.executeQuery("SELECT * FROM ksiazka");
			
			model = new ResultSetTableDataBaseModel(rs);
			tabela = new JTable(model);
			JScrollPane jsp = new JScrollPane(tabela);
			add(jsp);
			
			//stat.executeQuery("SELECT * FROM ksiazka");
			//stat.close();
			//con.close();
		}
		catch(SQLException e){
			
		}
	}
	
	public void aktualizujDane(){
		
		// jesli baza danych nie obsluguje SCROLL_SENSITIVE
		try{
			Connection con1 = DriverManager.getConnection("jdbc:mysql:///ksiegarnia", "marcin", "marcin");
			Statement stat1 = con1.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			ResultSet rs1 = stat1.executeQuery("SELECT * FROM ksiazka");
			model = new ResultSetTableDataBaseModel(rs1);
			tabela = new JTable(model);
			System.out.println("odswiezanie");
			
			repaint();
			panel.repaint();
		}
		catch(SQLException e){
			
		}
	}
	
	private Connection con;
	private Statement stat;
	private ResultSet rs;
	private ResultSetTableDataBaseModel model;
	private JTable tabela;
	private JTabbedPane panel;
}

Jak widac prubowalem juz nawet odswiezac panel. Wczesniej staralem sie uzyc metody fireTableDataChanged() niestety bezowocnie dlatego postanowilem po prostu tworzyc nowe obiekty ale tez nie dziala.

0

dodam jeszcze kod modelu tabeli

class ResultSetTableDataBaseModel extends AbstractTableModel{
	
	public ResultSetTableDataBaseModel(ResultSet aResultSet){
		
		rs = aResultSet;
		
		try{
			rsmd = rs.getMetaData();
		}
		catch(SQLException e){
			e.printStackTrace();
		}
	}
	
	public String getColumnName(int c){
		
		try{
			return rsmd.getColumnName(c+1);
		}
		catch(SQLException e){
			e.printStackTrace();
			return "";
		}
	}
	
	public int getColumnCount(){
		
		try{
			return rsmd.getColumnCount();
		}
		catch(SQLException e){
			e.printStackTrace();
			return 0;
		}
	}
	
	public Object getValueAt(int r, int c){
		
		try{
			rs.absolute(r+1);
			return rs.getObject(c+1);
		}
		catch(SQLException e){
			e.printStackTrace();
			return null;
		}
	}
	
	public int getRowCount(){
	
		try{
			rs.last();
			return rs.getRow();
		}
		catch(SQLException e){
			e.printStackTrace();
			return 0;
		}
	}
	
	public boolean isCellEditable(int r, int c){
		return true;
	}
		
	private ResultSet rs;
	private ResultSetMetaData rsmd;
}
0

Pytanie może głupie, dane w bazie się zmieniają ? Jak wyjdziesz z programu i uruchomisz go na nowo, to widzisz zmiany ?

0

Tak :-) Testowalem to bo po prostu skonczyly mi sie pomysly dlaczego to nie chodzi.
Gdy za pomoca pierwszej zakladki dodam nowy rekord do bazy to w drugiej dane sie nie aktualizuja. Ale gdy uruchomie ponownie program to wtedy dane sa juz aktualne.

0
                        model = new ResultSetTableDataBaseModel(rs1); // co to jest za klasa 
                                                                                                // to nie jest chyba standard Javy
                        tabela = new JTable(model);
                        // ja bym nie tworzył nowej tabeli
                        tabela.setModel(model);
                        model.fireTableDataChanged();
                        System.out.println("odswiezanie"); // to się wykonuje ?
0

ResultSetTableDataBaseModel to moja klasa modelu ktora dziedziczy po AbstractModel - jej kod zrodlowy jest pokazany w mojej pierwszej odpowiedzi do posta.

nadal nie dziala

0

po wywaleniu tabela = new JTable(model); dziala

dzieki wielkie za pomoc :-)

Ps: skad pochodzi metoda setModel? nie natrafilem na nia w notkach API.

0

Z dokumentacji klasy JTable http://java.sun.com/javase/6/docs/api/

0

a jakie jest logiczne wytlumaczenie, ze wykonujac zapytanie do bazy ponownie, tworzac nowy model i wstawiajac go do tabeli i wywolujac repaint dane sie nie aktualizowaly?

nie moge za bardzo tego pojac.

0

A ja mogę, w obiekcie JScrollPane została stara tabela.
pozdrawiam

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