JavaFX Temelleri (2) -...

Preview:

Citation preview

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