Avatar billede casualty Nybegynder
01. december 2002 - 14:38 Der er 6 kommentarer og
1 løsning

Thread...JProgressBar

Hvorfor virker dette ikke?


package threads2;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Frame1 extends JFrame {
  BorderLayout borderLayout1 = new BorderLayout();
  JPanel jPanel1 = new JPanel();
  JButton jButton1 = new JButton();
  private boolean stop = false;
  private int tal;
  JPanel jPanel2 = new JPanel();
  JProgressBar jProgressBar1 = new JProgressBar();


  public Frame1()
  {
    super();
    try
    {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }


  private void jbInit() throws Exception
  {
    this.getContentPane().setLayout(borderLayout1);
    this.setSize(new Dimension(400, 300));
    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener()
    {

      public void actionPerformed(ActionEvent e)
      {
        jButton1_actionPerformed(e);
      }
    });
    this.getContentPane().add(jPanel1, BorderLayout.NORTH);
    jPanel1.add(jButton1, null);
    this.getContentPane().add(jPanel2, BorderLayout.CENTER);
    jPanel2.add(jProgressBar1, null);
    jProgressBar1.setMaximum(1000);
  }



 

  void jButton1_actionPerformed(ActionEvent e)
  {
    new Thread( new Updater(jProgressBar1) ).start();
    for(int i=0; i<=100000000; i++)
    {
      tal=i;
    }
    stop=false;
  }

  private class Updater implements Runnable
  {
    private JProgressBar bar;
    public Updater(JProgressBar bar )
    {
      this.bar = bar;
    }
    public void run()
    {
      while ( ! stop )
      {
        bar.setValue(tal);
        try
        {
        Thread.sleep(100);
        }
        catch (InterruptedException ie)
        {
        }
      }
    }
  }
}


Jeg ville gerne se en JProgressBar der stiger langsomt...Men jeg ser en JProgressBar der først bliver sat når min forlykke har kørt....

Mvh Casualty
Avatar billede arne_v Ekspert
01. december 2002 - 16:21 #1
Hjælper :
  bar.setValue(tal);
  bar.repaint();
?
Avatar billede casualty Nybegynder
01. december 2002 - 16:36 #2
Nej desværre
Avatar billede arne_v Ekspert
01. december 2002 - 17:24 #3
Det er heller ikke årsagen til fejlen, men er det ikke en fejl med:
  jProgressBar1.setMaximum(1000);

  for(int i=0; i<=100000000; i++)
    {
      tal=i;
    }

    bar.setValue(tal);
Avatar billede arne_v Ekspert
01. december 2002 - 18:43 #4
Følgende virker faktisk:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Frame1 extends JFrame {
    BorderLayout borderLayout1 = new BorderLayout();
    JPanel jPanel1 = new JPanel();
    JButton jButton1 = new JButton();
    private boolean stop;
    private int tal;
    JPanel jPanel2 = new JPanel();
    JProgressBar jProgressBar1 = new JProgressBar();
    private final static int N = 1000;

    public Frame1() {
        super();
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        this.getContentPane().setLayout(borderLayout1);
        this.setSize(new Dimension(400, 300));
        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(ActionEvent e) {
                jButton1_actionPerformed(e);
            }
        });
        this.getContentPane().add(jPanel1, BorderLayout.NORTH);
        jPanel1.add(jButton1, null);
        this.getContentPane().add(jPanel2, BorderLayout.CENTER);
        jPanel2.add(jProgressBar1, null);
        jProgressBar1.setMaximum(N);
        jProgressBar1.setStringPainted(true);
    }

    void jButton1_actionPerformed(ActionEvent e) {
        stop = false;
        jProgressBar1.setValue(0);
        this.update(this.getGraphics());
        new Thread(new Updater(jProgressBar1, this)).start();
        for (int i = 0; i <= N; i++) {
            System.out.println("ok");
            tal = i;
            try {
                Thread.sleep(1);
            } catch (InterruptedException ex) {
            }
        }
        stop = true;
    }

    private class Updater implements Runnable {
        private JProgressBar bar;
        private JFrame f;
        public Updater(JProgressBar bar, JFrame f) {
            this.bar = bar;
            this.f = f;
        }
        public void run() {
            while (!stop) {
                bar.setValue(tal);
                f.update(f.getGraphics());
                System.out.println("upd");
                try {
                    Thread.sleep(1);
                } catch (InterruptedException ie) {
                }
            }
        }
    }
    public static void main(String[] args) throws Exception {
        Frame1 f = new Frame1();
        f.addWindowListener(new WindowAdapter() {
                              public void windowClosing(WindowEvent e) {
                                  System.exit(0);
                              }
                            });
        f.pack();
        f.setVisible(true);
    }     
}
Avatar billede arne_v Ekspert
01. december 2002 - 18:44 #5
Man kan oven i købet klikke flere gange på knappen !

Tilsyneladende er det den update der skal til.
Avatar billede arne_v Ekspert
03. december 2002 - 14:52 #6
Har du fået løst dit problem ?
Avatar billede casualty Nybegynder
23. december 2002 - 14:59 #7
Hej...Ja jeg kom da en del videre..Nu virker det...Tak for hjælpen og undskyld den lange svartid..

Mvh Casualty
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