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ü;
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.