problem z setModel()

0

Witam wszystkich.

Próbowałem sam odnaleźć rozwiązanie swego problemu niestety bezskutecznie :(.

Mam utworzoną tabele korzystającą z własnego modelu (dziedziczącego z AbstractTableModel), tabela ta jest wykorzystywana następnie do wyświetlania danych z bazy danych.

class jakas
{
public JTable tabela = new JTable();


public jakas()
{...}



public void wyswietl_tabele()
{
//Zapytania itd

moj_model model = new moj_model(ResultSet wynik_zapytania, String[] naglowki_kolumn);

tabela.setModel(model);
tabela.setRowSorter(....



}//Dla tej metody wszystko działa



public void edytuj_SQL()
{
//wybieranie rekordu do edycji
//wykonywanie operacji SQL

tabela.setModel(model);

//wywołanie odświeżenia w tym momencie w celu wyświetlenia poprawnych wartości zmienionych nie działa :( , sprawdzałem czy rzeczywiście w bazie zmienia wartości i zmienia
mam również dostępną tabelę w tej metodzie

}


}

Gdy wywołuje setModel w metodzie która inicjuje po raz pierwszy tą tabele wszystko działa OK, w momencie gdy np wywołuje setModel w innej metodzie tej samej klasy nic się nie dzieje zero reakcji.

Skończyły mi się pomysły w związku z tym byłbym wdzięczny gdyby ktoś mi wskazał co może być nie tak

z góry dziękuje za pomoc

0

Dokładny kod źrodłowy tej klasy:

public class platnosci extends JInternalFrame implements ActionListener
{
	public platnosci()
	{
		super(tytul,
				false,
				false,
				false,
				false);
		setVisible(true);
		
		
		
		try
		{
			conn_pl = db.getConnection();
		}
		catch(Exception e)
		{
			
		}
	}
	
	
	public void wyswietl_pakiety_abonamentowe()
	{
		setTitle("Prezentacja pakietów abonamentowych");
		JComponent pow_zaw = (JComponent)getContentPane();
		
		GridBagLayout ukl_arkuszowy = new GridBagLayout();
		pow_zaw.setLayout(ukl_arkuszowy);
		GridBagConstraints wytyczne = new GridBagConstraints();
		
		
		pokaz_wszystkie_pakiety = "SELECT nazwa_pakietu,cena_abonamentu,predkosc FROM definicja_abonamentu";
		String[] nazwy_kolumn_pokaz_abonamenty = {"Nazwa pakietu","Cena pakietu [PLN]","Prędkość [Kb/s]"};
		
		//tabela_pakiety_abonamentowe = new JTable();
		
		przewijana_tabela_pakiety_abonamentowe = new JScrollPane(init_tabela(pokaz_wszystkie_pakiety,tabela_pakiety_abonamentowe,3,nazwy_kolumn_pokaz_abonamenty));
		
		System.out.println(tabela_pakiety_abonamentowe.getRowCount());
		sorter = new TableRowSorter(model_platnosci);
		tabela_pakiety_abonamentowe.setRowSorter(sorter);		
		System.out.println(tabela_pakiety_abonamentowe);
		
		tabela_pakiety_abonamentowe.addMouseListener(new MouseAdapter() 
	    {
			
	            	public void mouseClicked(MouseEvent e) 
	            	{
	            	//System.out.println(tabela.getSelectedRow());
	            		
	            	int wiersz = tabela_pakiety_abonamentowe.getSelectedRow();
	            	wybrane_z_tabeli_abonamenty = (String)tabela_pakiety_abonamentowe.getValueAt(wiersz,0).toString();
	            	        	      	
	            	
	            	int ilosc_klikniec = e.getClickCount();
	            	
	            	if(ilosc_klikniec == 2)
	            	{	
	            		
	            		//wykonaj_init();
	            		//System.out.println(wybrane_z_tabeli_abonamenty);
	            	new edycja_platnosci(wybrane_z_tabeli_abonamenty);
	            		
	            	}
	            	
	            	}
	            	
	     });
		
		
		
		
		
		p_wyszukiwanie_nazwa_pakietu.getDocument().addDocumentListener(new DocumentListener() 
		{
			
                    public void changedUpdate(DocumentEvent e) 
                    {
                    	Filtrowanie_wynikow_tabeli_platnosci(p_wyszukiwanie_nazwa_pakietu,0);
                    }
                    public void insertUpdate(DocumentEvent e) 
                    {
                    	Filtrowanie_wynikow_tabeli_platnosci(p_wyszukiwanie_nazwa_pakietu,0);
                    }
                    public void removeUpdate(DocumentEvent e) 
                    {
                    	Filtrowanie_wynikow_tabeli_platnosci(p_wyszukiwanie_nazwa_pakietu,0);
                    }
                    
                });
		
		przewijana_tabela_pakiety_abonamentowe.setPreferredSize(new Dimension(580, 210));
					
		Anuluj_wyszukiwanie_abonament.addActionListener(this);
				dodajKomponent(przewijana_tabela_pakiety_abonamentowe, wytyczne, 			1,1,10,10);
				wytyczne.anchor = GridBagConstraints.LINE_END;	
				wytyczne.insets = new Insets(5,0,0,0);
				dodajKomponent(e_wyszukiwania_nazwa_pakietu_tabela, wytyczne, 		1,25,1,1);
				dodajKomponent(p_wyszukiwanie_nazwa_pakietu, wytyczne, 		6,25,1,1);
				dodajKomponent(Anuluj_wyszukiwanie_abonament, wytyczne, 			10,25,1,1);
		
		reshape(200,115,600,300);
		
		
		//tabela1 = tabela_pakiety_abonamentowe;
		
	}
	
	public void wykonaj_init()
	{
		aa =  "SELECT nazwa_pakietu,cena_abonamentu,predkosc FROM definicja_abonamentu";
		
		String[] nazwy_kolumn_= {"Nazwa pakietu","Cena pakietu [PLN]","Prędkość [Kb/s]"};
		init_tabela(aa,tabela_pakiety_abonamentowe,3,nazwy_kolumn_);
	}

Metoda w której mialoby dzialac odświeżenie


public void edytuj_abonament_SQL()
	{
		
		System.out.println(tabela_pakiety_abonamentowe);
		
		String INDEX = null;
		
		try
		{
		String nie_duplikuj = "SELECT id_pakietu_abonamentu FROM definicja_abonamentu WHERE nazwa_pakietu= '"+pobrana_nazwa_pakietu_przed_edycja+"'";
		stat = conn_pl.createStatement();
		rs = stat.executeQuery(nie_duplikuj);
		
		while(rs.next())
		{
			INDEX = rs.getString(1);
			
		}
		
		String UPDATE_new_abonament= "UPDATE definicja_abonamentu SET nazwa_pakietu ='"+psr(p_nazwa_pakietu)+"',cena_abonamentu='"+psr(p_wysokosc_abonamentu)+"', predkosc='"+psr(p_szybkosc)+"', opis_pakietu='"+psr_JTextArea(p_uwagi)+"' WHERE id_pakietu_abonamentu="+INDEX+"";
		
		Statement go_Update = conn_pl.createStatement();
		
				if(go_Update.executeUpdate(UPDATE_new_abonament) > 0)
				{
					JOptionPane.showMessageDialog(null,"Pomyślnie zaktualizowane wybrany rekord", "INFORMACJA", JOptionPane.INFORMATION_MESSAGE);
			           		
            		doDefaultCloseAction();
            		
            		init_tabela(pokaz_wszystkie_pakiety,tabela_pakiety_abonamentowe,3,nazwy_kolumn_pokaz_abonamenty);
            		
				}
				else
					System.out.println("Nie powododzenie");
			
				
				pobrana_nazwa_pakietu_przed_edycja = null;
		}
		catch(Exception e) 
		    {
				 JOptionPane.showMessageDialog(null,"Wystąpił następujący błąd podczas wykonywania polecenia ***"+"\n\n" + e.getMessage() + "\n\n", "BŁĄD !", JOptionPane.ERROR_MESSAGE);
		    }	
		
		
	}
public JTable init_tabela(String zapytanie,JTable nazwa_tabeli,int liczba_komuln,String[] nazwy_kolumn_wyswietl_uzytkownikow)
	{
		try
		{
			Statement wykonaj_zapytanie_pl = conn_pl.createStatement();
			ResultSet zapytanie_odswiez_pl = wykonaj_zapytanie_pl.executeQuery(zapytanie);
			model_platnosci = new model_tabeli(zapytanie_odswiez_pl,nazwy_kolumn_wyswietl_uzytkownikow);
			
			nazwa_tabeli.setModel(model_platnosci);
			nazwa_tabeli.revalidate();
			nazwa_tabeli.repaint();
			nazwa_tabeli.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			nazwa_tabeli.setAutoCreateRowSorter(true);
			
			////////////////////ZMIANA ROZMIARU KOLUMN		//////////////////////////////////////////////
			TableColumn kolumna_rozmiar = null;
			for (int i = 0; i < liczba_komuln; i++) {
				kolumna_rozmiar = nazwa_tabeli.getColumnModel().getColumn(i);
			    if (i == 0) 
			    {
			    	kolumna_rozmiar.setPreferredWidth(280);
			    } 
			    else 
			    {
			    	kolumna_rozmiar.setPreferredWidth(100);
			    }
			}
			
		}
		catch(SQLException wyjatek)
		{
			//System.out.println(wyjatek.getMessage()+"zzz");
		}
	return nazwa_tabeli;
	}
public model_tabeli model;

public table tabela_pakiety_abonamentowe = new table();
public JScrollPane przewijana_tabela_pakiety_abonamentowe;
public String[] nazwy_kolumn_pokaz_abonamenty = {"Nazwa pakietu","Cena pakietu [PLN]","Prędkość [Kb/s]"};
public String[] nazwy_kolumn = {"Nazwa pakietu","Cena pakietu [PLN]","Prędkość [Kb/s]"};
public Connection conn_pl;
public Statement stat;
public ResultSet rs;

public model_tabeli model_platnosci;

public TableRowSorter sorter;
public String pokaz_wszystkie_pakiety;

public String pokaz_wszystkich;
0

ogólnie uaktualnienie JTable powinno wyglądać tak:

  1. pobranie nowych danych z bazy ( ja zawsze to robię pakując je do jakiejś Colection )
  2. zainicjowanie klasy modelu pobraną kolekcją i uaktualnienie tabeli:
    tabela.setModel(new MojModel(pobrana_kolekcja));
  3. tabela.repaint();

po takich zabiegach mam aktualne dane wyswietlone w tabelce

przyklad:

klasa modelu:

public class FilmyTableModel extends AbstractTableModel{
    private ArrayList<FilmyOUT> filmy;
    Field[] pola;
    String[]kolumny = {"Tytu³","Gatunek","Rok Produkcji"};
    Boolean flaga;
    /** Creates a new instance of FilmyTableModel */
    public FilmyTableModel() {
    }
    public FilmyTableModel(ArrayList<FilmyOUT> filmy) {
        super();
        this.filmy=filmy;
        //pola = FilmyOUT.class.getDeclaredFields();
       
    }

    public int getRowCount() {
        return filmy.size();
    }

    public int getColumnCount() {
        //return pola.length;
        return 3;
    }
public String getColumnName(int column){
    
    return kolumny[column];
}


    
    public Object getValueAt(int rowIndex, int columnIndex) {
        FilmyOUT film = (FilmyOUT)this.filmy.get(rowIndex);
        switch(columnIndex){
            case 0:
                return film.getTytul();
            case 1:
                return film.getGatunek();
            case 2:
                return film.getRok();
                           
        }
        return null;
    }
    
    public FilmyOUT getFilm(int index) {
                return (FilmyOUT) filmy.get(index);
        }
    
}

a samo uaktualnienie

ArrayList<FilmyOUT>filmy = pobierzFilmy();
jTable1.setModel(new FilmyTableModel(filmy));
jTable1.repaint();

gdzie pobierzFilmy() pobiera mi z bazy kolekcję filmów (po drodze zamieniam dane z bazy na obiekty DTO, ale to nie ma za bardzo znaczenia)
pzdr.

0

Dzięki za szybka odpowiedź.

Generalnie chodzi mi o coś innego impelmentacja modelu itd wszystko ok bo przy pierwszym wywołaniu metody która inicjuje tabele wszystko fajnie działa. Chodzi o to że gdy chcę wywołać gdzie indziej metode init_tabela() nic się nie dzieje, ale np gdy wywołam ją w trakcie zdarzenia obsługi myszki to odświeża i działa bez problemu tu jest problem co może byc nie tak że metoda nie działa wywołana w innych metodach poza metodą w której inicjuje tabele i wyświetlam po raz pierwszy.

Zadeklarowałem JTable globalnie jest widoczna w calej klasie sprawdziłem i zwraca w wszystkich metodach klasy obiekt tabeli ale nie działa yj nie odświeża :(

Czy ktoś spotkał się z czymś podobnym ?? Siedze juz nad tym kodem trochę i nie moge dojść dlaczego nie działa wywołana w innych metodach :(

0

wydaje sie wszystko ok...nie widze nic co by moglo to spowodowac zastanawia mnie czemu init_tabela zwraca JTable, skoro nie przypisujesz zwracanego wyniku do niczego...

nie do konca rozumieim po co jest ten kwalek kodu:

while(rs.next())
                {
                        INDEX = rs.getString(1);
                       
                }

zastosuj starą łopatologiczna metode "wklejam System.out'y gdzie tylko sie da" i wyłapiesz w ten sposób kiedy sterowanie przechodzi przez dane miejsca w kodzie a kiedy nie. wywal tez tego tabela.repaint() na sam koniec metody, poza blok try-catch

0

Wiem juz mniej więcej co jest przyczyną tego iż nie działa setModel().

  • tworze tabele na podstawie modelu której zawartością są rekordy bazy
  • w celu edycji zrobiłem cosik takiego że klika sie na dany wiersz tabeli i odpala się nowe okienko JInternalFrame w tym okienku pojawiają się wartości z wiersza żeby user mógł sobie je zmienić
    ale nowe okienko JInternalFrame tworzę poprzez utworzenie nowego obiektu tej samej klasy i wywołanie dla nieo dopiero metody która dodaje pola przyciski i wyświetla nowego JInternalFrame , wydaje mi się że tu twki problem ponieważ przycisk Uaktualnij ktory wywołuje meodę SQL która uaktualnia dane w bazie znajduje się na tym okienku (bedącym nowym obiektem tej samej klasy) i na końcu metody mam właśnie setModel który widzi tabele ale nie potrafi odświeżyć jej na JInternalFrame który wyświetla tabele

nie wiem jak rozwiązać ten problem i nie wiem dlaczego ten nowy JInternalFrame pomimo iz widzi tabele ponieważ jest zadeklarowana jako public nie może wykonac operacji na innym okienku wewnętrznym z tabelą :(

0
class edycja_platnosci
	{
		
		
	public edycja_platnosci(String wybrane_mycha)
		{
			platnosci ee = new platnosci();
			ee.edycja_abonament_(wybrane_mycha);
			 
			System.out.println(wybrane_z_tabeli_abonamenty);
			System.out.println(tabela_pakiety_abonamentowe);
			
			pobierz_desktop().add(ee);
		}
		
	}

to jest nowy obiekt którym sie posiłkuje do wyświetlenia okienka po dwukrotnym kliknięciu myszką na dany rekord wyświetlanej tabeli w celu edycji go

public void mouseClicked(MouseEvent e) 
	            	{
	            	
	            		
	            	int wiersz = tabela_pakiety_abonamentowe.getSelectedRow();
	            	wybrane_z_tabeli_abonamenty = (String)tabela_pakiety_abonamentowe.getValueAt(wiersz,0).toString();
	            	        	      	
	            	
	            	int ilosc_klikniec = e.getClickCount();
	            	
	            	if(ilosc_klikniec == 2)
	            	{	
	            		
	            		
	            	new edycja_platnosci(wybrane_z_tabeli_abonamenty);
	            		
	            	}
	            	
	            	}
0

aha, czyli jeżeli dobrze zrozumiałem masz 1 internalFame'a z tabelką, i 2go z jakimś formem do edycji, więc proponowałbym tak: samą edycję bazy 'zostawić' w tyn nowo_pojawiającym_się okienku, a odswieżanie samego JTable'a przenieść do tego tzw. głównego okna ( tego gdzie JTable sie de facto znajduje ). Miałem podobny problem i rozwiązałem go tak:

klasa OknoPrac extends JFrame - mam w niej JTabla i m.in JButton 'Edytuj Film'
jeśli wybiore z jTable'a jakiś film i kliknę żeczony jButton powołuję do życia obiekt klasy EdytujFilmOkno extends JFrame w którym mam pola edycji i guzik 'Zatwierdż'. chodziło o to, żeby po wyedytowaniu filmu wracać do OknoPrac. zrobiłem to w ten sposób, że przekazuję referencję OknoPrac do nowo tworzonego EdytujFilmOkno

public class OknoEdytyjFilm extends javax.swing.JFrame {
    private OknoPrac op;
    /** Creates new form OknoEdytyjFilm */
    public OknoDodajFilm(OknoPrac op) {
        initComponents();
        this.op=op;
    }

....
} 

czyli: klikam 'Edytuj Film' -> wywołuje mi się new EdytujFilmOkno(this), gdzie this jest referencją do mojego 'głównego' okna -> edytuję sobie film -> klikam zatwierdź -> wywołuje mi się jakaś tam metoda uaktualniająca bazę, a następnie

OknoEdytujFilm.this.hide();
op.przywrocOkno() 

gdzie przywrocOkno jest metodą z klasy OknoPrac, czyli mojego 'głównego okna' a wygląda ona tak:

 public void przywrocOkno(){
            ArrayList<FilmyOUT>filmy = pobierzFilmy();
            jTable1.setModel(new FilmyTableModel(filmy));
        
    OknoPrac.this.setEnabled(true);
    OknoPrac.this.show();
    
    }

i tyle mam uaktualnioną tabelkę, mam nadzieje że Ci to jakoś pomoże, ogólnie powinno się zastosować jakąś implementację wzorca mostu, ale mi się nie chciało ;-]

0

Ogromne dzięki :) właśnie o to mi chodziło naprawdę wielkie dzięki za pomoc

Będę musiał u siebie w kodzie pokombinować mam niestety zrobione tak że mam jedną klase dziedziczącą z JInternalFrame i jej konstruktor powoduje narysowanie nowego okna potem wywołuje tylko metodę która ustala tytul i rozmiar.

Dzięki za pomoc jeszcze raz już wiem jaką drogę musze obrać :)

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