JavaFX Temelleri (2) -...

Post on 06-Dec-2018

244 views 0 download

Transcript of JavaFX Temelleri (2) -...

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