Gå til innhold

Swing, repainte under annen prosess


Anbefalte innlegg

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
Videoannonse
Annonse
 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
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 av HV
Lenke til kommentar
  • 2 uker senere...

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

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...