JavaFx – TextFinder

Merhaba arkadaşlar bu haftaki projemiz; kendimize bir textFinder yapmak olacak. Bir metin girilip daha sonra içerisinde kelime aratacağız, veya aradığımız kelime içinde hiç geçiyor mu, geçiyorsa kaç defa geçiyor gibi ufak bilgileri gösterecek.

Ekran görüntüsü;
1

Tasarımı ben yukarıdaki gibi düşündüm tabi ki siz kendinize göre yapabilirsiniz.
Koda geçersek;

@FXML
    private TextArea textArea;
    @FXML
    private TextField textField;
    @FXML
    private Label lbl_count;
    int position,startFrom=0;
    String historyText="";

Bu tanımlamalar dan üçü JavaFx’in kendi tanımlamaları diğerleri ise bizim aşağıda işe yarayacak olarak tanımlamalarımız.

@FXML
    private void actFind(ActionEvent event) {
        int counter=0;
        if(textArea.getText().equals("")||textField.getText().equals("")){
            Alert alert = new Alert(AlertType.INFORMATION);
            alert.setTitle("Uyarı!");
            alert.setHeaderText("Uyarı!");
            alert.setContentText("Lütfen, bir metin girdiğinize emin olunuz!");
            alert.getButtonTypes().setAll(new ButtonType("Tamam"));
            alert.showAndWait();
        }

/**
 * Yukarıda ki alert javafx ile gelen swingde ki alert dialog'un daha
 * güzelleştirilmiş versiyonu diyebiliriz. Bu alert eğer textArea'ya herhangi
*  bir metin girilmemişse veya aranacak bir kelime girilmemişse karşımıza çıkacak.
 */
        else{
            String text = textArea.getText();//metini çekiyoruz
            String wanted = textField.getText();//aranan kelimeyi çekiyoruz
            String[] txtArray = text.split(" ");//metini boşluklara göre çekiyoruz
            if(historyText.equals("")){
                /**
                 * Burada ki sorgu ilk kez mi arama yaptığımızı kontrol ediyor
                 * ilk kez arama yapıyorsak bunu kaydediyor
                 */
                historyText=wanted;
                position=0;
            }
            else if(!historyText.equals(wanted)){
                /**
                 * Eğer ilk aramamız değilse ve daha önceki kelimede değilse
                 * her şeyin baştan yapılması gerek bu yüzden position sıfırlanıyor
                 */
                historyText=wanted;
                position=0;
            }
            if(textArea.getText().length()<=position)
                /**
                 * Metnin sonuna gelip gelmediğimizi kontrol ediyoruz
                 */
                position=0;
             /**
             * Bütün ön kontroller bittiğine göre şimdi aramaya başlayalım
             * Eğer aradığımız kelime txtArrayin içinde yoksa counter arttırılıyor
             * Eğer kelimeyi hiç bulamazsa txtArrayin uzunluğuyla aynı olacak
             * Ve buda bize aradığı kelimenin burada bulunmadığını anlatacak
             */
            for (int i = 0; i < txtArray.length; i++) {                 if(!txtArray[i].equals(wanted)){                     counter++;                 }if(counter==txtArray.length){                     Alert alert = new Alert(AlertType.WARNING);                     alert.setTitle("Uyarı!");                     alert.setHeaderText("Uyarı!");                     alert.setContentText("Girdiğiniz kelime metinde bulunamadı!");                     alert.getButtonTypes().setAll(new ButtonType("Tamam"));                     alert.showAndWait();                         lbl_count.setText("0");                 }                 }             /**              * Eğer daha önce bir kelime bulunmuşsa önceki kalınan index'ten               * aramaya devam edecek.              * positionCaret ve altında ki iki metod sayesinde kelime mouse ile              * çift tıklanmış gibi seçili olacak.              */             if(position>0){
                for(int i=startFrom; i < txtArray.length; i++) {
                    if(txtArray[i].equals(wanted)){
                        textArea.positionCaret(position);
                        textArea.requestFocus();
                        textArea.selectEndOfNextWord();
                        position += txtArray[i].length()+1;
                        startFrom=i+1;
                        break;
                    }
                    position += txtArray[i].length()+1;
                } 
            }
            else{
                for(int i=0; i < txtArray.length; i++) {
                    startFrom=i+1;
                    if(txtArray[i].equals(wanted)){
                        textArea.positionCaret(position);
                        textArea.requestFocus();
                        textArea.selectEndOfNextWord();
                        position += txtArray[i].length()+1;
                        break;
                    }
                    position += txtArray[i].length()+1;  
                }   
            }   
        }
    }

Alert görüntülerimiz;

Şimdi aradığımız kelime metin içinde kaç defa geçtiğini sayacak metodu yazabiliriz.

@FXML
private void actCount(ActionEvent event) {
        String text = textArea.getText();
        String wanted = textField.getText();
        String[] txtArray = text.split(" ");
        int counter=0;
        for (int i = 0; i < txtArray.length; i++) {
            if(txtArray[i].equals(wanted)){
                counter++;
            }if(i==txtArray.length-1){
                lbl_count.setText(String.valueOf(counter));
                lbl_count.setTextFill(Color.web("#FF0000"));
            }
        }
            
    }
/**
     * Yukarıda yaptığımız gibi metni ayırıyoruz, aranan kelimeyi çekiyoruz 
     * ve her kelimeyi bulduğunda counteri bir arttırıyoruz, 
     * daha sonrada bunu kırmızı olarak yazdırıyoruz.
     */

Umarım yazımı beğenmişsinizdir. Uygulamayı buradan indirebilirsiniz.

Yorum bırakın