JavaFX Temelleri (2) Araç İpuçları (Tooltips), Yazı Tipleri (Fonts), Çalışma Ortamları ve Dağıtım
Oluşturma, JavaFX Özellikleri (JavaFX Properties), Gözlenebilirlik (Observability), Bağlanımlar (Bindings) ve JavaFX Koleksiyonları (JavaFX
Collectıons)
Araç İpuçları (Tooltips)
• Farenin bir GUI bileşeninin üzerine gelmesi durumunda gösterilen mesajlardır
• Yazılımın kullanılabilirliğini ve sezgiselliğini arttırır
• javafx.scene.control.Tooltip sınıfı
• Control sınıfı (Node sınıfının alt sınıfı) nesnelerine atanabilir • Control nesneleri: kullanıcı tarafından kullanılabilen (durumu değiştirilebilen)
nodlardır
• javafx.scene.control.Control soyut sınıfı
• Bir Control nesnesine araç ipucu atamak için: • void setTooltip(Tooltip tip)
• Tooltip sınıfı yapıcısı: Tooltip(String text)
Araç İpucu Örneği
Button button = new Button("my button");
button.setTooltip(new Tooltip "Button usage tip"));
Label label = new Label("my label");
label.setTooltip(new Tooltip("This is a label"));
rootNode.getChildren().add(button);
rootNode.getChildren().add(label);
TooltipExample Projesi
Yazı Tipleri
• Metnin görüntüsünü tanımlar (boyut ve karakterlerin görünümü)
• javafx.scene.text.Font sınıfı
• Karakterlerin görünümü yazı tipi yüzü (font face) ile tanımlıdır
• Yazı tipi boyutu nokta (point) cinsinden ifade edilir (1 nokta 1/72 inçtir)
• Sınıf yapıcıları: • Font(double size)
• “System” varsayılan yazı tipi yüzünü kullanır
• Font(String name, double size) • name: yazı tipi yüzü adı
Yazı Tipi Örneği
Canvas canvas = new Canvas(300, 200);
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.fillText("normal text", 50, 50);
gc.setFont(new Font(20));
gc.fillText("large text", 50, 100);
gc.setFont(new Font("Verdana", 20));
gc.fillText("large Verdana text", 50, 150);
rootNode.getChildren().add(canvas);
FontExample Projesi
Görsel Arayüzü (UI) Uygulama Mantığından Ayırmak • Cascading Style Sheets (CSS)
• Sahne grafiğindeki herhangi bir noda uygulanabilir
• Çalışma zamanında herhangi bir sahneye uygulanabilir • Uygulama görüntüsü dinamik olarak değiştirilebilir
• CSS dosyalararı ikili formata çevrilebilir • Çalışma zamanında ayrıştırma (parsing) yükü azalır ve uygulama performansı artar
• FXML: XML tabanlı işaret dili (markup language) • Sahne grafiği FXML dosyası içerisinde nodların bir hiyerarşisi olarak
gösterilebilir
• JavaFX Sahne Oluşturucu (JavaFX Scene Builder) • FXML dosyaları oluşturmak için kullanılan grafiksel araç
Çalışma Ortamları (1/2)
• Kendi başına çalışan program (standalone program) • Application.launch() metodunu çağıracak statik bir main() metodu gerektirir
• Java Web Start • Uygulama, bir web sayfasındaki bağlantıya web tarayıcısından tıklanarak
indirilir ve çalıştırılır
Çalışma Ortamları (2/2)
• Bir web sayfası içerisinde JavaScript kodu ile birlikte • Uygulama, bir web sayfası web tarayıcısında yüklendiğinde JavaScript
aracılığıyla çalıştırılır
• Uygulama web sayfası ile iletişim kurabilir
• Sınırlandırılmış ortam (sandbox) • Web tarayıcısından veya bir web sayfasından başlatılan uygulamalarda
kullanılır
• Zararlı kodlara karşı koruma sağlar
NetBeans ile Paketleme ve Dağıtım
• Projeler (Projects) penceresinden JavaFX projesini seçin
• Menülerden Run → Build Project
• Proje dizininde build ve dist dizinleri oluşturulacaktır
• build dizini: derlenmiş Java sınıfları (.class dosyaları)
• dist dizini: kullanıcıya dağıtılabilir dosyalar • .jar file: tek başına çalıştırılabilir uygulama
• .jnlp file: uygulamayı Java Web Start ile çalıştırır
• .html file: uygulamanın gömüldüğü web sayfası
NetBeans ile Kurulum Dosyası Oluşturma
• NetBeans ile JavaFX uygulamalarınız için platform bağımlı kurulum dosyaların oluşturabilirsiniz. Örn: Windows için installer.exe
• Şu an için desteklenen platformlar: • Windows
• MacOS
• Linux
• Daha fazla detay için: https://blogs.oracle.com/talkingjavadeployment/entry/native_packaging_for_javafx
JavaFX Özellikleri
• Stantart Java özellikleri JavaBeans Bileşen Mimarisini kullanır • Gizli (private) sınıf üyelerine standartlaştırılmış açık (public) metotlar
kullanılarak erişilebilir
• Getter ve setter metotları
• JavaFX özellikleri JavaBeans özelliklerini genişletir
• Her bir Java temel veri tipi için özellik sınıfları tanımlıdır • Tüm özellik sınıfları Property<T> arayüzünü gerçekleştirir
• JavaFX özellikleri, özellik sınıflarının örnekleridir
• Özellik değerleri için getter ve setter metotları bulunur
• Özelliklerin kendileri için getter metotları vardır
Özellikler Örneği
class Exam {
private final FloatProperty score = new SimpleFloatProperty(6);
public float getScore() {
return score.get();
}
public void setScore(float value) {
score.set(value);
}
public FloatProperty scoreProperty() {
return score;
}
}
PropertiesExample Projesi
Gözlenebilirlik – Observable Arayüzü
• Gözlenebilir nesne (observable object), içeriği değiştiğinde kendisini gözleyen gözlemcilere (observer) haber verir
• javafx.beans.Observable arayüzü
• void addListener(InvalidationListener listener)
• void removeListener(InvalidationListener listener)
Gözlenebilirlik – InvalidationListener Arayüzü
• javafx.beans.InvalidationListener arayüzü • void invalidated(Observable observable)
• invalidated() metodu gözlemlenebilir nesne içeriği geçersiz olduğunda çağırılır • Bir değer, içeriği en son değiştiğinden beri tekrar alınmamışsa geçersiz olur
Özellik Gözlenebilirliği
• Observable arayüzünü temel alan ObservableValue<T> arayüzü • void addListener(ChangeListener<? super T> listener)
• void removeListener(ChangeListener<? super T> listener)
• T getValue()
• Gözlenebilir değer değiştiğinde, getValue() metotu çağırılana kadar geçersiz olur
• Property<T> arayüzü ObservableValue<T> arayüzünü temel alır
• Gözlemci nesneler ChangeListener<T> arayüzünü gerçekleştirir • void changed(ObservableValue<? extends T> observable, T oldValue, T newValue)
Özellik Gözlemcisi Örneği
Exam mathsExam = new Exam();
mathsExam.scoreProperty().addListener(
new ChangeListener() {
public void changed(ObservableValue o,
Object oldVal, Object newVal) {
System.out.println("Old score " + oldVal +
", new score " + newVal);
}
});
mathsExam.setScore(10);
PropertiesExample Projesi
Bağlanımlar (Bindings) - Bağlılıklar
• Bağlı nesneler belli bir değeri bir veya daha fazla kaynak nesneyi kullanarak hesaplarlar
• Kaynak nesneler: bağlılıklar • ObservableValue<T> arayüzünü gerçekleştirirler
Bağlanımlar (Bindings)
• Bağlanım bağlılıklarını gözlemlerler
• Binding<T> arayüzü • ObservableValue<T> arayüzünü temel alır
• Bağlanımlar gözlemlenebilirdir. Bu yüzden başka bağlanımlar için bir bağlılıktır
• Bağlanımlar, Bindings sınıfının statik metotları kullanılarak oluşturulurlar
• Örnek bağlanımlar: • Matematiksel, mantıksal veya String ifadeler
Bağlanım Örneği
DoubleProperty num = new SimpleDoubleProperty(1.22);
DoubleProperty denom = new SimpleDoubleProperty(6.1);
NumberBinding division = Bindings.divide(num, denom);
System.out.println(division.getValue()); // 0.2
num.set(24.4);
System.out.println(division.getValue()); // 4.0
denom.set(12.2);
System.out.println(division.getValue()); // 2.0
BindingExample Projesi
Bağlanım Gözlemcisi Örneği
Exam mathsExam = new Exam();
Exam physicsExam = new Exam();
NumberBinding avgScore = Bindings.divide(
Bindings.add(mathsExam.scoreProperty(),
physicsExam.scoreProperty()), 2);
avgScore.addListener(new InvalidationListener() {
public void invalidated(Observable o) {
System.out.println("Observable invalidated");
}
});
mathsExam.setScore(10); // Observer is notified
System.out.println("Average score: " + avgScore.getValue());
BindingObserverExample Projesi
Bağlanım Alıştırması
• Student sınıfı özellikleri: • studyingDays: tamsayı özellik
• studyingHours: float özellik
• Günlük ortalama çalışma saatini gözlemleyin
Student myStudent = new Student();
myStudent.setStudyingDays(1);
myStudent.setStudyingHours(6);
...
myStudent.setStudyingDays(myStudent.getStudyingDays() + 1);
myStudent.setStudyingHours(myStudent.getStudyingHours() + 9);
Bağlanım Alıştırması Çözümü
NumberBinding hoursPerDay = Bindings.divide(
myStudent.studyingHoursProperty(),
myStudent.studyingDaysProperty());
hoursPerDay.addListener(new ChangeListener() {
public void changed(ObservableValue o,
Object oldVal, Object newVal) {
System.out.println("average hours per day: " + newVal);
}
});
BindingExercise Projesi
JavaFX Koleksiyonları
• Standart Java koleksiyonları: List<T>, Map<K, V>
• JavaFX koleskiyonları liste (list) ve haritalara (map) gözlenebilirlik ekler: • ObservableList, ObservableMap arayüzleri Observable arayüzünü temel alır
• ListChangeListener, MapChangeListener: gözlemci arayüzleri
• ListChangeListener.Change, MapChangeListener.Change: gözlemcilere bildirilen değişiklikler
• ObservableList ve ObservableMap nesneleri, listeleri ve haritaları kapsayacak şekilde oluşturulur: FXCollections
JavaFX Koleksiyonu Örnekleri (1/2)
List<String> list = new ArrayList<String>();
ObservableList<String> observableList =
FXCollections.observableList(list);
observableList.addListener(
new ListChangeListener() {
public void onChanged (
ListChangeListener.Change change) {
System.out.println("list has changed");
}
});
observableList.add("first item");
CollectionsExamples Projesi
JavaFX Koleksiyonu Örnekleri (2/2)
Map<String, String> map = new HashMap<String, String>();
ObservableMap<String, String> observableMap =
FXCollections.observableMap(map);
observableMap.addListener(new MapChangeListener() {
public void onChanged(MapChangeListener.Change change)
{
System.out.println("map has changed");
}
});
observableMap.put("first key", "first value"); observableMap.put("second key", "second value");
observableMap.remove("first key");
CollectionsExamples Projesi