29. juni 2005 - 21:01Der er
19 kommentarer og 1 løsning
Brug samme instans af klasse?
Godt man har eksperten, når Google ikke giver resultat :-)
Jeg har i mit databaseprogram en tråd, der løbende skulle gemme alle ændringer i sql databasen, men det gør den ikke. Jeg tror det skyldes følgende:
I en klasse kaldet DataBaseConnSetup opretter jeg databasen, query sets og har funktionen, der opretter forbindelse til databasen. Denne klasse opretter jeg to instanser af; første gang i metoden, der requester posterne i databasen, og anden gang i tråden, kaldet savingThread, der gemmer ændringer. Jeg finder det sandsynligt, at det ikke virker, fordi metoden og tråden ikke bruger samme instans af DataBaseConnSetup. Lyder det sansynligt, selvom jeg stadig ikke er nogen stor Java haj til at beskrive sådanne situationer? Hvordan kan problemet løses? Herunder ses DatabaseConnSetup og savingThread.
public class DatabaseConnSetup { Database database1 = new Database(); QueryDataSet queryDataSet1 = new QueryDataSet(); QueryDataSet queryDataSet2 = new QueryDataSet(); QueryDataSet queryDataSet3 = new QueryDataSet(); Statement stmt; Connection getConn; ConnectionDescriptor connDescrip;
Jo, det er jeg klar over. Den afvikles, hver gang focus fjernes fra tabel og combobokse. Jeg vil lige understrege, at der ikke kommer fejl, og at koden afvikles. Er problemet ikke, at det ikke er den samme instans af DatabaseConnSetup, der anvendes? I den sidste kode, som ikke er vist, opretter jeg instansen på samme på som i savingThread. Hvordan ellers vil I lave det? Evt. links til sider på nettet er ønskelige.
Det skulle ikke være fordi du ikke lave en execute(executeUpdate("bla")) når du skal gemme, altså at du bruge resultset(executeQuery("bla")) i begge tilfælde.
Her på denne side: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html, fandt jeg lidt inspiration til en ny måde at lave det på. Med den nye kode virker det ikke helt som om tråden kører som en tråd. Tag gerne et kig på den flg. kode, og råb op, hvis I finder fejl. Den kaldende kode ser nu sådan ud: public void focusLost(FocusEvent e) { savingThread sat = new savingThread(queryDataSet1, queryDataSet2); new Thread(sat).start(); }
og tråden: public class savingThread implements Runnable { QueryDataSet qdatas1; QueryDataSet qdatas2; DatabaseConnSetup dcs = new DatabaseConnSetup();
Jeg tvivler stadig på, at det er din tråd den er galt med. Hvad mener du med: "Med den nye kode virker det ikke helt som om tråden kører som en tråd" ?
Det er det samme du gør. Blot kodet lidt forskelligt.
Jeg overfører datasettene som argumenter til tråden. Det gjorde jeg ikke før. Jeg mener at programflowet afbrydes når tråden kører - ligesom hvis det var sekventielt. Det virker når tråden er i samme klasse som den kaldende kode.
Nu opgav jeg at bruge saveChanges, og valgte istedet at lave et SQL udtryk. Her ses et uddrag af udtrykket: Object FORNAVN = jdbTable2.getModel().getValueAt(jdbTable2.getSelectedRow(),1); dcs.stmt.executeUpdate("UPDATE TBL_SAM_ELEV SET FORNAVN = '"+FORNAVN+"')
I forlægelse af dette spørgsmål har jeg et andet lille spørgsmål. Når jeg i en jdbTable er færdig med at redigere en celle, skal jeg enten trykke på en ny celle, eller tykke på enter. Det er også fint nok, men bare ikke hvis man ikke husker at gøre det. Jeg kunne istedet godt tænke mig en metode i min fouceslistener, der gør det i stedet for, man selv selv skal afslutte redigeringen. Hvordan laver man det? Jeg har allerede set på de forskellige metoder, der hører til jdbTable, men har endnu ikke kunne finde noget brugbart. Jeg forestiller mig noget i retningen af: if (e.getSource() == jdbTable2) { if (jdbTable2.isEditing()) { //Et eller andet. } }
Og mht fokus, kan du så ikke bare give en anden komponent fokus? Selvom jeg ikke ser det som et problem, at man skal skifte celle eller trykke på enter. Sådan fungerer mange ting der bruger en tabel. I Excel skal man også trykke enter eller vælge en anden celle.
Jo, jeg har ikke fået where med i uddraget, men jeg har det i koden :-) Poblemet, hvis brugeren af programmet glemmer at trykke på enter, er at de sidste ændringer ikke bliver gemt. Hvis jeg selv skal bruge programmet - ja, så er jeg enig med dig mikkelbm. Måske skal jeg lave det sådan, at alt andet i programmet, såsom combobox'e og tekstbokse er disablet indtil bruger afslutter redigeringen korrekt med enter....
Hvis du har en knap, du vil bruge når du gemmer, kan du gøre følgende:
JButton save = new JButton ("Gem"); save.addActionListener( new ActionListener() { public void actionPerformed (ActionEvent e) { DefaultCellEditor editor = (DefaultCellEditor)table.getCellEditor(); if (editor != null) editor.stopCellEditing();
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.