Forum » Programiranje » [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
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.
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
kličem funkcijo
funkcija
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.
č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.
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.
zdaj sam še moram pogruntat kok se naredi levo/desno JScrollBar v JScrollPane.
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [JAVA] Izpis imen vseh datotek iz direktorija in poddirektorijevOddelek: Programiranje | 4931 (2960) | Slovenet |
» | C# težavaOddelek: Programiranje | 3728 (2574) | mladec |
» | [Java] Urejanje baze z JTableOddelek: Programiranje | 1015 (799) | vonNeumann |
» | c# - mssql kombinacija / problem pri zapisu row-a v bazoOddelek: Programiranje | 1601 (1410) | darkolord |
» | problem v C#Oddelek: Programiranje | 1971 (1686) | dvojka |