Unlimited LTD Skrevet 11. november 2009 Del Skrevet 11. november 2009 Jeg har et program, gui, som tar input fra brukeren og samler inn data fra nettet. Jeg sender en referanse til JProgressBar-en min og setter den til forskjellige verdier ettersom prosessen jobber videre. Men når jeg kaller prosessen fryser hele GUI'et. Har prøvd med EventQueue, i håp om at det løste problemet, men til ingen nytte. private void search() { setEnabled(false); EventQueue.invokeLater(new Runnable() { public void run() { Main m = new Main(); m.Search(jtfSearch.getText(), Integer.parseInt(jtfPages.getText()), jpbProgress); } }); setEnabled(true); } Lenke til kommentar
HV Skrevet 11. november 2009 Del Skrevet 11. november 2009 public static void doGuiCrap() { if (EventQueue.isDispatchThread()) { JOptionPane.showMessageDialog(null,"Tadaa"); } else { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { JOptionPane.showMessageDialog(null,"Tadaa"); } }); } catch (Exception e) { e.printStackTrace(); } } } Lenke til kommentar
Unlimited LTD Skrevet 11. november 2009 Forfatter Del Skrevet 11. november 2009 Er ikke helt sikker på hva du mener med det.. Hva har det med problemet å gjøre? Lenke til kommentar
HV Skrevet 11. november 2009 Del Skrevet 11. november 2009 (endret) Er ikke helt sikker på hva du mener med det.. Hva har det med problemet å gjøre? Den viste hvordan lure en swing operasjon til å uansett kjøre i event dispatch thread, fordi jeg først anntok at du kjørte i en egen tråd/worker. I og med at du sier at hele interfacet fryser, sier det egentlig at du har tung kode som kjører i event dispacth thread, den spesifikke tråden som blir brukt av awt. Hvis du feks gjør det søke logikk(jeg aner ikke hva du har der inne), så burde dette kjøres i sin egen tråd. Du har jo spesifikt valgt å kjøre denne koden rett inn i EventQueuen.. event dispatch thread har jo nok å holde styr på om vi ikke skal fylle den med extra drit, så hvid du skal gjøre en tyngre oppgave og samtidig oppdatere interfacet må du bare passe på at rett jobb havner i rett kø. Hvis du derimot går helt andre veien og kjører swing tingene dine i sin egen tråd vil du oppleve litt blandet resultat og det kan virke ustabilt: Hjelper dette? new Thread() { @Override public void run() { super.run(); //Søke søke for (int i = 0; i < 10; i++) { //Søke søke EventQueue.invokeLater(new Runnable() { @Override public void run() { //Update progressbar } }); //Søke søke try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); Endret 11. november 2009 av HV Lenke til kommentar
Unlimited LTD Skrevet 12. november 2009 Forfatter Del Skrevet 12. november 2009 Ok. Var bare jeg som ikke helt skjønte hva EventQueue var. Trodde det var en enkel måte å lage en egen tråd. Takk for hjelpen. Lenke til kommentar
zulo Skrevet 26. november 2009 Del Skrevet 26. november 2009 Hva med å lage sin egen Event og registrere progressbaren som listener? Da må du holde tunga rett i munnen men får du det til er det en meget lekker måte å oppdatere en progressbar på. Lenke til kommentar
Unlimited LTD Skrevet 26. november 2009 Forfatter Del Skrevet 26. november 2009 Det hadde jeg ikke tenkt på. Men kunne jeg lagd en egen listener som oppdaterte den på samme måte eller måtte jeg ha brukt Progressbaren som listener? Lenke til kommentar
zulo Skrevet 27. november 2009 Del Skrevet 27. november 2009 Du må lage din egen interface slik at du kan lytte på oppdaterings-eventene dine. Den klassen som vil lytte på NedlastingStatusEvents må implementere dette interfacet..på samme måte som den kan implementere ActionListener vil den da ikke få metoden ActionPerformed, men NedlastingStatusEventForekom(NedlastingStatusEvent evt) Altså der du har progressbaren,implementer interfacet sånn at du får lyttet på nedlastingstatusevent public NedlastingStatusEventForekom(NedlastingStatusEvent evt){ progressbare.setblabla......(evt.getNumber); } import java.util.EventListener; public interface NedlastingStatusEventListener extends EventListener { /** * Kalles på når en NedlastingStatusEvent forekommer. */ public void NedlastingStatusEventForekom(NedlastingStatusEvent evt); } Og så må du lage eventene i klassen der du laster ned samt håndtere NedlastingStatusEventListenere som registrerer seg for å lytte.. Slik må du gjøre i klassen som implementerer NedlastingStatusEventListener: nedlastingsklasseObjektet.addNedlastingStatusEventListener(this); Nedlastings klassen blir da tilsvarende det en jbutton gjør..knappene pleier å registrere actionlistenere, jbutton1.addActionListener(this); Det som skjer da er at "this", objektet som sendes inn der kommer jo inn i klassen som lager eventene og så lager den eventene og kaller på f.eks ActionPerformed direkte på objektet...det er slik ActionPerformed metoden blir kalt. Eller i dette tilfellet NedlastingStatusEventForekom. Det sendes også med et event objekt. Trur det er vanskelig å forklare,beklager rotete forklaring. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå