Avatar billede nopainnogain Nybegynder
23. april 2006 - 14:48 Der er 6 kommentarer og
2 løsninger

opdatering af JLabels og grafiske objekter UNDER java-kørsel

Jeg kan se at det ikke er første gang at spørgsmålet er stillet, men jeg synes stadig at løsningen er uklar, så derfor dette spørgsmål igen.

Jeg laver en simulering, som kan tage flere timer. Jeg vil gerne løbende se, hvordan simuleringen udvikler sig både via grafer og text i JLabels.

Problemet er, at jeg ender med en grå gui uden nogen elementer i, og først når simuleringen er slut, kan jeg se resultaterne. Jeg har før haft løst problemet ved at indsætte en Timer, som kaldte hver enkelt iteration med en meget lille forsinkelse. Herved blev min GUI opdateret løbende, men det må kunne gøres mere effektivt.

jeg har prøvet at kalde repaint() , setVisible(true) samt pack() metoderne på mit JFrame uden at det hjælper.

Den originale kode er temmelig omfattende, så jeg har konstrueret et simpelt eksempel, som tæller til 10.000.000 100 gange. Jeg vil gerne opdatere min JLabel så den tæller med fra 1-100.
__________________
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ekspertenGUI
{
    private JFrame frame;
    private Container contentPane;
    private JLabel label;

    /**
    * Constructor
    */
    public ekspertenGUI()
    {
        frame = new JFrame();
       
        contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());

        JButton startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener() {
                              public void actionPerformed(ActionEvent e) { start(); }
                            });       
       
        contentPane.add(startButton, BorderLayout.NORTH);
       
        label = new JLabel(" ");
        contentPane.add(label, BorderLayout.CENTER);
       
        frame.setVisible(true);
        frame.pack();
    }
   
    private void start()
    {
        int i = 0;
        while(i < 100)
        {
            int j = 0;
            while(j < 10000000)
            {
                j++;
            }
            i++;
            label.setText("" + i);
            frame.setVisible(true);
            frame.repaint();
            frame.pack();
        }
    }
}
__________________

Jeg har på fornemmelsen at problemet ikke er så svært at løse, men  det må helt klart være 60 point værd at læse sig igennem den roman.

På forhånd tak for alle svar, der måtte komme.

Mvh NoPainNoGain
Avatar billede mikkelbm Nybegynder
23. april 2006 - 15:09 #1
Prøv i din ActionListener følgende:

startButton.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        new Thread ()
        {
            public void run()
            {
                start();
            }
        }.start();
});
Avatar billede _carsten Nybegynder
23. april 2006 - 15:09 #2
Ret din start() til følgende:


    private void start()
    {
        Thread t = new Thread(){
            public void run(){
                int i = 0;
                while(i < 100)
                {
                    int j = 0;
                    while(j < 10000000)
                    {
                        j++;
                    }
                    i++;
                    label.setText("" + i);
                }
            }
        };
        t.start();
    }
Avatar billede _carsten Nybegynder
23. april 2006 - 15:11 #3
Sekunder kan være afgørende :-)
Avatar billede schwarz84 Nybegynder
23. april 2006 - 15:15 #4
Løsningen er såmænd bare at lade de to ting køre i hver sin tråd. Læg alt hvad der hører til din beregning over i en klasse som implementerer "Runnable".
Det, der skal køres i en tråd for sig skal startes med metoden run() i denne nye klasse. Herefter startes tråden med noget i denne retning:

Thread t = new Thread(new DenKlasseDuHarLavet(eventuelle argumenter));
t.start();

Du kan også lave en anonym klasse der extender thread. Denne løsning giver dog ikke mulighed for at sende argumenter med til klassen. I så fald skal du også override run()-metoden, men ligesom før starte den med start()-metoden.
Avatar billede mikkelbm Nybegynder
23. april 2006 - 15:59 #5
Hmm!?
Avatar billede mikkelbm Nybegynder
23. april 2006 - 16:04 #6
Er der ikke sket en fordrejning af pointfordelingen her!?

Umiddelbart ser jeg ikke nogen forskel på mit og de senere givne svar?
Avatar billede mikkelbm Nybegynder
23. april 2006 - 16:05 #7
Bortset fra at jeg har den vane at lade spørger rykke efter et svar, når han/hun føler at spørgsmålet er besvaret.
Avatar billede _carsten Nybegynder
23. april 2006 - 16:14 #8
Enig

mikkelbm svar her: http://www.eksperten.dk/spm/704711
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