Keresés
Hírlevél
 
Kiemelt témák
»Hogyan védjem meg a portálomat?
»Google wave
»Assembly :: röviden
Állás/munka
»Profi PHP szakit sörért felbérelnék :)
»C kódhiba
»IPhone App elkészítése
»GWT -ben tapasztalt webfejlesztőt keresek
»Profi sitebuildert keresünk projekt alapon
» több téma
Tudástár
?1 program többszöri elinditása automatikusan
?Input mezők megjelenítése
?Kép feltöltése
?C# 8 bites szabványos HEX file beolvasása
?Rajzolás Canvas-re JAVA-ban
?Php combobox értékfeltöltése nem működik
?C# Linq"Sql Insert Sequence
*C# Különbözű típusu osztályos származtatása
VB 2005 + MySQL
Mysql update hiba
*Modrewrite ne legyen kötelező a parameter
Süti probléma
L2 Cache lekérdezése Delphiben.
?Link szövegének értékátadása fájlba
?Flash játékban elért pontszám elmentése
» több téma
Társalgó
»Linux és a C#, .NET
»PHP fejlesztés felsőfokon eladó !
»Melyik főiskola vagy egyetem?
»2f iskoláról vélemények
»Reklám kamu klikkelés kivédése
»Eladó iMac G5 20",2 GHz CPU, 2 GB memória stb.
»Mik a legalapvetőbb tervezési minták C#-ban?
»Adatvédelmi nyilvántartás
»Hogyan védjem meg a portálomat?
»Trial megvalositasa
» több téma
ASP  |  C#  |  C++  |  CSS  |  Delphi  |  Flash  |  HTML  |  Java  |  JavaScript  |  Pascal  |  Perl  |  PHP  |  Python  |  Visual Basic  |  Visual C++  |    »    

Tudástár

»

JProgressBar használata

»

JProgressBar használata

nyitotta: angien, idő: 2010.02.08., moderátor: moderator
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben Nyomtatható verzió

Kategóriák:Programozási nyelvek » Java
Programozási platformok » Java programozás

Sorrend:
Időzóna:
Blokkméret:
Sziasztok!

Következő a problémám. Írtam egy pici programot amiben egy gomb megnyomására elindul egy folyamat Azt szeretném megoldani, hogy amíg ez a feladat be nem fejeződik megjelenjen egy modális folyamatjelző.

A feladat elég sok lépésből áll, valami olyan megoldás lenne jó ami nem százalékosan jeleníti meg a folyamat állapotát, hanem csak jelzi, hogy dolgozik a program, ide-oda fut egy csík mondjuk vagy vmi hasonló.

Mi ennek a feladatnak az általános és elegáns megoldása? A 'run' metóduson belül hozzam létre a progressbart? ahol a szál ténylegesen végrehajtódik?

A program felépítése a következő képen néz ki:

public MyApp extends JFrame implements ActionListener, ItemListener {

deklarációk...

metódusok..

stb..

eseménykezelés, a gomb megnyomására elindul a feladat végrehajtása

public void actionPerformed(ActionEvent ev){
if (ev.getSource() == gomb) {
Feladat ft;
Thread th;
ft = new Feladat();
th = new Thread(ft);
th.start();
}
}

class Feladat extends JDialog implements Runnable{
public void run(){
a tényleges feladat..
}

}
}

Köszönöm a segítséget!
Ezt olvastad már? http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html
átfutottam, és megnéztem jó pár példát is, a végén meg teljesen elbizonytalanodtam a megoldást illetően, mert ahány példa annyi féle megoldás és nem állt össze a kép.. :( azért bátorkodtam megkérdezni Ki, hogyan csinálja :)
Amit a belinkelt oldalon találsz nagy valószínűséggel igen korrekt, hiszen a Java hivatalos weblapjáról van. Én ezt elfogadnám a helyedben, ahogy van.
Ha elakadtál, másold be az egész programot, és kitaláljuk hogyan illeszd be.
egyenlőre összedobtam egy kis JDialog-ot:

ezt kellene valahogy felhasználni most, tegyem át ebbe a feladatvégrehajtást? a run() metódusban pedig PB frame = new PB(MyApp.this, true); ? vagy ez így nem az igazi?

class PB extends JDialog {

JProgressBar pbar;

public PB(JFrame parent, boolean modal) {
super(parent, modal);
init();
}

public void iterate() {
pbar.setIndeterminate(true);
}

public void init() {
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
JPanel pane = new JPanel();
pbar = new JProgressBar(JProgressBar.HORIZONTAL,
0, 1000);
pbar.setIndeterminate(true);
pane.add(pbar);
setContentPane(pane);
pack();
setVisible(true);
iterate();
}
}
Írtam egy pici programot amiben...

Mivel csak kis programot írtál, másold be az egészet.
Bemásolás előtt használd a "forráskód" gombot!

Ha használod, akkor valahogy így kell kinéznie:

                current.setValue(iH);
                double dH = 0.0;
                for (int j = 0; j < items.length; j++) {
                    dH += nIt[j] * items[j].getWeight();
                }

Ez csak egy példa, hogyan kell kinéznie!
Bocs így tényleg átláthatatlan.. remélem most jobb lesz. a picit viszont idézőjelbe teszem, bemásolni az egészet nagyon sok lenne és nem is lenne értelme azért írtam le csak a felépítését.

megpróbálom kicsit részletesebben

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Collections;
import java.util.Vector;
import java.util.logging.Level;
...
....
.....
public MyApp extends JFrame implements ActionListener, ItemListener {

deklarációk..

public MyApp() {
        sw = new SplahWindow(this, 3000);
        init();
    }

private void init() {
A GUI összeállítása
}

metódusok..

private void writePrefs(){}

private void readPrefs(){}

nyomtatás, keresés stb..

eseménykezelés részlet, a gomb megnyomására elindul a feladat végrehajtása

public void actionPerformed(ActionEvent ev){
if (ev.getSource() == gomb) {
Feladat ft;
Thread th;
ft = new Feladat();
th = new Thread(ft);
th.start();
}
}

class Feladat extends JDialog implements Runnable{
public void run(){
a tényleges feladat ami több részből áll, amíg ez fut szeretném, hogy megjelenjen egy folyamatjelző
}

}

class PB extends JDialog {

JProgressBar pbar;

public PB(JFrame parent, boolean modal) {
super(parent, modal);
init();
}

public void iterate() {
pbar.setIndeterminate(true);
}

public void init() {
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
JPanel pane = new JPanel();
pbar = new JProgressBar(JProgressBar.HORIZONTAL,
0, 1000);
pane.add(pbar);
setContentPane(pane);
pack();
setVisible(true);
iterate();
}
}
}

+ van még pár objektum osztály stb
Hol a main() függvény?

Ez így működőképes?

Ez mi?
public MyApp extends JFrame implements ActionListener, ItemListener {
Dobj össze egy olyan kis példa alkalmazást, amiben szeretnéd megoldani úgy a progressbar problémáját, ahogy a nagy alkalmazásodban is lesz.
ez a főprogram, a main egy másik osztályban van MyAppRun ami gyakorlatilag csak ennyi:


public class MyAppRun{   
   
    public MyAppRun() {
    }   
   
    public static void main(String[] args) {       
            MyApp my = new MyApp();       
    }           
   
}

oks amint lesz egy kis időm összedobom :)
összedobtam egy kis példát ami fut is :) elég béna, de megteszi..

a lineAdd() most lényegtelen, lehetne bármi, a lényeg, hogy amíg végrehajtódik a szál legyen egy modális folyamatjelző:


import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class MyApp extends JFrame implements ActionListener {

    private JScrollPane jp = new JScrollPane();
    private JTextArea jt = new JTextArea();
    private JButton bt = new JButton();

    public MyApp() {
        init();
    }

    public static void main(String[] args) {
        MyApp my = new MyApp();
    }

    public void init() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 150);
        setLocationRelativeTo(null);
        Container content = getContentPane();
        content.setBackground(Color.white);
        content.add(bt, "North");
        bt.setText("Start");
        bt.addActionListener(this);
        content.add(jp, "Center");
        jp.setViewportView(jt);
        jt.setText("Teszt");
        setVisible(true);
    }

    public void lineAdd() {
        for (int i = 10000, b = 0; b <= i; b++) {
            jt.append(System.getProperty("line.separator"));
            jt.append(b + ". " + "sor");
        }
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == bt) {
            StartFeladat ft;
            Thread th;
            ft = new StartFeladat();
            th = new Thread(ft);
            th.start();
        }
    }

    class StartFeladat implements Runnable {

        public void run() {           
            lineAdd();   
           //további hívások.. stb         
        }
    }
}

Egy lehetőség:

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

public class MyApp extends JFrame implements ActionListener {

    private JScrollPane jp = new JScrollPane();
    private JTextArea jt = new JTextArea();
    private JButton bt = new JButton();
    MyProgress progress;

    public MyApp() {
        init();
    }

    public static void main(String[] args) {
        MyApp my = new MyApp();
    }

    public void init() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 150);
        setLocationRelativeTo(null);
        Container content = getContentPane();
        content.setBackground(Color.white);
        content.add(bt, "North");
        bt.setText("Start");
        bt.addActionListener(this);
        content.add(jp, "Center");
        jp.setViewportView(jt);
        jt.setText("Teszt");
        setVisible(true);
    }

    public void lineAdd() {
        progress = new MyProgress();
        for (int i = 4000, b = 0; b <= i; b++) {
            jt.append(System.getProperty("line.separator"));
            jt.append(b + ". " + "sor");
            for (int j = 0; j < 300000; j++) {}
        }
        progress.dispose();
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == bt) {
            StartFeladat ft;
            Thread th;
            ft = new StartFeladat();
            th = new Thread(ft);
            th.start();
        }
    }

    class StartFeladat implements Runnable {

        public void run() {
            lineAdd();
           //további hívások.. stb
        }
    }
}

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

public class MyProgress extends JFrame {

    public JProgressBar progressBar;

    public MyProgress() {
        super();
        setSize(300, 80);
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setLocationRelativeTo(null);
        FlowLayout layout = new FlowLayout(FlowLayout.CENTER, 10, 10);
        setLayout(layout);
        progressBar = new JProgressBar(0, 100);
        progressBar.setPreferredSize(new Dimension(250,35));
        progressBar.setValue(0);
        progressBar.setStringPainted(false);
        progressBar.setIndeterminate(true);
        add(progressBar);

        this.setResizable(false);

        setVisible(true);
    }

}
Klassz!! :) közben én is csináltam egy hasonlót a fenti JDialog-al, de az kicsit "oroszosabb" :)) Köszönöm Szépen! :)
Belépés
E-mail cím:
Jelszó:

RSS források
-Hírek
-Cikkek
-Fórumok
Top pontgyűjtők
»Micu1.900
»Árnyék940
»vinie540
»Frostech0530
»djjjozsi470
»Riha420
»klorand370
»pelz370
»stl340
»Sztatty270
Hírek
»Cassandra-ra tér át a MySQL-ről a Digg is
»Letölthető a Mozilla Jetpack SDK első kiadása
»Saját alkalmazásboltot nyitott a Google
»Súlyos sebezhetőség minden Apache kiszolgálóban
»Natív 3D-s támogatás a legújabb Android fejlesztőkészletben
» több hír
PC Fórum hírek
»Lopta a Firefox Jetpack terveit a Mozilla ?
»Minden weboldalra beköltözne a Facebook
»Nem boldogul az legújabb merevlemezekkel az XP és a Linux
»Átírják a Firefox licencszerződését
»Több tízezer nebuló a Microsuliban
»Sebezhető az Internet Explorer és az Opera is
»Még márciusban megjelenik az Intel nyolcmagos szerverlapkája
»Hamis Core i7 processzorokat árultak a neten
Tagi blogok
»USB
»PHP, mint sablonmotor egyszerűen
»Én és linux
»Coming out