JavaFX Basics
Transkript
JavaFX Basics
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()); num.set(24.4); System.out.println(division.getValue()); denom.set(12.2); System.out.println(division.getValue()); // 0.2 // 4.0 // 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
Benzer belgeler
JavaFX Basics
final Button button = new Button("my button");
button.setOnAction(new EventHandler