ProgressBar Dolmuyor

Merhabalar, ProgressBar öğrenmeye çalışıyorum söyle bir sorun ile karşılaştım:
İlk başta gayet iyi çalışıyordu, progressbar doluyordu. Fakat bunu buton kullanarak yapmak istediğim for döngüsünü actionlistener’in içine aldığımda çalışıyor fakat progressbar’ın dolmasını göremiyorum.(direkt %100 oluyor).

import java.awt.event.ActionEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class ProgresssBarr {
	public static void main(String[]args) {
		JFrame frame = new JFrame("xxx");
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		frame.setLayout(null);
		frame.setSize(600,400);
		
		JProgressBar testp = new JProgressBar(0,100000);
		testp.setBounds(0, 0, 600, 20);
		testp.setValue(0);
		testp.setStringPainted(true); 
		
		JButton run = new JButton("Başlat");
		run.setBounds(140, 50, 300, 20);
		frame.add(testp);
		frame.add(run);
		frame.setVisible(true);
		
		
		run.addActionListener((ActionEvent e)->{
			for(int i = 0; i <= 100000; i++) {
				testp.setValue(i);
				System.out.println(i+" Toplama: "+pbtest.toplama()+" > "+testp.getString());
				System.out.println(i+" Çıkarma: "+pbtest.toplama()+" > "+testp.getString());
				System.out.println(i+" Çarpma: "+pbtest.toplama()+" > "+testp.getString());
				System.out.println(i+" Bölme: "+pbtest.toplama()+" > "+testp.getString());
			}
		});
		
		
		
	}
}

Buda diğer class’ın kodları:

import java.util.Random;

public class pbtest {
	static Random r = new Random();
	public static int toplama() {
		int x = r.nextInt(1000)+1;
		int y = r.nextInt(1000)+1;
		return x+y;
	}
	
	public static int cikarma() {
		int x = r.nextInt(1000)+1;
		int y = r.nextInt(1000)+1;
		return x-y;
	}
	
	public static int carpma() {
		int x = r.nextInt(1000)+1;
		int y = r.nextInt(1000)+1;
		return x*y;
	}
	
	public static int bolme() {
		int x = r.nextInt(1000)+1;
		int y = r.nextInt(100)+1;
		return x/y;
	}
}

Javayı bilmiyorum kodlara bakmadım ama sorun şu olabilir: Progressbar zaten anında dolmak zorundadır.Progressbar’ın dolması için dosya filan oluştursun.Dosya oluştuktan sonra %100 oluyor ise sıkıntı yok demektir

1 Beğeni

Olabilir ama işte bir tereddüt ettim çünkü actionlistener’in içine koymadan önce adım adım doluyodu.

Güzel oluyor öyle dolmasına bakmak :smiley:

1 Beğeni

Buradaki döngü hızlı bir şekilde işlendiği için bar hemen doluyor olabilir mi acaba?

1 Beğeni

Sanmıyorum çünkü eğer hızlı işlendiğinden olsa actionlistener’in içine koymadan öncede olurdu ama onda olmuyor sonuçta aynı kod tek fark butona basmam.

Eski kodunuzu da atın istiyorsanız.

import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
public class ProgresssBarr {
	public static void main(String[]args) {
		JFrame frame = new JFrame("xxx");
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		frame.setLayout(null);
		frame.setSize(600,400);
		
		JProgressBar testp = new JProgressBar(0,100000);
		testp.setBounds(0, 0, 600, 20);
		testp.setValue(0);
		testp.setStringPainted(true); 
		
		
	
		frame.add(testp);

		frame.setVisible(true);
		
		
		for(int i = 0; i <= 100000; i++) {
			testp.setValue(i);
			System.out.println(i+" Toplama: "+pbtest.toplama()+" > " +  testp.getString());
			System.out.println(i+" Çıkarma: "+pbtest.toplama()+" > "+  testp.getString());
			System.out.println(i+" Çarpma: "+pbtest.toplama()+" > "+  testp.getString());
			System.out.println(i+" Bölme: "+pbtest.toplama()+" > "+  testp.getString());
			
		}


		
		
		
	}
}

diğer class üstte[][]

Bilemiyorum.

1 Beğeni
testp.update(testp.getGraphics());

for döngüsünün içine söyle bir şey ekledim lakin ama bu sefer ProgressBar titrek oldu. Büyük ihtimal ile for döngüsüyle her seferinde yenilendiği içindir :confused:

Belki de tekrar sayısını azaltıp artış miktarını arttırmanız sorunu çözer.

1 Beğeni

Malesef çözülmedi.]]

Progressbar doluyor, ama arayüz donduğu için göremiyorsunuz. Thread kullanmanız gerekir.

public class ProgresssBarr {

    public static JProgressBar testp = new JProgressBar(0, 100000);

    public static void main(String[] args) {
        JFrame frame = new JFrame("xxx");
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.setSize(600, 400);

        testp.setBounds(0, 0, 600, 20);
        testp.setValue(0);
        testp.setStringPainted(true);

        JButton run = new JButton("Başlat");
        run.setBounds(140, 50, 300, 20);
        frame.add(testp);
        frame.add(run);
        frame.setVisible(true);

        run.addActionListener(a -> {
            new Thread(ProgresssBarr::doldur).start();
        });

    }

    public static void doldur() {
        for (int i = 0; i <= 100000; i++) {
            testp.setValue(i);
            System.out.println(i + " Toplama: " + pbtest.toplama() + " > " + testp.getString());
            System.out.println(i + " Çıkarma: " + pbtest.toplama() + " > " + testp.getString());
            System.out.println(i + " Çarpma: " + pbtest.toplama() + " > " + testp.getString());
            System.out.println(i + " Bölme: " + pbtest.toplama() + " > " + testp.getString());
        }
    }
}
2 Beğeni

Teşekkürler çözüldü.

1 Beğeni

Diğer örnekte niçin problem olmadığı hakkında bilginiz var mı?

1 Beğeni

Güzel bir soru :smiley: Az önce test ettim, gerçekten de donmuyor. Enteresan.

2 Beğeni

Siz cevabı yazmadan önce acaba arayüz kütüphanesi ayrı bir thread olarak mı çalışıyor diye düşünmüştüm. Bu açıklar belki durumu, sonuçta butonun bağlı olduğu fonksiyon da bu thread’da çalıştırıldığı için arayüzü dondurur.

2 Beğeni

Aynen o şekilde olabilir. Ama araştırmak lazım, Swing kendi başına bir dünya zaten. Eminim bir açıklaması vardır.

2 Beğeni