Java İle Javafx Kütüphanesi Kullanarak Grafiksel Arayüz Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

JavaFX ile çalışmaya başlamadan önce sisteminizde doğru araçların kurulu olduğundan emin olmalısınız. 2026 yılı itibarıyla Java 21 veya üzeri LTS (Long Term Support) sürümlerini kullanmanız önerilir.

  • JDK (Java Development Kit): En az JDK 21 sürümü.
  • Build Tool: Maven veya Gradle (Bağımlılık yönetimi için zorunludur).
  • IDE: IntelliJ IDEA veya Eclipse (JavaFX desteği için eklentiler yüklü olmalıdır).
  • JavaFX SDK: Modüler yapıda olduğu için projenize Maven üzerinden eklenmesi en sağlıklı yöntemdir.

Projenizi oluştururken pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyerek JavaFX kütüphanesini projenize dahil edebilirsiniz:


    org.openjfx
    javafx-controls
    21.0.1

JavaFX ile İlk Pencereyi Oluşturma

JavaFX uygulamaları, Application sınıfından türetilen bir ana sınıf ile başlar. Uygulamanın yaşam döngüsü start() metodu ile yönetilir. Bu metod, pencerenin (Stage) ve sahnenin (Scene) oluşturulduğu yerdir.

Aşağıdaki örnek, boş bir pencere oluşturmanın en temel yolunu göstermektedir:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class IlkUygulama extends Application {
    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();
        Scene scene = new Scene(root, 400, 300);
        
        primaryStage.setTitle("JavaFX Merhaba Dünya");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Bu kodda Stage, pencerenin kendisini; Scene ise pencerenin içinde yer alan tüm görsel öğeleri (butonlar, yazılar, paneller) kapsayan konteynerı temsil eder.

Düzen (Layout) Yönetimi: Arayüzü Şekillendirme

JavaFX'te bileşenleri pencereye yerleştirmek için LayoutPane sınıfları kullanılır. En yaygın kullanılanlar VBox (dikey), HBox (yatay), GridPane (ızgara) ve BorderPane (kenar boşluklu) yapılarıdır.

Aşağıda, VBox kullanarak buton ve metin ekleme örneği yer almaktadır:

import javafx.scene.layout.VBox;
import javafx.scene.control.Button;
import javafx.scene.control.Label;

VBox layout = new VBox(10); // 10 piksel boşluk
Label mesaj = new Label("Hoş geldiniz!");
Button buton = new Button("Tıkla");

layout.getChildren().addAll(mesaj, buton);

VBox, eklenen öğeleri yukarıdan aşağıya doğru sıralar. getChildren().addAll() metodu ile birden fazla bileşeni tek seferde ekleyebilirsiniz.

Olay Yönetimi (Event Handling)

Bir butona tıklandığında veya bir metin kutusuna yazı yazıldığında gerçekleşecek işlemleri yönetmek için EventHandler arayüzü kullanılır. 2026 standartlarında Lambda ifadeleri (->) ile bu işlemler çok daha kısa ve okunabilir hale gelmiştir.

buton.setOnAction(event -> {
    mesaj.setText("Butona basıldı!");
    System.out.println("İşlem başarılı.");
});

Bu kod, butonun setOnAction metoduna bir lambda ifadesi atar. Kullanıcı butona bastığında, mesaj etiketinin içeriği güncellenir.

JavaFX ve CSS ile Tasarım

JavaFX, arayüzü güzelleştirmek için CSS (Cascading Style Sheets) kullanmanıza olanak tanır. Bu, kodunuzu görsel tasarımdan ayırmanızı sağlar ve profesyonel bir görünüm sunar.

scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());

style.css dosyanızda şu şekilde tanımlamalar yapabilirsiniz:

.button {
    -fx-background-color: #4CAF50;
    -fx-text-fill: white;
    -fx-font-size: 14px;
}

JavaFX Bileşenlerinin Karşılaştırmalı Özeti

Aşağıdaki tablo, JavaFX'te sıkça kullanılan düzen panellerinin kullanım amaçlarını özetlemektedir:

Panel Tipi Kullanım Amacı Avantajı
VBox Dikey sıralama Basit listeler için idealdir.
HBox Yatay sıralama Menü çubukları için uygundur.
GridPane Satır ve sütun Form tasarımları için mükemmeldir.
BorderPane 5 Bölge (Üst, Alt, Sol, Sağ, Orta) Ana uygulama iskeleti için kullanılır.

Güvenlik Uyarısı: JavaFX uygulamalarında kullanıcıdan alınan verileri işlerken her zaman "input validation" (girdi doğrulama) uygulayın. Doğrudan veritabanı sorgularında kullanıcı girdilerini kullanmak SQL Injection riskine yol açar; mutlaka PreparedStatement kullanın.

Sıkça Sorulan Sorular

JavaFX ile Swing arasındaki fark nedir?

JavaFX, Swing'e göre daha moderndir, CSS desteği sunar ve donanım hızlandırmalı grafikler kullanarak daha akıcı bir kullanıcı deneyimi sağlar.

FXML nedir, kullanmalı mıyım?

FXML, arayüzü XML formatında tanımlamanızı sağlayan bir dildir. Büyük projelerde arayüz tasarımı ile Java kodunu ayırmak için kesinlikle önerilir.

Uygulamayı nasıl paketlerim?

2026 standartlarında jlink ve jpackage araçlarını kullanarak uygulamanızı bağımsız bir kurulum dosyası (exe, dmg, deb) haline getirebilirsiniz.

JavaFX mobil cihazlarda çalışır mı?

JavaFX, Gluon Mobile gibi ek kütüphaneler aracılığıyla Android ve iOS platformlarında çalışabilir, ancak ana odak noktası masaüstü uygulamalarıdır.

Neden "Module-info.java" hatası alıyorum?

Java 9 ve sonrasında gelen modül sistemi nedeniyle, JavaFX kütüphanelerini kullanırken module-info.java dosyanızda gerekli modülleri (javafx.controls, javafx.fxml) "requires" etmeniz gerekir.

JavaFX Uygulamalarında Performans Optimizasyonu ve İleri İpuçları

JavaFX uygulamalarınız büyüdükçe, özellikle karmaşık arayüzlerde performans düşüşleri yaşanabilir. Kullanıcı deneyimini en üst seviyede tutmak için render süreçlerini ve bellek yönetimini optimize etmek kritik öneme sahiptir.

UI Thread (JavaFX Application Thread) Yönetimi

JavaFX'te tüm arayüz güncellemeleri JavaFX Application Thread üzerinde gerçekleşmelidir. Eğer arka planda ağır bir işlem (veritabanı sorgusu, ağ isteği vb.) yapıyorsanız, bu işlemler arayüzü donduracaktır. Bu durumu engellemek için Task veya Service sınıflarını kullanmalısınız.

import javafx.concurrent.Task;

Task task = new Task() {
    @Override
    protected Void call() throws Exception {
        // Ağır işlem burada yapılır
        Thread.sleep(3000); 
        return null;
    }
};

task.setOnSucceeded(e -> {
    // İşlem bittiğinde arayüzü güncelle
    System.out.println("İşlem tamamlandı!");
});

new Thread(task).start();

Bellek Sızıntılarını Önleme (Memory Leaks)

JavaFX'te en yaygın hata, artık kullanılmayan bileşenlerin (özellikle ObservableList veya Listener eklenmiş nesneler) referanslarının temizlenmemesidir. Bir pencereyi kapattığınızda, o pencereye bağlı olan tüm dinleyicileri (listeners) kaldırmanız gerekir. Aksi takdirde Garbage Collector nesneyi bellekten silemez.

  • WeakListeners: Mümkünse WeakChangeListener kullanarak zayıf referanslar oluşturun.
  • Unbind: Bindings kullandığınızda, pencere kapandığında unbind() metodunu çağırmayı unutmayın.

JavaFX Uygulamaları İçin Hata Ayıklama (Debugging) Stratejileri

Geliştirme sürecinde arayüzün neden beklediğiniz gibi görünmediğini veya bir olayın neden tetiklenmediğini anlamak için bazı profesyonel araçlar mevcuttur.

Scenic View Kullanımı

Scenic View, JavaFX uygulamaları için tarayıcılardaki "Öğe Denetle" (Inspect Element) aracına benzer bir görsel hata ayıklayıcıdır. Uygulamanız çalışırken sahne grafiğini (Scene Graph) canlı olarak incelemenizi, CSS stillerini anlık değiştirmenizi ve bileşenlerin boyutlarını görmenizi sağlar.

CSS Hata Ayıklama

CSS dosyalarınızdaki yazım hataları JavaFX tarafından genellikle sessizce yutulur ve stil uygulanmaz. Bu durumu kontrol etmek için uygulamanızı başlatırken şu parametreyi ekleyebilirsiniz:

// Uygulama başlatma argümanlarına ekleyin:
-Djavafx.verbose=true

Bu parametre, CSS ayrıştırma hatalarını ve yükleme sorunlarını konsola dökerek, stil dosyalarınızdaki hataları hızlıca tespit etmenize yardımcı olur.

Uygulama Performansını İzleme Tablosu

Sorun Çözüm Yolu
Arayüz donuyor Platform.runLater() veya Task API kullanın.
Yüksek RAM kullanımı Gereksiz ObservableList referanslarını temizleyin.
CSS stilleri çalışmıyor -Djavafx.verbose=true ile logları kontrol edin.
Animasyon takılıyor Timeline yerine AnimationTimer kullanmayı deneyin.

Sonuç

JavaFX, Java dünyasında masaüstü uygulamaları geliştirmek için standart ve güçlü bir araçtır. Bu rehberde, bir uygulamanın temel iskeletini kurmayı, bileşenleri yerleştirmeyi, olayları yönetmeyi ve CSS ile görselleştirmeyi öğrendiniz. Bir sonraki adımınız, FXML kullanarak daha karmaşık arayüzler tasarlamak ve veritabanı entegrasyonu ile uygulamalarınızı dinamik hale getirmek olmalıdır.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Ticari yazılımlarınızda güvenlik duvarları, veri şifreleme ve yetkilendirme gibi ileri seviye güvenlik önlemlerini projenizin mimarisine dahil etmeyi unutmayın.

Bu yazıya tepkinizi paylaşın:
Selin Korkmaz

Kendin yap (DIY) projeleri ve sürdürülebilir yaşam ipuçları üzerine odaklanıyorum. Okuyucularıma bütçe dostu ve yaratıcı çözüm önerileri sunmaktan keyif alıyorum.

Yorumlar (0)

Yorum Yaz