15. juni 2001 - 18:13Der 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(); }
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.
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());
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.
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?
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.
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.
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...
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 :-)
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)
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
Synes godt om
Ny brugerNybegynder
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.