» »

[java] Jtable swing - dinamično spreminjanje podatkov o in v tabeli v swing

[java] Jtable swing - dinamično spreminjanje podatkov o in v tabeli v swing

NSA Agent ::

Kako bi jaz spreminjal podatke o in v tabeli potem ko sem že generiral tabelo?
V swt gre to takole
	public void PrikaziTabelo(String imetabele, Table tabela,String TipBaze, String IP,String Port,String Username,String Geslo,String Baza) throws Exception
	{

		Baza bazaTest = new Baza(TipBaze); 
	    bazaTest.Povezi(IP ,Port ,Username ,Geslo , Baza ); 
	    if(bazaTest.PovezavaNull())
	    {
	    	throw new Exception("Ni povezan s strežnikom");
	    }
	    ResultSet rezultat = null;
		// ustvari stolpce
	    int stevilo_stolpcev = 0;
	    TableColumn stolpec = null;
	    //najprej pobrišemo stare colume iz tabele če slučajno obstajajo
	    for(int i=0;i<tabela.getColumns().length;)
	    {
	    	tabela.getColumn(0).dispose();
	    }
	    for(int i=0;i<tabela.getItems().length;)
	    {
	    	tabela.getItem(i).dispose();
	    }
	    //nato dodamo nove colume v tabelo
	    rezultat = bazaTest.IzvediPovpraševanje("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = '"+imetabele+"'");
		while (rezultat.next()) 
		{
			stolpec = new TableColumn(tabela, 0);
		    stolpec.setText(rezultat.getString(1)); 
		    stolpec.pack ();
		    stevilo_stolpcev++;
		}
	    // na koncu pa še vnesemo podatke v tabelo
		try 
		{
			if(TipBaze.equalsIgnoreCase("MySQL"))
		    {
		    	rezultat = bazaTest.IzvediPovpraševanje("SELECT * FROM "+Baza+"."+imetabele+";");
		    }
		    if(TipBaze.equalsIgnoreCase("MSSQL"))
		    {
		    	rezultat = bazaTest.IzvediPovpraševanje("SELECT * FROM "+Baza+".."+imetabele+";");
		    }
		    if(TipBaze.equalsIgnoreCase("JDBC4"))
		    {
		    	// če si ustvaril tabelo kot CREATE TABLE "Student" moraš vedno unorabit " če ne pa ni treba neka PostgreSQL posebnost
		    	try
		    	{
		    		rezultat = bazaTest.IzvediPovpraševanje("SELECT * FROM \""+imetabele+"\";");
		    	}
		    	catch (Exception e1)
		    	{
		    		rezultat = bazaTest.IzvediPovpraševanje("SELECT * FROM "+imetabele+";");
		    	}
		    }
			TableItem item = null;
			int i=0,max=0;
			String temp ="";
			while (rezultat.next()&& max < 30) 
			{
				i=1;
			    max++;
			    item = new TableItem (tabela, 0);
			    while(i<stevilo_stolpcev+1)
			    {
			    	temp = rezultat.getString(i);
			    	if (temp == null)
			    	{
			    		temp = "";
			    	}
			    	item.setText(i-1,temp);
				    i++;
			    }
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		bazaTest.Zapri();
	}


Sam to ne dela v swing. pa me zanima kako bi isto naredil v swing.
Ta funkcija se kliče vsakič ko uporabnik spremeni izbrano vrednost v Combo (ComboBox). V comboBox-u so napisana imena tabel v podatkovni bazi, uporabnik izbere tabelo in nato se vsebina SQL tabele naloži v JTable tabelo.

Če tabelo ustvarim s pomočjo dveh vektorjev je takšna tabela fixsna. Nemoreš spreminjat stolpcev, vrstice lahko dodajaš ne pa brišeš.
Če ustvariš kot DefaultTableModel maš več svobode ampak so problemi s imeni stolpcev.(nevem kako bi jim spremenil imena)
lahko pa tut ustvariš kot TableModel in ColumnModel...

V večini primerov imam problem s sihronizacijo ... to mislim tako, da ko prvič izberem tabelo iz ComboBox se tabela pravilno izriše. Če pa nato izberem drugo tabelo iz ComboBox pa stara tabela ostane. Se ne prikaže nova tabela s novimi podatki.

NSA Agent ::

update
ustvarim tabelo takole
final DefaultTableModel podatkiIzvor = new DefaultTableModel();
		
		tableIzvor = new JTable(podatkiIzvor);

		
		JScrollPane xxx = new JScrollPane(tableIzvor);
		xxx.setBounds(10, 70, 475, 130);
		panel_3.add(xxx);

kličem funkcijo
test.PrikaziTabelo(test.IzbranaTabela(comboBoxIZVOR),bazaT, tableIzvor , podatkiIzvor);

funkcija
public void PrikaziTabelo(String imetabele,Baza bazaTest, JTable table, DefaultTableModel podatki) throws Exception
	{
	    if(bazaTest.PovezavaNull())
	    {
	    	throw new Exception("Ni povezan s strežnikom");
	    }
	    // odstranim vrstice
	    try
	    {
	    	for(int k=0;k<podatki.getRowCount();)
	    	{
	    		podatki.removeRow(0);
	    	}
	    	for(int k=0;k<table.getColumnCount();)
	    	{
	    		table.removeColumn( table.getColumn( table.getColumnName(0))  );
	    	}
	    }
	    catch (Exception e2)
	    {
	    	e2.printStackTrace();
	    }
	    ResultSet rezultat = null;
		// ustvari stolpce
	    int stevilo_stolpcev = 0;
	    rezultat = bazaTest.IzvediPovpraševanje("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = '"+imetabele+"'");
	    while (rezultat.next()) 
		{
	    	podatki.addColumn(rezultat.getString(1));
	    	stevilo_stolpcev++;
		}
		try 
		{
			if(bazaTest.tipBaze().equalsIgnoreCase("MySQL"))
		    {
		    	rezultat = bazaTest.IzvediPovpraševanje("SELECT * FROM "+bazaTest.getBaza()+"."+imetabele+";");
		    }
		    if(bazaTest.tipBaze().equalsIgnoreCase("MSSQL"))
		    {
		    	rezultat = bazaTest.IzvediPovpraševanje("SELECT * FROM "+bazaTest.getBaza()+".."+imetabele+";");
		    }
		    if(bazaTest.tipBaze().equalsIgnoreCase("JDBC4"))
		    {
		    	// če si ustvaril tabelo kot CREATE TABLE "Student" moraš vedno unorabit " če ne pa ni treba neka PostgreSQL posebnost
		    	try
		    	{
		    		rezultat = bazaTest.IzvediPovpraševanje("SELECT * FROM \""+imetabele+"\";");
		    	}
		    	catch (Exception e1)
		    	{
		    		rezultat = bazaTest.IzvediPovpraševanje("SELECT * FROM "+imetabele+";");
		    	}
		    }
			int i=0,max=0;
			String temp ="";
			// vnos podatkov v vrstice
			while (rezultat.next()&& max < 30) 
			{
				i=1;
			    max++;
			    Vector vrstica = new Vector();
			    while(i<stevilo_stolpcev+1)
			    {
			    	temp = rezultat.getString(i);
			    	if (temp == null)
			    	{
			    		temp = "";
			    	}
			    	vrstica.addElement(temp);
				    i++;
			    }
			    podatki.addRow(vrstica);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		bazaTest.Zapri();
	}


vse dela ok ko se funkcija prvič kliče.
ko jo pa drugič kliče pa stari columni delajo probleme.
Neznam jih izbrisat, ali vsaj če bi jih lahko prepisu ali dodajal na začetek ne pa da se novi columni dodajajo na konec.

for(int k=0;k<table.getColumnCount();)
	    	{
	    		table.removeColumn( table.getColumn( table.getColumnName(0))  );
	    	}
/* to je brez pomena ker jaz sem columne dodaju v podatki in ne v table torej jih moram odstranit iz
 podatki ampak podatki nimajo metode getColum ai kaj takega.
*/

če kdo ve kako bi v DefaultTableModel izbrisal columne ali jih prepisal naj mi javi.

p.s. JScrollPane dela ok vertiklno (gor dol) sam horizentalno(levo desno) pa ne. Zaradi tega so columni bol ozki.

NSA Agent ::

Problem s columni sem rešu s tem.
Vector stolpci = new Vector();
while (rezultat.next()) 
{
  stolpci.add(rezultat.getString(1));
  stevilo_stolpcev++;
}
podatki.setColumnIdentifiers(stolpci);


zdaj sam še moram pogruntat kok se naredi levo/desno JScrollBar v JScrollPane.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[JAVA] Izpis imen vseh datotek iz direktorija in poddirektorijev

Oddelek: Programiranje
214931 (2960) Slovenet
»

C# težava

Oddelek: Programiranje
233728 (2574) mladec
»

[Java] Urejanje baze z JTable

Oddelek: Programiranje
81015 (799) vonNeumann
»

c# - mssql kombinacija / problem pri zapisu row-a v bazo

Oddelek: Programiranje
121601 (1410) darkolord
»

problem v C#

Oddelek: Programiranje
211971 (1686) dvojka

Več podobnih tem