Konular

SwingWorker Thread Kullanımı‏ ve Uygulama Örneği

Multi tasking işlemler için bir yol...

Multi-threading uygulamalarımızda Swing kullanacağımız zaman dikkat edilmesi gereken 2 nokta var.

1- Zaman alan işlemlerin Event Dispatch Thread üzerinde koşturulmaması gerekir. Aksi takdirde programımız işlem yaparken yanıt veremez hale gelecektir.

2- Programımızda Swing ile ilgili kullanmış olduğumuz tüm componentlerin Event Dispatch Thread üzerinden koşturulması.

 

Yukarıdaki veriler ışığında şu sonuç ortaya çıkıyor:

Programımız için Swing componentlerini kullanan bir GUI tasarladığımızda, bize en az 2 adet Thread lazım.

Birinci Thread’i uzun zaman alacak işlemlerimiz için kullanacağız, diğer Thread’imizide yani Event Dispatch Thread ‘inide tüm GUI bileşenleri için kullanacağız.

Zaman alan işlemlerimiz programın arka tarafında çalışıp, işlemini tamamladığında GUI’mizi update edecek. Ve sonuç olarak kusursuz işleyen becerekli bir programa sahip olacağız.

 

SwingWorker’ın Yapısında Bulunan Metodlar

doInBackground(): Uzun süren işlemlerin / hesaplamaların yapılacağı zaman çağırılacak thread.

done(): doInBackground() dan gelen sonuçları Event Dispatch Thread üzerinde koşturur.

execute(): SwingWorker objesinde bir threadi çalıştırmak için çağırdığımız metod.

get(): Programımız tarafından yapılan hesap işleminin tamamlanmasını bekler ve hesap işleminden çıkan sonucu döndür.

publish(): doInBackground() metodundan gelen orta sonuçları Event Dispatch Thread tarafında koşturulması için gönderir.

process (): publish() metodundan gelen orta sonuçları alır ve Event Dispatch Thread tarafında koşturulması için gönderir.

setProgress(): Thread’imizle ilgili ara değerler göndermek için kullanıyoruz. Genelde Progress bar’ı update ederken kullanıyor.

 

Şimdi basit bir örnek ile inceleyelim. Yapacağımız örneği genel olarak açıklayacak olursak; Örnektekteki programımız 2 classdan oluşuyor. Fibonacci sayılarının nasıl bulunduğunu göreceğiz. FibonacciCalculator classı swingWorker’ımızın çalışacağı alan ve GUI classıda isminden de anlaşılabileceği üzere Kullanıcı arayüzünün bulunduğu kısım. Şimdi dilerseniz kodlara ve içerisinde yorumlara göz atalım..

Class FibonacciCalculator


import java.util.concurrent.ExecutionException;
import javax.swing.JLabel;
import javax.swing.SwingWorker;

/**
 *
 * @author Ferhan Akman
 *
 * @date 24.09.2008
 *
 */

public class FibonacciCalculator extends SwingWorker {

    private final long n;
    private final JLabel resultJLabel;

    public FibonacciCalculator(long no, JLabel label) {

        n = no;
        resultJLabel = label;

    }

    //fibonacci(long number) fonksiyonnuna hesaplayacağımız elemanın sayısını yazıyoruz.
    public Object doInBackground() {

        long nthFib = fibonacci(n);
        return String.valueOf(nthFib);

    }

    /*
     doInBackground() fonksiyonundan geriye dönecek olan değer done() fonksiyonuna gelir. burada koşullara göre GUI üzerinde değişiklik yapmasını söylüyoruz. işlemimiz tamamlandığında, sonuç get() fonksiyona gelecek. biz burada resultJLabel’ına sonucu yazmasını söylüyoruz.
     */

    protected void done() {

        try {

            resultJLabel.setText((String) get());

        } catch (InterruptedException e) {

            resultJLabel.setText("işlem kullanıcı tarafından durduruldu!");

        } catch (ExecutionException e) {

            resultJLabel.setText("işlem çalışırken çalışma hatası meydana geldi!");

        }

    }

    //recursive bir fonksiyon kullanarak fibonacci sayısını hesaplıyoruz.
    private long fibonacci(long number) {
       
        if (number == 0 || number == 1) {
            return number;
        } else {
            return fibonacci(number - 1) + fibonacci(number - 2);
        }
    }

}
 

 Class GUI

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

/**
 * @author Ferhan Akman
 * @date 24.09.2008
 *
 */

public class GUI extends JFrame implements ActionListener {

     // girilen sayı kadar fibonacci getirelecek kısım
    JPanel ustPanel = new JPanel(new GridLayout(2, 2, 5, 5));
    JTextField numberJTF = new JTextField();
    JButton goJBtn = new JButton("GO");
    JLabel fibonacciJLabel = new JLabel();

    //sıradaki fibonacci sayısını bulmakta kullanacağımız alan
    JPanel altPanel = new JPanel(new GridLayout(2, 2, 5, 5));
    long n1 = 0;
    long n2 = 1;
    int count = 1;

    JLabel nJLabel = new JLabel("1. Fibonacci sayısı: ");
    JLabel nFibonacciJLabel = new JLabel(String.valueOf(n2));
    JButton nextNumberButton = new JButton(" Sıradaki Sayı");

    public GUI() {

        super("Fibonacci Numaraları Ferhan Akman ");
        JPanel panel = new JPanel(new GridLayout(2, 1, 10, 10));
        ustPanel.setBorder(new TitledBorder(new LineBorder(Color.BLACK), "SwingWorker Çalışma Sahası"));
        goJBtn.addActionListener(this);
        ustPanel.add(new JLabel("Getirilecek Fibo. Sayısı: "));
        ustPanel.add(numberJTF);
        ustPanel.add(goJBtn);
        ustPanel.add(fibonacciJLabel);
        altPanel.setBorder(new TitledBorder(new LineBorder(Color.BLACK), "SwingWorker Olmayan Kısım"));
        nextNumberButton.addActionListener(this);
        altPanel.add(nJLabel);
        altPanel.add(nFibonacciJLabel);
        altPanel.add(nextNumberButton);
        panel.add(ustPanel);
        panel.add(altPanel);
        setContentPane(panel);
        setVisible(true);
        setSize(455, 200); // pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent e) {

        Object obj = e.getSource();
        JButton button = (JButton) obj;

        if (button == goJBtn) {

            long n;

            try {
                n = Long.parseLong(numberJTF.getText());
            } catch (NumberFormatException e1) {
                fibonacciJLabel.setText(" Tam sayı girin! ");
                return;
            }

            fibonacciJLabel.setText(" Hesaplanıyor… ");
            FibonacciCalculator task = new FibonacciCalculator(n, fibonacciJLabel);
            task.execute();

        }

        if (button == nextNumberButton) {

            long temp = n1 + n2;

            n1 = n2;
            n2 = temp;
            ++count;
            nJLabel.setText(count + ". Fibonacci sayısı: ");
            nFibonacciJLabel.setText(String.valueOf(n2));
        }

    }

    public static void main(String[] args) {

        GUI app = new GUI();

    }

}
 

 

SwingWorker Thread Kullanımı‏ ve Uygulama Örneği

Kaynak:

Yorumunuzu Ekleyin

Java Applet Nedir?

Applet örnekleri,applet ve japplet farkı

49,192 Okunma 4 Yorum 05/03/2010 09:49:53

Java Applet Nedir?

Java applet nedir?apllet Örnekleri,applet ve japplet farkı

31,533 Okunma 1 Yorum 11/03/2010 08:59:42

Java Applet Layout Kullanımları

setLayout(null); setLayout(new FlowLayout()); setLayout(new BorderLayout()); new CardLayout(); Yerleşim Yöneticileri

29,956 Okunma 1 Yorum 26/01/2010 00:09:26 12/04/2017 00:12:53

Connecting to a MySQL Database

This document demonstrates how to set up a connection to a MySQL database from NetBeans IDE 6.1. Once connected, you can begin working with MySQL in the IDE's Database Explorer by creating new databases and tables, populating tables with data, and running SQL queries on database structures and content. This tutorial is designed for beginners with a basic understanding of database management, who want to apply their knowledge to working with MySQL in NetBeans IDE.

27,233 Okunma Henüz yorum yapılmamış 16/10/2008 18:48:41

Applet Nedir?

Appletlerin temel özellikleri ve kısıtlamalarının aşılması

25,864 Okunma Henüz yorum yapılmamış 03/01/2009 05:42:13

Java Aplleti imzalamak (Signed applet)

Security manager adlı sistemi sayesinde koda bazı sınırlamalar koyarak kullanıcıya zarar vermesi önlenir. Appletlerdeki bu sınırlamayı aşmanın tek yolu signed applet yaratmaktır

25,393 Okunma Henüz yorum yapılmamış 03/07/2010 17:36:51

Kullanıcının Bilgisayarında İşlem Yapmaya Yetkili Güvenilir (Signed) Applet Yazmak

Applet kodlarınız kendi makinenizde sorunsuzca çalışıyor ancak webe attığınızda çalışmıyorsa sebebi appletlerin güvenlik sınırlamalarıdır. Bunu aşmak için appleti imzalamalısınız ve kullanıcılarda appletin bilgisayarlarında yapabileceklerini kabul ettiklerinde ancak applet çalışacaktır. Buna Yerel Dosya Sistemine Erişmeye Yetkili Güvenilir Applet yazmakta denebilir.

24,971 Okunma 1 Yorum 04/07/2010 16:19:54

Java İlk Kodlar (jcreator)

Java classpath tanımlamaları, consolda ilk program yazılması, derlenmesi, çalıştırılması aynı uygulamanın netbeansta yapılışı ve class, java ve jar dosyalarının gösterilmesi

23,943 Okunma Henüz yorum yapılmamış 27/10/2008 14:22:54

Java Applet JFileChooser

Java swing arayüzlerinden - dosya sistemine erişimi sağlayan JFileChooser sınıfının detayları

22,683 Okunma Henüz yorum yapılmamış 19/07/2010 23:39:20

Dosya Gezinti Peceresi Açmak

NetBeans IDE'si ile bir dosya açma penceresi açarak dosya sisteminde gezinti yapan ve sonuçta seçilen dosyayı ekrana yazıp, kaç karakterden oluştuğunu veren bir uygulama.

20,136 Okunma Henüz yorum yapılmamış 07/11/2008 10:41:35

Yükleniyor...