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.

Android – Döviz Kurları (JSON)

Merhaba arkadaşlar bu yazıda daha önce JavaFx kullanarak yaptığımız projenin android versiyonunu yapacağız. O yazıya da buradan ulaşabilirsiniz.

Basitçe göstermek gerekirse uygulamamız son halinde aşağıdaki şekilde olacak;

 

Şimdi ilk olarak manifest dosyasından başlamak istiyorum;

3

Yukarıda gördüğünüz gibi manifest dosyasına internete erişebilmek için izin ekliyoruz.

Daha sonra bu uygulama iki ekranda çalışacağı için ikinci activity’yi yaratmamız gerekli.

4

Yukarıda gösterdiğim şekilde ismi vs. tamamen size kalmış şekilde yaratabilirsiniz.
Bu işlemi yaptığınızda manifest dosyası yukarıdaki gibi olur.

Koda geçmeden önce her zamanki gibi oluşturacağımız sınıfın kodlarını yazmak istiyorum. Bir önceki yazıda JSON’ın yapısını anlatmıştım. Bu yüzden burada bunun detayına girmeyeceğim. Bizim JSON’ımız da currency_name, selling_buying gibi parametreler var ve bizde bunları tutabilmek için bir sınıf oluşturmamız gerekli aşağıdaki gibi;

public class DovizCom {
    public double selling;
    public double buying;
    public double change_rate;
    public String name;
    public String fullName;
    public String code;
    public int curr;

    public double getSelling() {
        return selling;
    }

    public void setSelling(double selling) {
        this.selling = selling;
    }

    public double getBuying() {
        return buying;
    }

    public void setBuying(double buying) {
        this.buying = buying;
    }

    public double getChange_rate() {
        return change_rate;
    }

    public void setChange_rate(double change_rate) {
        this.change_rate = change_rate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public int getCurr() {
        return curr;
    }

    public void setCurr(int curr) {
        this.curr = curr;
    }
}

Bu class’ı oluşturdak sonra asıl koda geçebiliriz.

//heryerden erişebilmek için en yukarıda tanımladık
    ListView listCurrency;
    String[] currList;
    DovizCom[] currArray = new DovizCom[68];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listCurrency = (ListView) findViewById(R.id.listCurrency);
        //class çağırılıyor
        JsonParsing jsonParsing = new JsonParsing();

        jsonParsing.execute();
        //listView'a tıklandığında çalışacak method
        listCurrency.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int position, long id) {
                Intent myIntent = new Intent(MainActivity.this, CurrencyInfo.class);
                myIntent.putExtra("code", currArray[position].code);
                myIntent.putExtra("buying", currArray[position].buying);
                myIntent.putExtra("change_rate", currArray[position].change_rate);
                myIntent.putExtra("curr", currArray[position].curr);
                myIntent.putExtra("selling", currArray[position].selling);
                myIntent.putExtra("full_name", currArray[position].fullName);
                MainActivity.this.startActivity(myIntent);
            }
        });
    }

Yukarıda ki kod ilk çalışacak koddur. Tavsiyem burayı sadece

jsonParsing.execute()

kısmına kadar incelemenizdir. Buradan sonra aşağıdaki kod satırları çalışmaya başlayacak.

//androidde json ile veri çekebilmek için en iyi yöntem AsyncTask
    protected class JsonParsing extends AsyncTask{
        String result = "";
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                //URL olarak api adresi verilir
                URL doviz_url = new URL("https://www.doviz.com/api/v1/currencies/all/latest");
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(doviz_url.openStream()));
                String line = "";
                //her bir satır teker teker kaydedilir
                while((line=bufferedReader.readLine()) != null){
                    result += line;
                }
                bufferedReader.close();

                JSONArray jsonArray = new JSONArray(result);
                currList = new String[jsonArray.length()];
                //arrayde ki parametreler ayrıştırılır
                for (int i=0 ; i<jsonArray.length(); i++){
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    DovizCom dovizCom = new DovizCom();
                    dovizCom.buying = jsonObject.getDouble("buying");
                    dovizCom.selling = jsonObject.getDouble("selling");
                    dovizCom.change_rate = jsonObject.getDouble("change_rate");
                    dovizCom.curr = jsonObject.getInt("currency");
                    dovizCom.name = jsonObject.getString("name");
                    dovizCom.fullName = jsonObject.getString("full_name");
                    dovizCom.code = jsonObject.getString("code");
                    currArray[i]=dovizCom;
                }
                //listviewda gösterilecek veriler ayarlanır
                for (int i=0; i<jsonArray.length(); i++){
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    currList[i]=jsonObject.getString("full_name");
                }


            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
        //bütün işlemler bittikten sonra listview'a aktarılır
        @Override
        protected void onPostExecute(Void aVoid) {
            ArrayAdapter adapter = new ArrayAdapter(getBaseContext(), simple_list_item_1, currList);
            listCurrency.setAdapter(adapter);
        }
    }

Buraya kadar sorunsuz gidebilmişsek eğer uygulamayı çalıştırdığımızda ListView’da veri olduğunu görebileceğizdir. Bu arada yukarıdaki ArrayAdapter’a gönderdiğimiz “simple_list_item_1” Android Studio’nun bize sunduğu basit bir liste itemi, eğer listview’da sadece text olacaksa bunu kullanabilirsiniz. Daha sonra kendi özelleştireceğimiz ListView adapterlerini de göstereceğim inşallah.

Şimdi listView’da her hangi bir tıklamadan sonra nasıl çalıştıracağımıza bakalım. Bunun için yukarıda yazdığımız koddaki kesite bakmamız gerekli.

listCurrency.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int position, long id) {
                Intent myIntent = new Intent(MainActivity.this, CurrencyInfo.class);
                myIntent.putExtra("code", currArray[position].code);
                myIntent.putExtra("buying", currArray[position].buying);
                myIntent.putExtra("change_rate", currArray[position].change_rate);
                myIntent.putExtra("curr", currArray[position].curr);
                myIntent.putExtra("selling", currArray[position].selling);
                myIntent.putExtra("full_name", currArray[position].fullName);
                MainActivity.this.startActivity(myIntent);
            }
        });

Burada yaptığımız yeni bir intent oluşturuyoruz. Bu bize yeni activity çalıştırmamıza olanak sağlıyor. putExtra methodu ile sonraki activity’de işimize yarayacak verileri gönderiyoruz.

Şimdi ikinci activity’e geçiyoruz.

Buranın tasarımı yukarıdaki ekran görüntülerinde görünüyor zaten.

public class CurrencyInfo extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_currency_info);
        //ekranda ki textViewları tanımladık
        TextView txt_currency_name = (TextView) findViewById(R.id.txtCurrencyName);
        TextView txt_buying = (TextView) findViewById(R.id.txtBuying);
        TextView txt_curr_code = (TextView) findViewById(R.id.txtCurrCode);
        TextView txt_curr_rate = (TextView) findViewById(R.id.txtCurrRate);
        TextView txt_selling = (TextView) findViewById(R.id.txtSelling);

        //yaşayan intentler çekiliyor.
        Intent intent = getIntent();
        txt_currency_name.setText(intent.getStringExtra("full_name"));
        /**burada sonda yazdığımız değer, eğer herhangi bir veri gelmezse default olarak
         * ne çekeceğini gösteriyor.
         */
        txt_buying.setText(Double.toString(intent.getDoubleExtra("buying",0.00)));
        txt_selling.setText(Double.toString(intent.getDoubleExtra("selling",0.00)));
        if (intent.getDoubleExtra("change_rate",0.00)<0)
            txt_curr_rate.setTextColor(getResources().getColor(R.color.colorRed));
        else
            txt_curr_rate.setTextColor(getResources().getColor(R.color.colorGreen));

        txt_curr_rate.setText(Double.toString(intent.getDoubleExtra("change_rate",0.00)));
        txt_curr_code.setText(intent.getStringExtra("code"));
    }
}

Gerekli açıklamaları kod içinde yaptığımı düşünüyorum. Ama yinede sormak istediğniz bir şey olursa yorum bırakabilirsiniz. En kısa zamanda dönmeye çalışırım.

Uygulamayı buradan indirebilirsiniz.

JavaFx – Döviz Kurları (JSON)

Merhaba arkadaşlar, bu yazımda döviz kurlarını doviz.com sitesinin sunduğu api ile json parse ederek, listeye aktaran otomatik yenileyen ve istediğiniz zamanda yenileme yapabileceğiniz bir uygulama olacak.

Bu uygulamanın ekran görüntüsü olacak.

prog

Koda geçersek;

Her zaman ki gibi JavaFx – FXML Application olarak projemizi oluşturuyoruz.

Currency adında yeni bir class oluşturuyoruz, bu class bizim jsondan çekeceğimiz verileri tutacak.

public class Currency {

public double selling;
public double buying;
public double change_rate;
public String name;
public String fullName;
public String code;
public int curr;

public double getSelling() {
return selling;
}

public void setSelling(double selling) {
this.selling = selling;
}

public double getBuying() {
return buying;
}

public void setBuying(int buying) {
this.buying = buying;
}

public double getChange_rate() {
return change_rate;
}

public void setChange_rate(double change_rate) {
this.change_rate = change_rate;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getFullName() {
return fullName;
}

public void setFullName(String fullName) {
this.fullName = fullName;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

/**
* @return the currency
*/
public int getCurrency() {
return curr;
}

/**
* @param currency the currency to set
*/
public void setCurrency(int curr) {
this.curr = curr;
}

}

FXMLDocumentController classına geçersek,
Gerekli tanımlamaları yapıyoruz.

@FXML
    private ListView list_currency;
    @FXML
    private Label lbl_currencyName;
    @FXML
    private Label lbl_buying;
    @FXML
    private Label lbl_selling;
    @FXML
    private Label lbl_changeRate;
    @FXML
    private Label lbl_code;
    @FXML
    private RadioButton rb_refreshAutomatic;
    //kur listelerini tutacak listemiz
    //listview observableList ile çalıştığı için bu şekilde tanımlıyoruz
    ObservableList currList = FXCollections.observableArrayList();

initialize methodu ilk çalışan fonksiyonumuz

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //Api adresi tanımlanıyor
        String urlDoviz = "https://www.doviz.com/api/v1/currencies/all/latest";
        //Fonksiyona gönderiliyor
        getJsonData(urlDoviz);
        
    }

getJsonData fonksiyonunda Json verimizi Stringe dönüştürüyoruz. Burada ki işlemleri daha kısaltabiliriz fakat BufferedReader vs. gibi classlarıda göstermek istedim.

//Apide ki bilgileri stringe çevirecek fonksiyon
    public void getJsonData(String url){
        Currency[] currency = new Currency[68];
        String result = "";
        try {
            URL urlDoviz = new URL(url);
            HttpURLConnection urlDovizCom = (HttpURLConnection) urlDoviz.openConnection();
            InputStreamReader inputStreamReader = new InputStreamReader(urlDovizCom.getInputStream());
            try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
                String line = "";
                while((line = bufferedReader.readLine()) != null){
                    result += line;
                }
            }
            
        } catch (MalformedURLException ex) {
            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
        }
        //json datayı parse edecek fonksiyona gönderiyoruz
        getJsonParseData(result);
        
    }

Json verimizi çektikten sonra parse etme işlemine geçiyoruz. getJsonParseData fonksiyonu buna yarayacak.

public void getJsonParseData(String json){
        
        //Listview'da kur isimlerini göstereceğimiz liste
        ObservableList currListName = FXCollections.observableArrayList();
        try {
            //bizim jsonumuz dizi şeklinde olduğu için array olarak çektik
            JSONArray jsonArray = new JSONArray(json);
            //for döngüsünde her bir dizide ki elemanları teker teker çekiyoruz
            //en sonunnda da Currency türünde diziye atıyoruz
            for (int i = 0; i < jsonArray.length(); i++) {
                Currency currency = new Currency();
                currency.fullName = jsonArray.getJSONObject(i).getString("full_name");
                currency.name = jsonArray.getJSONObject(i).getString("name");
                currency.code = jsonArray.getJSONObject(i).getString("code");
                currency.selling = jsonArray.getJSONObject(i).getDouble("selling");
                currency.buying = jsonArray.getJSONObject(i).getDouble("buying");
                currency.change_rate = jsonArray.getJSONObject(i).getDouble("change_rate");
                currency.curr = jsonArray.getJSONObject(i).getInt("currency");
                currList.add(currency);
            }
            //bunu aynı for içinde de yapabilirdik 
            for (int i = 0; i < jsonArray.length(); i++) {
                currListName.add(jsonArray.getJSONObject(i).getString("full_name"));                
            }
            //listView'a isimleri atıyoruz
            list_currency.setItems(currListName);
            //ilk açıldığında ilk indexde ki elemanın verilerini ekranda göstereceğiz
            lbl_buying.setText(Double.toString(currList.get(0).buying));
            lbl_selling.setText(Double.toString(currList.get(0).selling));
            lbl_changeRate.setText(Double.toString(currList.get(0).change_rate));
            if (currList.get(0).change_rate<0) {
                lbl_changeRate.setTextFill(Color.web("#FF0000"));
            }else{
                lbl_changeRate.setTextFill(Color.web("#008000"));
            }
            lbl_currencyName.setText(currList.get(0).fullName);
            lbl_code.setText(currList.get(0).code);
            
                    
        } catch (JSONException ex) {
            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    }

Bu işlemlerden sonra aslında çoğu işimiz bitti, şimdi buttonlarda vs. yapılacak işlemleri ayarlayalım. getCurrencyPass fonksiyonu listViewda kur seçtiğimizde detaylarını labellara aktaracak.

@FXML
    private void getCurrencyPass(MouseEvent event) {
        //seçilen isimi aktarıyoruz
        String fullName = list_currency.getSelectionModel().getSelectedItem();
        for (int i = 0; i < currList.size(); i++) {
            //eğer seçilen kişi ilk listedeki elemanında ismin aynısı ise 
            if (fullName.equals(currList.get(i).fullName)) {
                lbl_buying.setText(Double.toString(currList.get(i).buying));
                lbl_selling.setText(Double.toString(currList.get(i).selling));
                lbl_changeRate.setText(Double.toString(currList.get(i).change_rate));
                if (currList.get(i).change_rate<0) {
                    lbl_changeRate.setTextFill(Color.web("#FF0000"));
                }else{
                    lbl_changeRate.setTextFill(Color.web("#008000"));
                }
                lbl_currencyName.setText(currList.get(i).fullName);
                lbl_code.setText(currList.get(i).code);
            }
        }
    }

Ekrandaki kurları yenile butonunda çalışacak fonksiyonumuzu yazalım.

    @FXML
    private void refreshCurrency(ActionEvent event) {
        //yukarıda yazdığımız fonksiyonları tekrar tetikliyoruz
        getJsonData("https://www.doviz.com/api/v1/currencies/all/latest");
    }

Bunuda yazdıktan sonra otomatik olarak kurları yenileyecek fonksiyonumuzu yazıyoruz.

    @FXML
    private void refreshAutomatic(ActionEvent event) {
        //eğer seçilmiş ise
        if(rb_refreshAutomatic.isSelected()){
            //milisaniye şeklinde çalışır bu yüzden 1 dakikanın milisaniye cinsinden yazıyoruz
            Timeline timeline = new Timeline(new KeyFrame(Duration.millis(60000), new EventHandler() {

                @Override
                public void handle(ActionEvent event) {
                    //tekrar tetikliyoruz
                    getJsonData("https://www.doviz.com/api/v1/currencies/all/latest");
                }
            }));
            //sürekli tekrar etmesi için INDEFINITE olarak ayarlıyoruz
            timeline.setCycleCount(Animation.INDEFINITE);
            timeline.play();
        }
    }

Uygulamanın dosyasını buradan indirebilirsiniz.