Avatar billede trp79 Nybegynder
29. juli 2003 - 19:44 Der er 14 kommentarer og
1 løsning

GUI opdateres ikke

Når jeg trykker på min knap er det meningen at en jlabel skal ændre indhold (ved label.setText("..")) og at en JProgressBar skal "fyldes mere ud" efterhåden som noget kode afvikles. Mit problem ligger i at gui først opdateres når alt kode er udført og derved ser man kun slut-tilstanden. De system.out.println's der er bliver udført løbende men guien bliver ikke opdateret løbende.

min knap:
    private void jBUploadActionPerformed(java.awt.event.ActionEvent evt) {
        jBUpload.setEnabled(false);
        String bnavn = jTFBrugernavn.getText();
        String pass = jPasswordField.getText();
        String serverAdr = jTFServerAdr.getText();
        Klient k = new Klient(serverAdr, bnavn, pass, jLStatus, jProgressBar, this);
        k.validering(k, firmaListe, kPListe, omsListe, budgetListe);
        jBUpload.setEnabled(true);
    }


udklip fra Klient.java:

                        jLStatus.setText("Validering gennemført");//udskrives til klienten
                        System.out.println(a);//HERHER
                        jLStatus.updateUI();
                        up.repaint();
                        notValideret=false;

                        a++;
                        jProgressBar.setValue(a);
                        jLStatus.setText("Uploader firmaer");
                        System.out.println(a);//HERHER
                        jLStatus.updateUI();
                        up.repaint();
                        output = new ObjectOutputStream (socket.getOutputStream());
                        output.writeObject(firmaListe);
                        output.flush();
                        jLStatus.setText("Firmaer uploadet");
                        System.out.println(a);//HERHER
                        jLStatus.updateUI();
                        jProgressBar.updateUI();
                        up.repaint();


Håber nogen kan hjælpe, mvh
torben
Avatar billede riversen Nybegynder
29. juli 2003 - 19:56 #1
har du prøvet at oprette en tråd som kører koden i actionperformed
Avatar billede _carsten Nybegynder
29. juli 2003 - 21:54 #2
Hvis det skal fungere ordentligt, skal du køre det i en tråd,


Alternativt kan du prøve nedenstående, men det bliver din GUI
absolut ikke hurtigere af.


                        jLStatus.setText("Validering gennemført");//udskrives til klienten
                        System.out.println(a);//HERHER
                        super.paint(getGraphics());
                        notValideret=false;

                        a++;
                        jProgressBar.setValue(a);
                        jLStatus.setText("Uploader firmaer");
                        System.out.println(a);//HERHER
                        super.paint(getGraphics());
                        output = new ObjectOutputStream (socket.getOutputStream());
                        output.writeObject(firmaListe);
                        output.flush();
                        jLStatus.setText("Firmaer uploadet");
                        System.out.println(a);//HERHER
                        super.paint(getGraphics());
Avatar billede riversen Nybegynder
29. juli 2003 - 22:12 #3
ja, en tråd er nok at foretrække
Avatar billede trp79 Nybegynder
30. juli 2003 - 08:57 #4
Ja, jeg har prøvet med en tråd, som understående. Burde det ikke også virke?
Jeg er ikke særlig skarp i tråede, så hvis jeg gør noget forkert vil det være skønt med en forklaring :o)

public class readStatus extends Thread
{
    JLabel jLStatus;
    JProgressBar jProgressBar;

    readStatus(JProgressBar jProgressBar, JLabel jLStatus)        //modtag info omkring hvor langt upload er i en tråd, måske det virker?
    {
        this.jProgressBar = jProgressBar;
        this.jLStatus = jLStatus;
    }

    public void run()
    {
        while(true)
        {
            jLStatus.updateUI();
            jProgressBar.updateUI();
        }
    }

    public void jLabelSetText(String text)
    {
        jLStatus.setText(text);
    }
}
Avatar billede trp79 Nybegynder
30. juli 2003 - 08:59 #5
Eller skal jeg bare i stedet oprette en ny tråd og sende alle objekter derover og køre koden (i run() i tråden) præcis som den er i actionperformed?
Avatar billede riversen Nybegynder
30. juli 2003 - 09:02 #6
kan du ikke lige maile koden
Avatar billede trp79 Nybegynder
30. juli 2003 - 09:03 #7
Koden for min actionperformed?
Avatar billede riversen Nybegynder
30. juli 2003 - 09:03 #8
al den nøvendige kode for at det kan køre. Så vil jeg lige fixe et eksempel
Avatar billede trp79 Nybegynder
30. juli 2003 - 09:05 #9
puha, der er godt nok meget. Men jeg prøver at maile de involverede klasser.
Avatar billede trp79 Nybegynder
30. juli 2003 - 09:09 #10
så er der mailet til eksperten@riversen.dk
Avatar billede trp79 Nybegynder
30. juli 2003 - 11:11 #11
Forrygende riversen, nu virker det :o)
Så hvis du er flink lige at smide et svar... tak for hjælpen :o)

Til andres orientering, så gav riversen mig følgende ide:

"Thread t  = new Thread()
{
public void run()
{
  //indsæt kode her der laver opdateringerne
  // kræver reference til gui'en
  // lad være med at placere selve JLabel etc. i denne klasse
}
};

t.start();

tilføj det i din actionPerformed"


Det gav følgende resultat:

public class readStatus extends Thread
{
private Upload up;
private String serverAdr;
private String bnavn;
private String pass;

    readStatus(Upload up, String serverAdr, String bnavn, String pass)            {
        this.up = up;
        this.serverAdr = serverAdr;
        this.bnavn = bnavn;
        this.pass = pass;
    }

    public void run()
    {
        Klient k = new Klient(serverAdr, bnavn, pass, up);
        k.validering(k, up.firmaListe, up.kPListe, up.omsListe, up.budgetListe);
    }
}


Mvh
Torben
Avatar billede riversen Nybegynder
30. juli 2003 - 11:14 #12
ok
Avatar billede trp79 Nybegynder
30. juli 2003 - 11:36 #13
Du eller en anden kan vel ikke forklare mig hvorfor det er nødvendig at køre det i en tråd for sig selv?
Jeg troede faktisk at gui elementer i forvejen (automatisk) kørte i deres egen tråd. Under alle omstændigheder kan pc'en vel kun gøre en ting ad gangen og den eksekverer jo koden kronologisk..
Men så er det måske fordi hver tråd får begrænset cpu tid? eller?
Avatar billede riversen Nybegynder
30. juli 2003 - 12:01 #14
alle gui elementerne kører i den samme tråd så derfor skal koden der opdaterer kører i en anden tråd. Hvis ikke køres koden som opdaterer variablerne og først når metoden returnerer opdateres gui'en. Når det kører i egen tråd opdateres gui'en når den anden tråds timeslice udløber
Avatar billede trp79 Nybegynder
30. juli 2003 - 12:36 #15
Okidokey, så forstår jeg bedre :o)
Tak for forklaringen.
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