JavaFx – 1

Standard

Flash ve Silverlightın Javadaki karşılığı sayılır, internet uygulamaları yapmak için script dili. Yazdığınız uygulama hem masaüstü hem de web uygulaması olabilir( hem de mobile ). Flexte Air uygulaması yazarken projenin başında bunu seçmem gerekmişti ama bunda gerekmedi, sonuçtaki dosya ikisinde de çalışıyordu.

Netbeans 6.5 kullanıyordum ve FX desteğini, “Tools > Plugins” ten kurmam gerekti. Kurduktan sonra Netbeans dosyaları açmaya çalıştığımda editörü açmadı, benzer bişey olursa Netbeans i kapatıp açınca düzeliyor :))

Bir JavaFX projesi açıp denemeye başlayabiliriz. Dili biraz öğrenmek gerekecek, biraz farklı, Java ile Javascript arası bişey:)). Sadece şu iki satırla denemeye başlayabiliriz.


package deneme

println("Merhaba Dünya");

:))

Konsola “Merhaba Dünya” yazan basit bişey. import yok, class yok, System.out yok. Fakat Sonuçta çıkan jar dosyasına bakarsak, bu dosya :

public class Main extends FXBase
implements FXObject
{
....


haline geldiği görülür. Main dosyanın adı. jsp deki jsp kodlari ve sonucta onun servlet haline gelip çalışması gibi.

Değişkenler
Değişken tanımlarken var kelimesini kullanıyoruz.

package fx_00;

var yaricap = 5;

println("Dairenin yarıcapı : {yaricap}");

Bu arada konsola değişkeni nasıl yazdığımızı da gördük: “{…}” icine yazarak.

Sabit tanımlamak için de “def” kelimesi kullanılıyor. Bu şekilde tanımlananlar sonradan değiştirilemiyor.

package fx_00;

def PI = 3.14;

println("PI : {PI}");

Dairenin alanını göstermek için;

package fx_00;

def PI = 3.14;
var r = 5;

println("Alan : {PI*r*r}");

Blok
{..} şeklinde kod blokları tanımlayabiliriz ve bu bloklardaki son ifadenin değeri, bloğun değeri olur.

package fx_00;

def PI = 3.14;
var r = 5;

println(
{
var rKare = r*r;
var alan = PI*rKare;
"Dairenin alanı : {alan}"
}
);

Yukarıda println nin paremetresi bir blok ve o blokun son ifadesi “Dairenin alanı : {alan}” olduğu icin bu string bloktan donen değer olacak ve bu yazdırılacaktır. Bunun öncesinde ise değişken tanımları, hesaplamalar, vs.. gibi kodlar yazıyoruz.

Değişkenlerin Tipleri
Değişkenlerin tiplerini belirtmemiz gerektiğinde, değişkenden sonra : ve sonra da tip adini yazarak bunu yapabiliyoruz.

Aşağıda tipleri Number olarak belirttik.

package fx_00;

def PI:Number = 3.14;
var r:Number = 5;

println("Alan : {PI*r*r}");

Fonksiyon
Alanı hesaplama isini bir fonksiyona verip, println icinde o fonksiyonu da çağırabiliriz.

package fx_00;

def PI:Number = 3.14;

println("Alan : {alan(7)}");

function alan(r){
PI*r*r;
}

  • Dikkat edersek fonksiyonu tanımlamadan önce kullanabildik, sorun yapmadı. Bazı dillerde tanımlama ile kullanma sırası önemlidir.
  • Bir de fonksiyonun son ifadesine “return” koymadım, koyarsak da birsey farketmiyor. Blokların son ifadesinin değeri, bloğun da değeridir.

Fonksiyonun aldığı parametrenin tipini belirtmek istersek yine aynı şekilde belirtiyoruz.

function alan(r:Number){
return PI*r*r;
}

Aslında fonksiyonumuz da bir değer döndürüyor ve ifadelerimizde bir değişken gibi kullanıyoruz ve fonksiyonun da bir dönüş tipi var. Bunu da yine aynı şekilde fonksiyon ifadesinin sonunda : dan sonra belirtebiliriz.

function alan(r:Number):Number{
return PI*r*r;
}

Buraya kadar gelmişken, fonksiyonlari bir değişkende tutabiliriz. Önce bilirli tipte fonksiyonlari tutabilecek bir değişken tanımlayıp, sonra o değişkene bir sayi, ya da string atadığımız gibi bir fonksiyon atayabiliriz.

var alanHesapla:function(r:Number):Number;

alanHesapla adinda bir değişken tanimladik ve değişkenin tipini herzamanki şekilde : dan sonra belirttik : function(r:Number):Number
Yani bu değişkenimiz, Number bir parametre alıp, Number değer dönen fonksiyonlari tutabilecek.

Mesela;

package fx_00;

def PI:Number = 3.14;

var alanHesapla:function(r:Number):Number;

alanHesapla = function (r:Number):Number{
return PI*r*r;
}

println("Alan : {alanHesapla(7)}");

Değişkenimize normal atama operatörüyle ( = ) bir fonksiyon atadım. Atadığım fonksiyonu tanımlarken fonksiyon ismi vermedim, buna gerek yok çünkü artık o fonksiyona bu değişkenle erişeceğim. Tabii ki bu değişkene ilerde başka fonksiyon atayacak olursam, bu fonksiyu kaybederim.

Bind
Bazı değişkenlerin değerlerinin otomatik olarak hesaplanmasini isteyeceğimiz ya da, bunların değerlerinin başka şeylere bağlı olduğu durumlar olabilir. Bu durumlarda bind ifadesini kullaniyoruz.

aşağıdaki koddan:

package fx_00;

var a = 5;
var b = bind a;

println("a : {a} ve b : {b}");

a = 222;
println("a : {a} ve b : {b}");

aşağıdaki çıktıyı alırız:

a : 5 ve b : 5
a : 222 ve b : 222

Değişenimiz karmaşık bir hesaplamaya da bağlı olabilir.

Bu koddan :

package fx_00;

var yaricap = 5;
var alan = bind 3.14 * yaricap *yaricap;

println("yaricap : {yaricap} ve alan : {alan}");

yaricap = 10;
println("yaricap : {yaricap} ve alan : {alan}");

Bu sonucu elde ederiz :

yaricap : 5 ve alan : 78.5
yaricap : 10 ve alan : 314.0

yaricap değişkenin değeri değişince alan değişkeninin değeri de değişti.

Şunları da deneyebilirsiniz.

b nin değeri; a çiftse a, tekse a nin karesi olsun:

var b = bind if(a mod 2 == 0) a else a*a;

b nin değeri; 1-10 arasindaki sayilarin karelerinin dizisi olsun:

var b = bind for (a in [1..10]) a*a;

Dahası bir blok da kullanabilirsiniz, biliyorsunuz blokların değeri son ifadenin değeridir.

Aşağıdaki kodda b nin değerini yazdirdiğimizda:

package fx_00;

var b = bind {
var isim = "Mustafa";
var yas = 30;

"{isim} , {yas} yasindadir"
};

println(b);

sonuc olarak

Mustafa , 30 yasindadir

çıkacaktır.

Bunu “with inverse” diyerek cift taraflı da kullanabilirsiniz.

package fx_00;

var a = 5;
var b = bind a with inverse;

a = 6;
println("{a} - {b}");
b = 9;
println("{a} - {b}");

Artık a değiştiğinde b, b değiştiğinde a etkilenecek.

Bazı Sabitler

  • __PROFILE__ Uygulamanızın çalıştığı yere göre “desktop”, “mobile”, “browser” stringlerinden birisi
  • __DIR__Uygulamanızın bulunduğu dizin
  • __FILE__Çalışan dosya

Değişken Tipleri
String

  • default değeri “” dir
  • yanyana olan 2 string birleştirilir. “tafalinin ” “blogu” ifadesi “tafalinin blogu” olur.
  • tek tırnak ( ‘ )veya cift tirnakla ( ” ) tanımlanabilir.

Integer

  • default değeri 0 dir
  • 0 ile baslarsa 8lik, 0x ile basliyorsa 16lik olarak değerlendirilir. Yani var i:Integer = 0x555; gibi tanımlanabilir.

Number

  • Float sayılar tutar
  • 0 ile baslarsa 8lik, 0x ile basliyorsa 16lik olarak değerlendirilir. Yani var i:Number = 0x555; gibi tanımlanabilir.
  • 3.34e-4 gibi ifadeler yazilabilir. Yani var i:Number = 3.34e-4; gibi tanımlanabilir.

Boolean
true ve false değerler tutar.
Örnek : var b:Boolean = 20 < 30;

Duration
Süre tutar. sayılardan sonra ms, s, m, h gelir. Aslinda bir nesnedir ve uye metodlari vardir.
Örnek : var d:Duration = 4h;

Değişkenler için bir tür Trigger
Değişken tanımlarken sona “on replace” ifadesiyle bir tür trigger tanımlayabilirsiniz. sona ekleyeceğiniz kod bloğu, değişkenin değeri değiştikçe çalıştırılacak. Blokun içinde değişkenin yeni değerine direk değişkenin adını kullanarak erişebilirsiniz.

package fx_00;

var a on replace { println("a degisti {a} oldu.") };

a = 6;
a = 10;

Değişkenin önceki değerini kullanmak isterseniz de:

package fx_00;

var a on replace eskisi { println("a degisti {eskisi} idi {a} oldu.") };

a = 6;
a = 10;

Bir sonraki yazıda, kısaca, if, for, sequence, ve class gibi seylerden bahsederiz.

Reklamlar