Thread ile Jpanel Buton Text Değiştirme

Merhabalar, threadları anlamak için çeşitli denemeler yapyorum. Konsol ekranında örnekler yaptım fakat görsel bir form üzerinde de deneme yapmak istedim.
Yapmaya çalıştığım şey bir thread sınıfından iki adet örneği start() ile run ederek iki ayrı butonun üzerindeki yazıları değiştirmek. (Label de olabilir, öylesine deniyorum.)

isParcacigi.java class’ımın kodları


import java.util.logging.Level;
import java.util.logging.Logger;

public class isParcacigi extends Thread {
    int b;
    int sayi;
    
    public isParcacigi(int b) {
        this.b = b;
    }
    
    @Override
    public void run(){
        for (int i = b; i < Integer.MAX_VALUE; i++){
            //System.out.println(i);
            sayi++;
            Thread.sleep(500);
        }
    }
}

Butonlar.java class’ımın içeriği

/*
Burada netBeans'ın jPanel oluştururken eklediği hazır kodlar var. 
Çok kalabalık etmemesi için yazmıyorum. Kendimce açılan formun oluşturulması 
olayını tetiklerken butonların textlerini thread ile değiştirmeye çalıştım, kodlarım 
derlenme esnasında hata vermiyor fakat butonların textler değişmiyor... */

    isParcacigi ip1 = new isParcacigi(10);
    isParcacigi ip2 = new isParcacigi(20);
    
    private void acilma(java.awt.event.WindowEvent evt) {                        
        // TODO add your handling code here:
        
        ip1.start();
        ip2.start();
        b1.setText(ip1.sayi + "");
        b2.setText(ip2.sayi + "");
        
    } 

Thread kodlarinda butonlarin yazilarini degistirmeye calisan bir sey goremedim? Sadece birer sayiyi arttiriyorlar?

Hocam orada (thread kod class’ı run methodu içerisinde) mesela
b1.setText(sayi + "");
şeklinde bir kod yazdığımda çalıştıramadım. Bu nedenle aşağıdaki gibi denedim o da olmadı

    isParcacigi ip1 = new isParcacigi(10);
    isParcacigi ip2 = new isParcacigi(20);
    
    private void acilma(java.awt.event.WindowEvent evt) {                        
        // TODO add your handling code here:
        
        ip1.start();
        ip2.start();
        b1.setText(ip1.sayi + "");
        b2.setText(ip2.sayi + "");
        
    } 

Tuh, onunla ilgili yazdigim cevabi kaydetseymisim keske.

Sunu diyodum: GUI’ler threading deneyi yapmak icin kotu bir secenek cunku bildigim butun GUI kutuphaneleri degisikliklerin tek thread’den yapilmasini istiyor, cogunlugu da bu thread’in ana thread olmasi sartini kosuyor.

Dogrusu yapilacak islemleri thread’den bir queue’ya koyup ana thread’den okuyup yapmak. Kimi kutuphanelerin event/message loop’lari var (awt nasildi hatirlamiyorum), thread’ler oraya post ediyor, ana thread isliyor. Kimisinde manuel yapiyorsun, mesela ArrayBlockingQueue ile.

Aslinda threading kurcaliyorsan queue gibi senkronizasyon/iletisim mekanizmalarini kurcalamak icin de dogru bir zaman olabilir. Istersen thread icinde yapilacak degisikligi ortak bir listeye yazarak, ana thread’den de okuyup silerek basla. Ayni anda kullanildigi icin patladiginda korumali CopyOnWriteArrayList listesine gecebilirsin. Sonra bunu milyon kat daha hizli yapan Queue'larin faydasindan bahsederiz.

3 Beğeni