Avatar billede ladyhawke Novice
15. juni 2001 - 18:13 Der er 22 kommentarer og
1 løsning

GUI opdatering i for-løkke

Jeg har i for-løkke der i hver gennemløb skal opdatere en GUI-komponent (en JLabel med et ImageIcon), men den opdaterer først når alle gennemløb er afsluttet. Hvordan gennemtvinger man opdateringen?

I princippet ser det således ud nu, men det virker som sagt ikke efter hensigten:

for (int j=5; j<max; j++) {
  //ændringer af GUI-komponenter
  IIcon = new ImageIcon(resultImage); //den nye icon til JLabel\'en jl
  jl.setIcon(IIcon);               
  jl.revalidate();   
}
                   

Avatar billede genx Nybegynder
15. juni 2001 - 23:19 #1
Hmm, det er lidt svært at se hvad der mangler.
Hvorfor initialiserer du j til 5 og hvad er Max?

Har du overvejet at bruge Observer/Observerable?

/GenX
Avatar billede lbhansen Nybegynder
16. juni 2001 - 00:16 #2
Du kan måske prøve at køre opdateringen i en tråd for sig selv. Det kan godt være at du køre i samme tråd som GUIen, også vil den måske først opdatere når den har kaldt din metode.

Bare et gæt. Jeg roder ikke så meget med GUI
Avatar billede trolle Nybegynder
16. juni 2001 - 01:45 #3
Jeg ved ikke helt om jeg har forstået dit spårgsmål rigtigt. Men jeg prøver alligevel...

Jeg har tidligere stået med et ligenende problem hvor en  JLabel ikke blev opdateret før efter at en given metode var færdig, men det kunne løses med et direkte kald af JLabel\'ens egen paint metode.

Det kan dog give problemer med at labelen skriver den nye tekst oven i det gamle, uden at slette det, og den eneste løsning jeg kunne hitte op med var at kalde paint metoden i det komponent som lablen var en del af. 
Altså blot paint(getGraphics());

Håber du kan bruge mit svar.
Avatar billede trolle Nybegynder
16. juni 2001 - 01:46 #4
Det skal lige siges at sidst nævnte løsning kan være uderst tidskrævende, hvis du meget tit skal opdatere labelen.
Avatar billede ladyhawke Novice
16. juni 2001 - 11:13 #5
j og max er bare talværdier i for-løkken. I dette tilfælde skal jeg lave en algoritme som initialiseres med de første 5 filer i et directory, derfor er j=5 (6. fil). max er antallet af filer ialt.

Jeg kigger på givne forslag...
Avatar billede ladyhawke Novice
16. juni 2001 - 11:56 #6
hmm. det ser ikke ude til at trolles løsning hjælper... Jeg får stadig kun et billede på skærmen...
Avatar billede ladyhawke Novice
16. juni 2001 - 11:57 #7
GenX: mht. observer pattern, så er det ikke problemet... Jeg ved præcis hvornår der skal opdateres (i slutningen af for-løkken) det sker bare ikke. Hvad ville du bruge den konstruktion til i dette tilfælde?
Avatar billede ladyhawke Novice
16. juni 2001 - 13:13 #8
Jeg har afprøvet diverse versioner af svarene og det er ikke lykkedes endnu...
Avatar billede stigc Nybegynder
16. juni 2001 - 19:50 #9
hvad med jl.repaint()
Avatar billede ladyhawke Novice
17. juni 2001 - 12:08 #10
er prøvet...
Avatar billede logical Nybegynder
19. juni 2001 - 18:57 #11
Nu skal jeg være der.

Generelt set en af to muligheder:

for (int i = 0 ; i < 10 ; i++) {
    label.setText(\"Her er nr. \" + i);
    // Option 1
    RepaintManager.currentManager(label).paintDirtyRegions();
    // Option 2
    label.paintImmediately(label.getBounds());
}

Men opdateringen er selvfølgelig meget hurtig.
Avatar billede logical Nybegynder
19. juni 2001 - 19:11 #12
Option 1 er at foretrække, fordi den finder komponents dirtyRegions udfra de normal regler.
Option 2 repainter hele label, også selv om der ikke er nogen ændringer.
Avatar billede lbhansen Nybegynder
19. juni 2001 - 20:43 #13
Logical >> Du har da godt nok fået læst noget GUI på det sidste. Jeg har aldrig nogensinde hørt om DirtyRegions, men en gang skal jo være den første:)
Avatar billede logical Nybegynder
20. juni 2001 - 20:50 #14
lbhansen>> Du kunne jo bare høre efter i timerne :-)

Jeg har været med til at kode look-and-feel til en større dansk virksomhed, plus forskellige gui-tools, så...:-)

Hver område, som potentielt skal gentegnes bliver placeret i eventkøen som \"dirty\", dvs overlappende regioner fra vinduer, egne repaints etc. og når tid er bliver de gentegnet af en repaint manager.
Avatar billede ladyhawke Novice
21. juni 2001 - 18:23 #15
Hmmm desværre så får jeg stadig samme resultat. Jeg tror jeg vil prøve \"from scratch\" metoden på problemet...
Avatar billede lbhansen Nybegynder
21. juni 2001 - 19:11 #16
ladyhawke > Jeg har lige kørt Logicals eksempel, og det fungerer, jeg satte dog et sleep på 500 MS ind.
Avatar billede ladyhawke Novice
21. juni 2001 - 19:21 #17
Jeg er sikker på det virker, derfor laver jeg en from scratch version af mit program, så jeg er sikker på der ikke er noget der forstyrrer opdateringen...
Avatar billede logical Nybegynder
21. juni 2001 - 20:51 #18
Der findes ellers ikke noget vi ikke kan klare her :-)

Iøvrigt er det en dårlig ide at have sleep og GUI opdatering sammen, hvis opdatering er baseret på et event. Hvis det f.eks. er en reaktion på en button, skal det nok skrives således:

for (int i = 0 ; i < 10 ; i++) {
  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      textfield.setText(\"whatever\");
    }
  });
  try {Thread.sleep(500); } catch (InterruptedException e) {}
}

Men LadyHawke, hvis det er, kan vi altid være behjælpelig en anden gang :-)
Avatar billede ladyhawke Novice
21. juni 2001 - 21:06 #19
logical>> Tak, tak :-) Jeg skal lige teste dine forslag, når jeg har ryddet op i programmet og løst et par andre opgaver (skrive lidt på min opgave). Jeg er ret sikker på at det nok skal lykkes, ellers skal jeg nok spørge igen ;-) (Jeg lukker spørgsmålet når jeg har testet det i et \"rent\" program)
Avatar billede lbhansen Nybegynder
21. juni 2001 - 21:26 #20
Ladyhawke >> Ellers har jeg lige skrevet en version med alle Logicals gode idéer, så den kan jeg jo lige så godt dele.
http://www.el-lal.dk/java/

Den gør ikke rigtig andet end at illustrere pointen
Avatar billede ladyhawke Novice
26. juni 2001 - 13:28 #21
Jubii! Det virker. Jeg brugte lbhansens kode/logicals ideer som grundlag og tilpassede den til det ønskede formål. Tak for hjælpen !!!

NB lbhansen >> kan du ikke lige svare så vil jeg sende dig nolge point også...
Avatar billede lbhansen Nybegynder
26. juni 2001 - 15:13 #22
nej, bare giv dem til Logical, det var jo næsten et spørgsmål om copy´paste, så han fortjener dem da:)
Avatar billede ladyhawke Novice
26. juni 2001 - 15:22 #23
Hmm du måtte ellers gerne få nogle point...
I var begge til stor hjælp og støtte :-)

Jeg takker, bukker og giver logical nogle point
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester