Gå til innhold

JTable og database - oppdatere når databasen blir endret


Anbefalte innlegg

Hei,

Driver med et prosjekt hvor en bonde skal kunne legge inn sauer med id, alder, vekt, gård. Alle sauene i denne databasen skal vises til bonden i form av en tabell. Altså JTable.

 

 

Problemet mitt er at når jeg sender en query til databasen så vil ikke JTable oppdateres (jeg må restarte programmet for å se oppdateringen). Jeg prøver å finne diverse tutorials, men sliter med å se hvordan jeg skal implementere det i min kode. Håper noen av dere kanskje kunne gitt meg noen tips i riktig retning:-)

 

Bruker forøvrig NetBeans.

 

Kode for GUI: http://pastebin.com/M3T72YXx

Kode for databasen: http://pastebin.com/gtFWZ8kQ

 

(Beklager litt rotete kode, men har prøvd meg frem og tilbake med ulike måter.)

 

Hjertelig takk for all hjelp! :)

Lenke til kommentar
Videoannonse
Annonse

Hva er skjangsen for at du går Informatikk på NTNU og har en som heter Daniel i prosjektgruppa di? :wee:

 

Uansett, nå har jeg bare skumlest veldig kjapt gjennom koden, men jeg finner ikke noen kode for at JTable skal bli oppdatert? Og da er et jo egentlig ganske logisk at den heller ikke blir det.

 

JTable eksisterer helt fritt og er uavhengig av databasen, altså de er to egne komponenter som kan ha sin helt egen informasjon.

Om du skulle ønske det kan du legge til masse informasjon i tabellen, og noe helt annet i databasen uten at det skal ha noe å si for hvordan de kryssreferer, når du starter programmet på nytt blir JTable slettet og stilt til databasen uansett.

 

Hvis du vil at JTable skal oppdateres fortløpende under programmet må du lage en hjelpemetode som oppdaterer JTables innhold, og denne metoden må kjøres hver gang du utfører en SQL-setning med utføring av en slik art at dette skal vises til bruker via GUI.

 

Som sagt, jeg har bare skumlest kjapt, om du har en oppdatering fortell hvilke linjer de ligger på så ser jeg på det igjen.

 

EDIT: Jeg tror at du har skjønt at dette er problemet, men jeg må være sikker ;)

Endret av Persn
Lenke til kommentar

heyhey, skjer med stalking? neida:)

 

Det stemmer godt at det ikke er noe i koden som tilsier at JTable skal bli oppdatert, har egentlig prøvd diverse men har fjernet det etter at det ikke funket slik jeg ønsket.

 

Hvordan tenker du at jeg skal lage til det? Si at vi skal lage en server og da, hvordan skal en sa sjekke om databasen blir oppdatert når en SQL-setning medfører endring i databasen?

Lenke til kommentar

Skal på jobb i dag så har ikke direkte tid til å tenke på det, men når jeg løste et lignende problem på en oppgave så var tabellen min lagd ut i fra noe som heter AbstractTableModel http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html

 

Dvs at du lager en klasse ut i fra en AbstractTableModel hvor du har mulighet til å skreddersky tabellen akuratt slik du vil ha den, inkludert hvor tabellen skal hente kildeinformasjonen sin fra.

 

Å lage en slik tabell er egentlig litt overkill i forhold til hva dere behøver, men da får dere med en ferdiglagd metode som heter fireTableDataChanged(), som sjekker kildeinformasjonen og oppdaterer automatisk innholdet i JTable, jeg er litt usikker på hvordan det funker med databaser, men les litt på det og vurder selv.

 

Jeg kan se litt mer på det i uka når jeg ikke skal jobbe på kveldene. :)

  • Liker 1
Lenke til kommentar

Dreiv å leste litt java-API og testa meg ut selv, og det ser ut som du kan bruke fireTableDataChanged() i ett DefaultTableModel-objekt også gitt, siden DefaultTablabla arver metoden fra AbstractTableModel som jeg snakka om, forutsetningen er at du har satt databasen som kilde i konstruktøren, noe jeg mener du har gjort ut i fra koden din.

 

Hva om du prøver:

 

db.executeQuery(inputSQL.getText());
outputInput.setText(Integer.toString(db.getRows()));
tableTest.fireTableDataChanged();

 

 

Dette er linje 178osv, jeg regner med at det er her alle SQL-setninger skjer, hvis tableTest er satt opp sånn jeg er mener så skal den tredje linja i koden der kjøre en kode som går inn i konstruktøren til tableTest, sjekker referansen(e) og setter de nye endringene.

 

Si fra åssen det går. :)

Lenke til kommentar

Har laget GUI i NetBeans, da har de markert ut alt inni initComp..() som grått. Da greier ikke jeg å edite noe inni der, uten videre. Greier å edite litt kode inni tableView (men da får jeg kun lov å edite par linjer inna for tableView.)

 

Viss jeg legger tableView.fireTableDataChanged(); inn i knappen så oppdateres det ingenting i tabellen. Da kan jeg lige godt bruke "tableViewer.setModel(new javax.swing.table.DefaultTableModel(db.tablePrintOfDatabase(),db.getTableColumnNames()));" i knappen, da oppdateres table i det jeg sender en query.

Lenke til kommentar

Viss jeg legger tableView.fireTableDataChanged(); inn i knappen så oppdateres det ingenting i tabellen. Da kan jeg lige godt bruke "tableViewer.setModel(new javax.swing.table.DefaultTableModel(db.tablePrintOfDatabase(),db.getTableColumnNames()));" i knappen, da oppdateres table i det jeg sender en query.

 

Vi snakker om den samme tingen nå sånt? :p I følge koden din er tableView, den variabelen du snakker om en JTable, og den jeg snakker om, tableTest, en DefaultTableModel.

 

I ditt tilfelle kommer ikke tableView.fireTableDataChanged til å funke fordi det er en JTable, ett helt annet objekt med helt andre metoder.

 

Bruk fireTableDataChanged() på tableTest istedet. Ifølge koden blir tableView brukt bare som en kontainer så du trenger ikke å oppdatere den, men det som er inni den.

Lenke til kommentar

Ironisk nok, så funker fireTableDataChanged() slik at den sjekker etter endringer i tabellen, også overskriver hele skiten. Overskrivinga har du allerede funnet ut åssen du gjør så alt du mangler er sjekken, og da har du greit potensiale for å lage din egen fireTableDateChanged().

 

Jeg ville lagd en hjelpemetode som tar inn to lister, en med alle verdiene fra databasen og en med alle verdiene fra DefaultTableModel.

 

PSEUDO


public boolean sjekkTabs(ArrayList gui, ArrayList db){
if(gui.size() != db.size()){
Overskriv tabell
return true;
}
for(iterer gjennom db){
if(gui[i] != db[i}){
Overskriv tabell
return true;
}
}
return false;
}
[/CODe]

 

Første if-sjekken er for å spare mye arbeid, hvis størrelsene til listene er ulike er det garantert gjort endringer og da kan du bare oveskrive uten å måtte kjøre gjennom for-løkka.

Endret av Persn
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...