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
WeakChangeListenerkullanarak zayıf referanslar oluşturun. - Unbind:
Bindingskullandığınızda, pencere kapandığındaunbind()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.


Yorumlar (0)
Yorum Yaz