Temel JavaFX Bileşenleri (2) TextField, ScrollPane, TreeView ve TableView,
Metin Alanı (TextField) (1/2) javafx.scene.control.textfield sınıfı Kullanıcıdan tek satırlık metin almakta kullanılır TextField(): Metin alanı boş bir şekilde oluşturulur TextField(String text): metin alanına text metnini yazarak oluşturur O anki metin içeriğini almak için: String gettext() Metni programdan değiştirmek için: settext(string value) Kullanıcı metin alanındayken <Enter> tuşuna basarsa bir ActionEvent oluşur
Metin Alanı (TextField) (2/2) Metin alanı boşken kullanıcıya ipucu vermek için: setprompttext(string value) Mesaj açık (düşük yoğunluklu) bir renk kullanılarak gösterilir Diğer metotlar: selectrange(int anchor, int caretposition) selectall() copy(), cut(), paste() inserttext(int index, String text) deletetext(int start, int end) TextField alt sınıfı: javafx.scene.control.passwordfield Girilen karakterleri maskeler
Metin Alanı Örneği final TextField textfield = new TextField(); final Label label = new Label(); textfield.setonaction(new EventHandler<ActionEvent>() { public void handle(actionevent event) { label.settext(textfield.gettext()); textfield.settext("<text moved to label>"); textfield.selectall(); } }); TextFieldExample Projesi
Kaydırma Panosu (ScrollPane) (1/3) javafx.scene.control.scrollpane sınıfı Control sınıfının alt sınıfı Görsel bileşenin boyutu, bileşen için ayrılan boyutu aştığında kullanılır Örnekler:büyük resim, uzun metin Kaydırmak için, kaydırma çubukları (scrollbars) kullanılır Dikey ve yatay kaydırma çubukları ScrollPane(): boş panel ScrollPane(Node content): content pano içerisine yerleştirilir setcontent(node content) Kaydırılacak içerik program akışı sırasında dinamik olarak değiştirilebilir
Kaydırma Panosu (ScrollPane) (2/3) Görüş alanı (viewport): kaydırılan içeriğin gösterildiği alan setprefviewportheight(double height) setprefviewportwidth(double width) Fare tıklanıp sürüklenerek içeriğin görünen kısmı kaydırılabilir Bu özellik normalde aktive edilmemiştir setpannable(boolean enable) Kaydırılan içeriğin pozisyonu program ile değiştirilebilir: setvvalue(double value) sethvalue(double value) 0 ve 1 arasında değerler
Kaydırma Panosu (ScrollPane) (3/3) ScrollPane.ScrollBarPolicy numaralandırması (enum) NEVER Kaydırma çubuğu hiçbir zaman gözükmez ALWAYS Kaydırma çubuğu her zaman gözükür AS_NEEDED Gösterilen içeriğin boyutuna göre, kaydırma çubuğu gösterilir veya gösterilmez Bir kaydırma panosuna ait, kaydırma çubuğu politikasını değiştirmek için: setvbarpolicy(scrollbarpolicy value) sethbarpolicy(scrollbarpolicy value) Varsayılan politika hem yatay hem de dikey çubuklar için: AS_NEEDED
Kaydırma Panosu Örneği ImageView imageview = new ImageView( "http://www.clker.com/cliparts/9/0/f/0/12573692281783328442hmmotuhi.png"); ScrollPane scrollpane = new ScrollPane(imageView); scrollpane.setprefviewportheight(200); scrollpane.setprefviewportwidth(300); scrollpane.setvvalue(0.4); scrollpane.sethvalue(0.7); scrollpane.setpannable(true); ScrollPaneExample Projesi
TreeView (1/3) Veri elemanlarının ağaç yapısına benzer şekilde hiyerarşik bir biçimde gösterilmesini sağlar Örnek: dosya sistemi içeriği javafx.scene.control.treeview<t> sınıfı T: ağaç elemanlarının tipi Tepe nodu (root node), dal nodlar (branch nodes) ve yaprak nodlar (leaf or terminal nodes) Alt ağaç (subtree): bir dal nod ve onun alt nodlarından oluşan ağaç
TreeView (2/3) Nod yolu (node path): tepe nodundan belirli bir noda giden nod sırası Dallar kullanıcı tarafından açılabilir (expand) veya kapanabilir (collapsed) Gerektiğinde kaydırma çubukları (scrollbars) otomatik olara keklenir veya çıkarılır TreeView(TreeItem<T> root): kök nodu root olan ağaç Ağaç nodları: javafx.scene.control.treeitem<t> nesneleri
TreeView (3/3) Bir ağaç oluşturmak için: Çocuğu olmayan nodları oluşturun TreeItem(T value) Kök nodun çocuklarını kök noda ekleyin. Diğer nodları da kendi anne nodlarına ekleyin: Bir nodun alt nodlarının (çocuklarının) listesini almak: ObservableList<TreeItem<T>> getchildren() Bu listeye yeni nodlar eklemek: add veya addall metotları TreeItem<T> sınıfının diğer metotları: T getvalue() TreeItem<T> getparent()
TreeView Örneği TreeItem<String> house = new TreeItem("House"); TreeItem<String> livingroom = new TreeItem("Living Room"); TreeItem<String> bedroom = new TreeItem("Bedroom"); house.getchildren().addall(livingroom, bedroom); livingroom.getchildren().addall( new TreeItem("Table"), new TreeItem("Sofa")); TreeView<String> treeview = new TreeView(house); TreeViewExamples Projesi
TreeView Seçim Modeli MultipleSelectionModel<TreeItem<T>> getselectionmodel() Çoklu seçim normalde aktive edilmemiştir Ağaç elemanı seçim olaylarından haberdar olmak için: Açaç seçim modelini elde edin Eğer tekli seçim modeli ise: Seçim modeli üzerinden selecteditem özelliğini elde et selecteditem özelliği üzerine bir değişim dinleyicisi kaydet Eğer çoklu seçim modeli ise: Seçim modeli üzerinden selecteditems gözlemlenebilir listesini elde et selecteditems gözlemlenebilir listesi üzerine bir InvalidationListener nesnesi kaydet
TreeView Seçim Dinleyicisi Örneği final Label label = new Label(); MultipleSelectionModel<TreeItem<String>> model = treeview.getselectionmodel(); model.selecteditemproperty().addlistener( new ChangeListener<TreeItem<String>>() { public void changed(observablevalue<? extends TreeItem<String>> o, TreeItem<String> oldval, TreeItem<String> newval) { label.settext("selected item: " + ((newval!= null)? newval.getvalue() : "<none>")); } }); TreeViewExamples Projesi
TreeView Seçim Dinleyicisi Alıştırması Bir önceki örnekteki TreeView için çoklu seçim özelliğini aktifleştirin TreeView üzerindeki seçim değişikliklerini dinleyen bir dinleyici gerçekleştirin O anda seçilen elemanların değerlerini bir etiket üzerinde gösterin Ağaç üzerinde seçim her değiştiğinde bu etiketi güncelleyin
TreeView Seçim Dinleyicisi Alıştırması Çözümü model.setselectionmode(selectionmode.multiple); model.getselecteditems().addlistener( new InvalidationListener() { public void invalidated( Observable observable) { ObservableList<TreeItem<String>> list = (ObservableList<TreeItem<String>>) observable; String text = "Selected items: "; for (TreeItem<String> item : list) text += item.getvalue() + ' '; label.settext(text); } }); TreeViewExamples Projesi
javafx.scene.control.tableview<s> Verileri bir tabloya ait satır ve sütunlar halinde organize bir biçimde gösterir TableView(ObservableList<S> items) S: tabloda gösterilen elemanların tipi bir satırda bir eleman Elemanların listesi değiştiğinde tablo otomatik olarak güncellenir Satırlar, kullanıcının sütun başlıklarına tıklaması halinde sıralanabilir Tablo sütunlarını tanımlamak için: Sütun listesi alınır ObservableList<TableColumn<S,?>> getcolumns() Listeye yeni sütunlar eklenir
TableView Sütunları (1/3) javafx.scene.control.tablecolumn<s, T> sınıfı S: tablodaki elemanların tipi T: belirli bir sütundaki hücrelerde gösterilen verinin tipi TableColumn(String text): text sütun başlığında söterilen metin
TableView Sütunları (2/3) Belirli bir hücredeki verinin nasıl elde edileceğinin belirlenmesi: setcellvaluefactory(callback<celldatafeatures<s, T>, ObservableValue<T>> value) javafx.util.callback<p, R>: geriçağırımlar (callback) için jenerik arayüz P: geriçağırım metoduna gönderilen parametrenin tipi R: geriçağırım metodu için dönüş tipi R call(p param)
TableView Sütunları (3/3) CellDataFeatures<S, T>: TableColumn<S, T> sınıfı içinde tanımlanan alt sınıf Belli bir tablo hücresi için tüm gerekli bilgileri sağlar TableView<S> gettableview() TableColumn<S, T> gettablecolumn() S getvalue() Bir TableView sütunu için hücre değeri fabrikası (cell value factory): CellDataFeatures<S, T> nesnesini girdi olarak alır ObservableValue<T> nesnesini çıktı olarak verir Gözlenebilir değer değiştiğinde, hücre içerikleri otomatik olarak güncellenir
TableView Örneği (1/4) public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } } public String getname() { return name; } public int getage() { return age; } public void setname(string value) { name = value; } public void setage(int value) { age = value; } TableViewExamples Projesi
TableView Örneği (2/4) Person john = new Person("John", 20); Person peter = new Person("Peter", 22); ObservableList<Person> people = FXCollections.observableArrayList(john, peter); TableView<Person> tableview = new TableView<>(people); TableViewExamples Projesi
TableView Örneği (3/4) TableColumn<Person, String> namecol = new TableColumn<>("Name"); namecol.setcellvaluefactory( new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() { }); public ObservableValue<String> call( CellDataFeatures<Person, String> param) { return new ReadOnlyObjectWrapper( param.getvalue().getname()); } TableViewExamples Projesi
TableView Örneği (4/4) TableColumn<Person, Integer> agecol = new TableColumn<>("Age"); agecol.setcellvaluefactory( new Callback<CellDataFeatures<Person, Integer>, ObservableValue<Integer>>() { public ObservableValue<Integer> call( CellDataFeatures<Person, Integer> param) { return new ReadOnlyObjectWrapper( param.getvalue().getage()); } }); tableview.getcolumns().addall(namecol, agecol); TableViewExamples Projesi
JavaFX Özellikleri ile TableView (1/4) public class ObservablePerson { private final StringProperty name = new SimpleStringProperty(); private final IntegerProperty age = new SimpleIntegerProperty(); public ObservablePerson(String name, int age) { this.name.set(name); this.age.set(age); } } public String getname() { return name.get(); } public int getage() { return age.get(); } public void setname(string value) { name.set(value); } public void setage(int value) { age.set(value); } public StringProperty nameproperty() { return name; } public IntegerProperty ageproperty() { return age; } TableViewExamples Projesi
JavaFX Özellikleri ile TableView (2/4) ObservablePerson john = new ObservablePerson("John", 20); ObservablePerson peter = new ObservablePerson("Peter", 22); ObservableList<ObservablePerson> people = FXCollections.observableArrayList(john, peter); TableView<ObservablePerson> tableview = new TableView<>(people); TableViewExamples Projesi
JavaFX Özellikleri ile TableView (3/4) TableColumn<ObservablePerson, String> namecol = new TableColumn<>("Name"); namecol.setcellvaluefactory( new Callback<CellDataFeatures<ObservablePerson, String>, ObservableValue<String>>() { } }); public ObservableValue<String> call( CellDataFeatures<ObservablePerson, String> param) { return param.getvalue().nameproperty(); TableViewExamples Projesi
JavaFX Özellikleri ile TableView (4/4) TableColumn<ObservablePerson, Number> agecol = new TableColumn<>("Age"); agecol.setcellvaluefactory( new Callback<CellDataFeatures<ObservablePerson, Number>, ObservableValue<Number>>() { public ObservableValue<Number> call( CellDataFeatures<ObservablePerson, Number> param) { return param.getvalue().ageproperty(); } }); tableview.getcolumns().addall(namecol, agecol); TableViewExamples Projesi
javafx.scene.control.cell.propertyvaluefactory (1/2) Callback<CellDataFeatures<S, T>, ObservableValue<T>> arayüzünü gerçekleştirir Bir tablo sütunundaki hücre değer fabrikasının (cell value factory) oluşturulmasını kolaylaştırır S nesnesinin JavaFX özelliklerini Java objects via Java yansıma kütüphanesi (reflection API) aracılığıyla elde eder
javafx.scene.control.cell.propertyvaluefactory (2/2) PropertyValueFactory(String property) property: geri çağırım metodundan geri döndürülen özelliğin adı Eğer JavaFX özelliği bulunamazsa, standart JavaBeans özelliği aranır get<property>() method Özellik bir ReadOnlyObjectWrapper nesnesi içerisinde tutulur Eğer özellik değeri değişirse, değişiklik TableView a otomatik olarak yansıtılmaz
PropertyValueFactory Örneği ObservablePerson john = new ObservablePerson("John", 20); ObservablePerson peter = new ObservablePerson("Peter", 22); ObservableList<ObservablePerson> people = FXCollections.observableArrayList(john, peter); TableView<ObservablePerson> tableview = new TableView<>(people); TableColumn<ObservablePerson, String> namecol = new TableColumn<>("Name"); namecol.setcellvaluefactory(new PropertyValueFactory("name")); TableColumn<ObservablePerson, Number> agecol = new TableColumn<>("Age"); agecol.setcellvaluefactory(new PropertyValueFactory("age")); tableview.getcolumns().addall(namecol, agecol); TableViewExamples Projesi
TableView Seçim Modeli (1/2) TableView içerisinde seçili satırları (veya hücreleri) ifade eder TableView ın seçim modelini elde etmek için: TableViewSelectionModel<S> getselectionmodel() TableViewSelectionModel<S> sınıfı: TableView<S> iç sınıfı (inner class) MultipleSelectionModel<S> sınıfının alt sınıfı cellselectionenabled ikili özelliği (boolean property) Sadece hücrelerin seçili seçilemeyeceğini belirtir Varsayılan değer: false Çoklu seçim (satırlar veya hücreler) normal şartlarda aktif değildir
TableView Seçim Modeli (2/2) boolean isselected(int row, TableColumn<S,?> column) Hücre seçimi aktifleştirilmediğinde column değeri olarak null döndürür select(int row, TableColumn<S,?> column) ObservableList<TablePosition> getselectedcells() javafx.scene.control.tableposition<s, T> class int getrow() S getitem() int getcolumn() TableColumn<S, T> gettablecolumn()
TableView Seçim Dinleme Örneği TableViewSelectionModel<ObservablePerson> model = tableview.getselectionmodel(); model.setcellselectionenabled(true); model.setselectionmode(selectionmode.multiple); model.getselectedcells().addlistener(new InvalidationListener() { public void invalidated(observable o) { ObservableList<TablePosition<ObservablePerson,?>> cells = (ObservableList<TablePosition<ObservablePerson,?>>) o; String text = "Selected cells:"; for (TablePosition<ObservablePerson,?> cell : cells) text += " [" + cell.getrow() + ", + cell.getcolumn() + "]"; label.settext(text); } }); TableViewExamples Projesi