Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

jProgressBar se ne puni iako se vrednosti menjaju kroz petlju jProgressBar.setValue(i+1) ?

[es] :: Java :: jProgressBar se ne puni iako se vrednosti menjaju kroz petlju jProgressBar.setValue(i+1) ?

[ Pregleda: 1416 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

dexterkk
QA Engineer
Belgrade

Član broj: 27219
Poruke: 8
*.dynamic.sbb.rs.

ICQ: 315403578


Profil

icon jProgressBar se ne puni iako se vrednosti menjaju kroz petlju jProgressBar.setValue(i+1) ?13.04.2010. u 22:39 - pre 169 meseci
Guglao sam dosta i nasao par resenja koja prave, iscrtavaju GUI i pune progres bar. Imam problem kako da namestim da se progres bar puni kada pokrenem neki pozadinski zadatak i pratim progres. Zadatak zelim da se startuje recimo pritiskom na dugme.
Code:


         jProgressBar1.setMaximum(_data.length);
 for(int i = 0; i < _data.length;i++ )
        {

         jProgressBar.setValue(i+1);


         }



Ovo je prva Java Desktop Aplikacija koriscenjem swing-a koju pokusavam da iskodiram u NetBeansu. Kod sam smestio u event mouse click na dugme. Zadatak se izvrsi ali progres bar ne mrda, vec se pojavi popunjen nakon izvrsenja zadatka. Zadatak se sastoji u testiranju api-a koji generise xml. Preko url-a menjam odredjene parametre pomocu loop-a. Zatim parsiram xml. Broj parametra koji se testira je ujedno i maximum vrednost progres bar-a.

Jedno od ponudjenih resenja za progressbar sa neta je:

Code:


package components;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.beans.*;
import java.util.Random;
import org.jdesktop.swingworker.SwingWorker;

public class ProgressBarDemo extends JPanel
                             implements ActionListener, 
                                        PropertyChangeListener {

    private JProgressBar progressBar;
    private JButton startButton;
    private JTextArea taskOutput;
    private Task task;

    class Task extends SwingWorker<Void, Void> {
        /*
         * Main task. Executed in background thread.
         */
        @Override
        public Void doInBackground() {
            Random random = new Random();
            int progress = 0;
            //Initialize progress property.
            setProgress(0);
            while (progress < 100) {
                //Sleep for up to one second.
                try {
                    Thread.sleep(random.nextInt(1000));
                } catch (InterruptedException ignore) {}
                //Make random progress.
                progress += random.nextInt(10);
                setProgress(Math.min(progress, 100));
            }
            return null;
        }

        /*
         * Executed in event dispatching thread
         */
        @Override
        public void done() {
            Toolkit.getDefaultToolkit().beep();
            startButton.setEnabled(true);
            setCursor(null); //turn off the wait cursor
            taskOutput.append("Done!\n");
        }
    }

    public ProgressBarDemo() {
        super(new BorderLayout());

        //Create the demo's UI.
        startButton = new JButton("Start");
        startButton.setActionCommand("start");
        startButton.addActionListener(this);

        progressBar = new JProgressBar(0, 100);
        progressBar.setValue(0);
        progressBar.setStringPainted(true);

        taskOutput = new JTextArea(5, 20);
        taskOutput.setMargin(new Insets(5,5,5,5));
        taskOutput.setEditable(false);

        JPanel panel = new JPanel();
        panel.add(startButton);
        panel.add(progressBar);

        add(panel, BorderLayout.PAGE_START);
        add(new JScrollPane(taskOutput), BorderLayout.CENTER);
        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

    }

    /**
     * Invoked when the user presses the start button.
     */
    public void actionPerformed(ActionEvent evt) {
        startButton.setEnabled(false);
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        //Instances of javax.swing.SwingWorker are not reusuable, so
        //we create new instances as needed.
        task = new Task();
        task.addPropertyChangeListener(this);
        task.execute();
    }

    /**
     * Invoked when task's progress property changes.
     */
    public void propertyChange(PropertyChangeEvent evt) {
        if ("progress" == evt.getPropertyName()) {
            int progress = (Integer) evt.getNewValue();
            progressBar.setValue(progress);
            taskOutput.append(String.format(
                    "Completed %d%% of task.\n", task.getProgress()));
        } 
    }


    /**
     * Create the GUI and show it. As with all GUI code, this must run
     * on the event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("ProgressBarDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        JComponent newContentPane = new ProgressBarDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}




Kod radi, samo nemam ideju kako da to iskoristim da radi u kombinaciji sa NetBeans-ovim generisanim kodom (NetBeans 6.8) u kombinaciji sa ubacenim dugmetom.


Koliko sam shvatio, u gore navedenom kodu se desava iscrtavanje GUI-a preko progress promenjive iz doInBackground() metode.

Pitanje:

Kako da ostvarim izvrsavanje zadatka u pozadini i da se to reflektuje na progress bar, da koristim NetBenas-ov generisani kod kao sonovu i da se user interfejs ne zamrzne.

Napravio sam projekat New Project->Java->Java Desktop Application sa generisanim kodom.

Unapred zahvalan na pomoci.
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.dynamic.isp.telekom.rs.

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: jProgressBar se ne puni iako se vrednosti menjaju kroz petlju jProgressBar.setValue(i+1) ?14.04.2010. u 14:04 - pre 169 meseci
Ovaj kod koji si ostavio je bas ono sto tebi treba, za neke stvari koje moraju da se izvrsavaju u "pozadini" treba da se koristi SwingWorker

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/


 
Odgovor na temu

dexterkk
QA Engineer
Belgrade

Član broj: 27219
Poruke: 8
*.dynamic.sbb.rs.

ICQ: 315403578


Profil

icon Re: jProgressBar se ne puni iako se vrednosti menjaju kroz petlju jProgressBar.setValue(i+1) ?14.04.2010. u 14:43 - pre 169 meseci
Jeste, to je to.. Samo imam problem sa konkretnik slucajem koriscenja toga uz generisani kod NetBeans 6.8. U kodu koji sam naveo, se vrshi i iscrtavanje GUI-a.

Code:
javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();  // ovde se onovi iscrtava GUI koliko sam ukapirao...
            }


E sad... nije mi jasno kako da postignem isto to a da ne kodiram ruchno svaku komponentu (jButton, JprogressBar, itd...), kao sto je navedeno u tom primeru. Nije mi problem da sve to ruchno iskodiram, ali koliko sam ukapirao, onda nemogu da koristim vizualno pozicionoranje/prevlacenje komponenti shto podrzava NetBeans.

Drugo, kada otvorim postojeci rucno kodiran projeka, koji radi slichno, neka windows aplikacija u swing-u, nemam "Design View" opciju. Poenta cele price je da sam hteo da koristim NetBeas da bi brzo i efikasno "Nacrtao" GUI, pa da se fokusiram na problematiku zadatka (u mom slucaju razna testiranja) koje svakodnevno resavam u javi, php-u, JavaScript-u...
Dosta bi mi pomogao savet, nekoga ko vetj radi takve stvari u NetBeansu. Ako je to vetj moguce i ako se isplati. Moguce da takva tehnika postoji vetj u NetBeans-u, a da ja jednostavno ne znam kako se to radi... :( Recimo, kao shto dodam event na dugme za klik, i NetBeans generishe kod, pitam se da li tako neka opcija postoji i za ovo shto meni treba.

Vidim da NetBeans koristi:


Code:
// connecting action tasks to status bar via TaskMonitor
        TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
        taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                String propertyName = evt.getPropertyName();
                if ("started".equals(propertyName)) {
                    if (!busyIconTimer.isRunning()) {
                        statusAnimationLabel.setIcon(busyIcons[0]);
                        busyIconIndex = 0;
                        busyIconTimer.start();
                    }
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(true);
                } else if ("done".equals(propertyName)) {
                    busyIconTimer.stop();
                    statusAnimationLabel.setIcon(idleIcon);
                    progressBar.setVisible(false);
                    progressBar.setValue(0);
                } else if ("message".equals(propertyName)) {
                    String text = (String)(evt.getNewValue());
                    statusMessageLabel.setText((text == null) ? "" : text);
                    messageTimer.restart();
                } else if ("progress".equals(propertyName)) {
                    int value = (Integer)(evt.getNewValue());
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(false);
                    progressBar.setValue(value);
                }
            }
        });


Deluje mi da je ovaj deo koda odgovoran za progressBar koji je vetj deo Java Desktop Application projekta koji generishe sam NetBeans.

 
Odgovor na temu

Toxter
NS

Član broj: 39393
Poruke: 317
82.117.202.*



+6 Profil

icon Re: jProgressBar se ne puni iako se vrednosti menjaju kroz petlju jProgressBar.setValue(i+1) ?14.04.2010. u 15:05 - pre 169 meseci
Sav GUI u Swingu se izvrsava u jednom Thread-u (EDT - Event Dispatching Thread).
Zato kada update-ujes GUI iz drugog thread-a moras koristiti InvokeLater (koji ga jednostavno stavi u queue za refresh).

Ali, da odem malo u offtopic:
1. Java pa Windows app - ako samo ucis da ti toplo preporucim da ne gubis vreme - predji i uci web odmah (Spring, Hibernate,...)
2. NetBeans - evo jos jedna preporuka - predji na Eclipse. Deluje komplikovano ali i kao svaki drugi IDE samo stvar navike. IMHO: dosta je mocniji a i u vecnini firmi ces pre koristiti
Eclipse nego NetBeans.
3. Java nikad nije imala dobar GUI editor za Swing (moguce jer je Swing dosta zavistan od layout manager-a pa to nije bas jednostavno za GUI editor). Tako
da sto se tice Java Swinga-a (a i upste Java GUI) nemoj ocekivati neki visual editor da ce da ti zavrsio posao. Ima izreka: Real Java developers code GUI :)
4. Ako te zaista zanima da naucis Java Swing onda prvo dobro iscitaj Swing tutorial : http://java.sun.com/docs/books/tutorial/uiswing/


Pozdrav
Sad mu nije nista, ubio si ga k'o zeca...
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
91.148.91.*

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: jProgressBar se ne puni iako se vrednosti menjaju kroz petlju jProgressBar.setValue(i+1) ?15.04.2010. u 12:06 - pre 169 meseci
http://www.instantiations.com/windowbuilder/

Pa kada je gui editor u pitanju , mislim da je java dostigla veoma visok nivo, recimo ovaj plugin za eclipsu radi apsolutno sve sto je potrebno, znaci ko je nekada koristio Delphi/Borland C++ builder/ Visual Basic napokon ima sad isto to za javu samo mnogo bolje, zato sto ovaj plugin je bidirekcioni u prevodu za razliku od drugih alata ovde je kod komplet u javi. Sa druge strane plugin je u stanju da procita i rucno napisan kod u javi i da ga prikaze graficki da mozes dalje da editujes formu/dialog i da pritom moze da primeti kojim kodnim stilom je kod pisan, pa onda u istom duhu da nastavi dalje. Jedina mana je sto je komercijalan ali kome je mnogo da plati 180$ moze da potrazi neki keygen na netu, ali generalno vredi svakog centa.
 
Odgovor na temu

[es] :: Java :: jProgressBar se ne puni iako se vrednosti menjaju kroz petlju jProgressBar.setValue(i+1) ?

[ Pregleda: 1416 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.