Problem z JprogressBar.

0

Witam, mam taki program, który oblicza na ilę sposobów można rozmienć kwotę na 2, 5, i 10zł. Program dla większych kwot długo liczy dlatego przydałby się pasek postępu. Postęp programu można mniej więcej opisać jako l10, gdzie l10 jest zmienną. Niestety to nie działa. Wiem że jest trochę źle. np to ppasek = new JProgressBar(0, max); . Proszę o pomoc.

package kwotawa;
import javax.swing.JCheckBox;
import java.io.FileNotFoundException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;


public class KwotaWA extends JFrame implements ActionListener
{
    private JLabel lPodajKwote, lLsp, lCzas;
    private JTextField tPodajKwote, tLsp, tCzas;
    private JButton bLicz, bWyjście;
    private JCheckBox chOnOff;
    private JProgressBar ppasek;
    int l10, l5, l2, progress, max;
    double kwota;
    long h, m, s, ms, tm;
    long lsp=0;
    private String shutdownCommand;
    public KwotaWA()
    {
        setSize(480, 320);
        setTitle("KwotaWA");
        setLayout(null);
        
        lPodajKwote = new JLabel("Podaj Kwotę:");
	lPodajKwote.setBounds(30, 20, 100, 50);
	add(lPodajKwote);
        
        lLsp = new JLabel("Liczba sposobów:");
	lLsp.setBounds(30, 115, 120, 50);
	add(lLsp);
        
        lCzas = new JLabel("Program liczył:");
	lCzas.setBounds(30, 160, 100, 50);
	add(lCzas);
        
        tPodajKwote = new JTextField(" ");
	tPodajKwote.setBounds(150, 35, 125, 20);
	add(tPodajKwote);
        
        tLsp = new JTextField(" ");
	tLsp.setBounds(150, 130, 125, 20);
	add(tLsp);
        tCzas = new JTextField(" ");
	tCzas.setBounds(150, 175, 250, 20);
	add(tCzas);
        
        chOnOff = new JCheckBox("ON/OFF");
        chOnOff.setBounds(345, 35, 100, 20);
        add(chOnOff);
        chOnOff.addActionListener(this);
        
        ppasek = new JProgressBar(0, max);
        ppasek.setBounds(100, 82, 280, 20);
        ppasek.setValue (0);
        ppasek.setStringPainted (true);
        add(ppasek);
        
        bLicz = new JButton("Enter");
	bLicz.setBounds(100, 225, 100, 20);
	add(bLicz);
	bLicz.addActionListener(this);
		
	bWyjście = new JButton("Wyjście");
	bWyjście.setBounds(250, 225, 100, 20);
	add(bWyjście);
	bWyjście.addActionListener(this);
     }
    
    

    public static void main(String[] args)  throws FileNotFoundException, IOException
   {
       KwotaWA window = new KwotaWA();
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       window.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
     
        
        Object z = e.getSource();
        if(z==bWyjście)
		{
			dispose();
		}
        else if(z==bLicz )
		{
                    PrintWriter zapis = null;
                    try 
                    {
                    kwota = Double.parseDouble(tPodajKwote.getText());
                    max=(int) (kwota/10);
                    long t1 = System.currentTimeMillis();
                        for(l10=0; l10<=kwota/10; l10++)
                            for(l5=0; l5<=kwota/5; l5++)
                                for(l2=0; l2<=kwota/2; l2++)
                                    if(2*l2 + 5*l5 + 10*l10 == kwota)
                                    {
                                        lsp++;
                                        progress=(l10);
                                        ppasek.setValue(progress);            
                                    }
                    long t2 = System.currentTimeMillis();
                    tm=t2-t1;
                    h=tm/3600000;
                    m=(tm-h*3600000)/60000;
                    s=(tm-h*3600000 - m*60000)/1000;
                    ms=(tm-h*3600000 - m*60000 - s*1000);
                    tLsp.setText(String.valueOf(lsp));
                    tCzas.setText(String.valueOf(tm));
                
                    zapis = new PrintWriter("data.txt");
                    zapis.println("Dla kwoty " +kwota+ " jest " +lsp+ " sposobów");
                    zapis.println("Program liczył " +h+ " godzin " +m+ " minut " +s+ " sekund " +ms+ " milisekund ");
                    zapis.close();
                    } 
                    catch (FileNotFoundException ex) 
                    {
                        Logger.getLogger(KwotaWA.class.getName()).log(Level.SEVERE, null, ex);
                    } finally 
                    {
                        zapis.close();
                    }
                   lsp=0;
                   tm=0;
                  
                        if(chOnOff.isSelected()==true)
                        {
                              Runtime runtime = Runtime.getRuntime();
                            try {
                                Process proc = runtime.exec("shutdown -s -t 0");
                            } catch (IOException ex) {
                                Logger.getLogger(KwotaWA.class.getName()).log(Level.SEVERE, null, ex);
                            }
                              System.exit(0);
                        }
                }
      
        
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
}

 
0

Takie coś powinno pomóc

new Thread(){
run(){
//tu zwiększasz licznik paska
}
}.start();
0

Nie działa, albo ja coś robię żle, pojaiwa się taki błąd invalid method declaration; return type required
Rozumiem że powienienm to wkleić w instrukcji warunkowej if o tak

if(2*l2 + 5*l5 + 10*l10 == kwota)
        lsp++;
        new Thread(){
        run(){
        ppasek.setValue(l10);
       }
       }.start();
}
0
package kwotawa;
import javax.swing.JCheckBox;
import java.io.FileNotFoundException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;


public class KwotaWA extends JFrame implements ActionListener
{
    private JLabel lPodajKwote, lLsp, lCzas;
    private JTextField tPodajKwote, tLsp, tCzas;
    private JButton bLicz, bWyjście;
    private JCheckBox chOnOff;
    private JProgressBar ppasek;
    int l10, l5, l2, max;
    int prg = 0;
    double kwota;
    long h, m, s, ms, tm;
    long lsp=0;
    private String shutdownCommand;
    public KwotaWA()
    {
        setSize(480, 320);
        setTitle("KwotaWA");
        setLayout(null);
        
        lPodajKwote = new JLabel("Podaj Kwotę:");
	lPodajKwote.setBounds(30, 20, 100, 50);
	add(lPodajKwote);
        
        lLsp = new JLabel("Liczba sposobów:");
	lLsp.setBounds(30, 115, 120, 50);
	add(lLsp);
        
        lCzas = new JLabel("Program liczył:");
	lCzas.setBounds(30, 160, 100, 50);
	add(lCzas);
        
        tPodajKwote = new JTextField(" ");
	tPodajKwote.setBounds(150, 35, 125, 20);
	add(tPodajKwote);
        
        tLsp = new JTextField(" ");
	tLsp.setBounds(150, 130, 125, 20);
	add(tLsp);
        tCzas = new JTextField(" ");
	tCzas.setBounds(150, 175, 250, 20);
	add(tCzas);
        
        chOnOff = new JCheckBox("ON/OFF");
        chOnOff.setBounds(345, 35, 100, 20);
        add(chOnOff);
        chOnOff.addActionListener(this);
        
        ppasek = new JProgressBar(0, 100);
        ppasek.setBounds(100, 82, 280, 20);
        ppasek.setValue (0);
        ppasek.setStringPainted (true);
        add(ppasek);
        
        bLicz = new JButton("Enter");
	bLicz.setBounds(100, 225, 100, 20);
	add(bLicz);
	bLicz.addActionListener(this);
		
	bWyjście = new JButton("Wyjście");
	bWyjście.setBounds(250, 225, 100, 20);
	add(bWyjście);
	bWyjście.addActionListener(this);
     }
    
    

    public static void main(String[] args)  throws FileNotFoundException, IOException
    {
       KwotaWA window = new KwotaWA();
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       window.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e){
     
        
        
        Object z = e.getSource();
        if(z==bWyjście)
		{
			dispose();
		}
        else if(z==bLicz )
		{
                    
                    PrintWriter zapis = null;
                    try 
                    {
                    kwota = Double.parseDouble(tPodajKwote.getText());
                    ppasek.setValue(prg); 
                    ppasek.repaint();
                    System.out.println(ppasek.getValue());
                    long t1 = System.currentTimeMillis();
                    for(l10=0; l10<=kwota/10; l10++)
                            for(l5=0; l5<=kwota/5; l5++)
                                for(l2=0; l2<=kwota/2; l2++)
                                    if(2*l2 + 5*l5 + 10*l10 == kwota)
                                    {
                                        lsp++;
                                        
                                        new Thread(){ 
                                        public void run() {
                                        prg=(int) ((1000*l10)/kwota+1);    
                                        ppasek.setValue(prg); 
                                        ppasek.repaint();
                                        System.out.println(ppasek.getValue());
                                        }; 
                                        }.start();
                                        
                                    }
                    long t2 = System.currentTimeMillis();
                    tm=t2-t1;
                    h=tm/3600000;
                    m=(tm-h*3600000)/60000;
                    s=(tm-h*3600000 - m*60000)/1000;
                    ms=(tm-h*3600000 - m*60000 - s*1000);
                    tLsp.setText(String.valueOf(lsp));
                    tCzas.setText(String.valueOf(tm));
                
                    zapis = new PrintWriter("data.txt");
                    zapis.println("Dla kwoty " +kwota+ " jest " +lsp+ " sposobów");
                    zapis.println("Program liczył " +h+ " godzin " +m+ " minut " +s+ " sekund " +ms+ " milisekund ");
                    zapis.close();
                    } 
                    catch (FileNotFoundException ex) 
                    {
                        Logger.getLogger(KwotaWA.class.getName()).log(Level.SEVERE, null, ex);
                    } finally 
                    {
                        zapis.close();
                    }
                   lsp=0;
                   tm=0;
                  
                        if(chOnOff.isSelected()==true)
                        {
                              Runtime runtime = Runtime.getRuntime();
                            try {
                                Process proc = runtime.exec("shutdown -s -t 0");
                            } catch (IOException ex) {
                                Logger.getLogger(KwotaWA.class.getName()).log(Level.SEVERE, null, ex);
                            }
                              System.exit(0);
                        }
                        
                }
      
        
        throw new UnsupportedOperationException("Not supported yet.");
        
    }
    
}

Załączam jeszcze raz mój kod, zrobiłem poprawki. i toretycznie liczy postęp programu, ale nie pokazuje tego na pasku JProgressBar. Drugim problemem jest to że po podaniu nowej kwoty, pasek postępu nie ustawia ponownie wartości na 0. Jeżeli ktoś ma trochę czasu to prosiłbym o pomoc. Program najlpiej chyba skompilować, i wtedy wszystko będzie widać co i jak. Nie podajcie zbyt dużych kwot, bo długo będzie liczył. Dla 10000 liczy ok minuty i 40sekund. Jeszcze raz dziękuję.

0

Bardzo dziwnie tworzysz wątki.

    public void actionPerformed(ActionEvent e)
    {
        Object z = e.getSource();
        if(z == bWyjście)
        {
             dispose();
        }
        else if(z == bLicz )
        {                    
             new Liczydlo().zaczynaj();
        }            
    }
    class Liczydlo implements Runnable
    {
        public void zaczynaj()
        {
            Thread thread = new Thread(this);
            thread.start();
        }
        public void run()
        {
            PrintWriter zapis = null;
            try 
            {
                kwota = Double.parseDouble(tPodajKwote.getText());
                ppasek.setValue(0); //wyzerowanie paska postępu
                ppasek.repaint();
                System.out.println(ppasek.getValue());
                long t1 = System.currentTimeMillis();
                for(l10=0; l10<=kwota/10; l10++)
                    for(l5=0; l5<=kwota/5; l5++)
                        for(l2=0; l2<=kwota/2; l2++)
                        if(2*l2 + 5*l5 + 10*l10 == kwota)
                        {
                            lsp++;
                            prg=(int) ((1000*l10)/kwota+1);    
                            ppasek.setValue(prg); 
                            ppasek.repaint();
                            System.out.println(ppasek.getValue());
                        }; 

                long t2 = System.currentTimeMillis();
                tm=t2-t1;
                h=tm/3600000;
                m=(tm-h*3600000)/60000;
                s=(tm-h*3600000 - m*60000)/1000;
                ms=(tm-h*3600000 - m*60000 - s*1000);
                tLsp.setText(String.valueOf(lsp));
                tCzas.setText(String.valueOf(tm));
 
                zapis = new PrintWriter("data.txt");
                zapis.println("Dla kwoty " +kwota+ " jest " +lsp+ " sposobów");
                zapis.println("Program liczył " +h+ " godzin " +m+ " minut " +s+ " sekund " +ms+ " milisekund ");
                zapis.close();
            } 
            catch (FileNotFoundException ex) 
            {
                Logger.getLogger(KwotaWa.class.getName()).log(Level.SEVERE, null, ex);
            } 
            finally 
            {
                zapis.close();
            }
            lsp=0;
            tm=0; 
        }
    }
0

Dziękuje bardzo.
W javie siędzę dopiero 2 miesiąc, zapewne jeszcze długa droga przed mną.
Mam jeszcze problem z tą linijką kodu

 Logger.getLogger(KwotaWa.class.getName()).log(Level.SEVERE, null, ex);

Co ona dokładnie robi?

1 użytkowników online, w tym zalogowanych: 0, gości: 1