0

JAVAFX Tableview , setCellFactory, setCellValueFactory kavramları

Merhaba Arkadaşlar;

Bu yazıda javafx deki tableview kontrolünün bazı kullanımı ile ilgili bazı detaylardan bahsetmeye çalışacağım. Şöyleki ; Bildiğiniz gibi excel tabloları şeklinde kullandığımız tablolara benzeyen tableview kontrolü sıkca kullanılabilen bir kontrol. Şimdi basitce bir tableview nasıl oluşturulur ve nasıl kolon atanır bakarak başlayalım.

TableView<Person> employeeTableView = new TableView<>();
TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));

Şimdi yukardaki satıra bakarsak

1. satırda yeni bir TableView oluşturuyoruz ve burada bir jenerik kullanım söz konusu  çünkü tabloda Person modeli kullanılacak

2. satıra geçtiğimizde yeni bir tablo kolonu oluşturuyoruz ve bunun başlığı “First Name”  burada dikkat çeken bir nokta <Person,String> Person modelin adı ,String ise bu kolonda tutulacak verinin tipi eğer sayısal bir veri olsaydı <Person,Integer> , <Person,Double> gibi bir ifade kullanmak gerekecekti. 

3. satırda ise setCellValueFactory ile bu kolonda gösterilecek veriyi modele ( Person.java) bağlıyoruz ve diyoruz ki; sen Model sınıfındaki firstName bilgisini ekrana basacaksın diyoruz. yine burada da kolonda String bir değer tutulacağını <….,String> ifadesi ile belirtiyoruz. 

Haydi oluşturmaya başlayalım.

 TableView<Person> tableView=new TableView<>();

        ObservableList<Person> personObservableList= FXCollections.observableArrayList(
                new Person("Jacob", "Smith", "jacob.smith@example.com"),
                new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
                new Person("Ethan", "Williams", "ethan.williams@example.com"),
                new Person("Emma", "Jones", "emma.jones@example.com"),
                new Person("Michael", "Brown", "michael.brown@example.com")
        );


        TableColumn<Person, String> firstName = new TableColumn<>("First Name");
        firstName.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));
        tableView.getColumns().add(firstName);

        VBox vBox=new VBox();
        vBox.getChildren().add(tableView);

        tableView.setItems(personObservableList); // tableview e dataları yükleyelim



        ((Group) root).getChildren().addAll(vBox);
        primaryStage.setTitle("TableView Kullanımı - setCellFactory ile Kişiselleştirilmiş tablo");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

kodlarımızı tamamlayalım ve şu şekildi bir ekran görüntüsünün geldiğini görelim.

 

 

 

 

 

 

setCellValueFactory ile sabit kolon değeri ataması yapmış olduk. Şimdi gelelim setCellFactory ‘e ….

Peki nedir setCellFactory ?

CellFactory bize tablolardaki veriler üzerinde çeşitli kişiselleştirmeleri yapmamıza olanak sağlayan yapılar. Bunu TableView de kullanabileceğiniz gibi ListView’de de kullanabilirsiniz. hemen konuya açıklık getirmek adına örnek kodlar ve ekran görüntüsü paylaşıp konuyu anlaşılabilir hale getirelim. 

Şimdi ben istiyorum ki; “firstName” kolonunda bazı kişisel değişiklikler yapayım. Bunlara örnek ; içindekine göre rengini değiştirmek olabilir yani mesela mail adresi null olan isimleri kontrol edip kırmızı yazdırabiliriz. Bu örnekte şunu yapacağız:  isim ve soyisim üzerine gelince mail adresi bir “tooltip” de gösterilsin . işte kodlarımız ….

  firstName.setCellFactory(new Callback<TableColumn, TableCell>() {
            @Override
            public TableCell call(TableColumn param) {

                TableCell<Person,String> cell=new TableCell<>(){

                    Tooltip tooltip=new Tooltip();
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);

                        if(!empty){

                            Person per=getTableView().getItems().get(getIndex());
                            tooltip.setText(per.getEmail());
                            setTooltip(tooltip);
                            setText(per.getFirstName()+" "+per.getLastName());

                        }
                    }
                };
                return cell;
            }
        });

işte burada firstName kolonu üzerinde  özel bir cellfactory oluşturduk…

TableView’deki Hücreleri Düzenlenebilir  (Editable)yapabilirmiyiz ?

Evet bu sorunun cevabı “EVET” . TableView üzerindeki hücrelerde modifikasyon yapabiliriz. Javafx ile bu da düşünülmüş ve modifikasyon yapabilmek için uygun metodlar eklenmiş .  Şimdi bunlar ne imiş onlara bakalım. ..

tableView.setEditable(true); // bunu da unutmayalım

TableView Hücrelerini bir TextView olarak Kullanma 

TableView üzerindeki hücreleri bir TextFielde dönüştürebiliriz. İşte bu şekilde 

TableColumn  firstName=new TableColumn("ISIM"); // Kolon Başlığı
firstName.setCellValueFactory(new PropertyValueFactory<>("firstName")); // Kolona yüklenecek veri alanı adı
firstName.setCellFactory(TextFieldTableCell.forTableColumn()); // Edit Yapacaksak alanı bir textfield olarak tanımladık

 

 

 

 

 

 

Bu sondaki Boş olan sutunu kaldırmak içinde şu şekilde 

tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

 

Eveeeeeeet  şimdi gelelim yapılan işler her taraf da uygulandı mı? yoksa veri kaynağında da değişiklik oluyor mu ? Cevap  : HAYIR buraya kadar yaptığımızla sadece karşımızdaki ekranda değişiklikler oluyor Eğer yaptığınız değişikliklerin veri kaynağında da update edilmesini istiyorsak başka bir metod olan ” setOnEditCommit()”  metodunun içini doldurmamız gerekiyor aksi halde veri kaynağımız olan “ObservableList” içinde değişiklik olmuyor. 

Bu arada burayı okumanızı tavsiye ederim. Tıklayın 

Evet yukarıdaki kodun arkasına bunları da ekleyelim

 firstNameCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setFirstName(t.getNewValue());
                    }
                }
        );

İsterseniz bir buton koyup tıklama olayında isimleri konsola yazdırırsanız önce ve sonra ki değişiklikleri görürsünüz. Bu yazdığımız kodları şöyle biraz daha kolay hale getirebiliriz. 

 firstNameCol.setOnEditCommit(event -> firstNameCol_onEditCommit(event));

 private void firstNameCol_onEditCommit(Event event) {

        TableColumn.CellEditEvent<Person,String> ce;
        ce= (CellEditEvent<Person, String>) event;
        Person p=ce.getRowValue();
        p.setFirstName(ce.getNewValue());


    }

bu şekilde de aynı işlemi yaptırabiliriz. 

TableView içinde butonlu alan kullanma nasıl yapılır ona bakalım 

TableColumn buttonColumn=new TableColumn("İşlem YAP");

        Callback<TableColumn<Person,String>,TableCell<Person,String>> cellFactory=new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
            @Override
            public TableCell<Person, String> call(TableColumn<Person, String> param) {


                TableCell<Person,String> cell=new TableCell<>(){

                    Button btn=new Button(" İşlem ");
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);

                        if(!empty) {

                            btn.setOnAction(event -> {

                                Person person=getTableView().getItems().get(getIndex());
                                
                              person.setFirstName("DENEME ISIM"); // Tıklanan kaydın ismini DENEME ISIM diye değiştirecek
                              JOptionPane.showMessageDialog(null, person.getEmail(), "Bilgi", JOptionPane.INFORMATION_MESSAGE);
                            });

                            setGraphic(btn);
                        }

                    }
                };

                return cell;

            }
        };

        buttonColumn.setCellFactory(cellFactory);

 

 

Ekran görüntümüzde böyle olacak 

 

 

 

 

TableView Kayıt Ekleme ve Silme İşlemleri

Kayıt ekleme ve silme için birşey yapmanıza gerek yok aslında . Ne demek ??? . Şu demek ki yukarıdaki personObservableList’imize  add(), remove() gibi metodlarla ekleme çıkarma yaptığımızda otomatik olarak tablomuza yansıtılacaktır.

public void btnAdd_Clicked()
{

Person p=new Person("Jenny","jeneric","jenny@gmail.com");
personObservableList.add(p);

}
public void btnDelete_Clicked()()
{
 
Person person=tableView.getSelectionModel().getSelectedItem();
personObservableList.remove(person);
}

Şimdilik bu kadar açıklayıcı oldu sanırım ….. 

admin

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir