15 Ekim 2009 Perşembe

JavaFX de değişkenler

JavaFX değişkenleri iki tipdir. Bunlar "var" ve "def" dir. Var variable (değişkenin) kısaltılmışı def (define) tanımlamaktır. "var" kullanımı değişkenin değerinin ileride değişebileceğini gösterir. Örneğin "var ortalama = 10.0" ilerde "ortalama = 25.0" olabilir. "def" ise farklı ele alınır. "def" de değişkene ilk değer atanmak zorundadır ve ilerde programcı tarafından değeri değiştirecek bir atama yapılmayacağı garanti edilir. Örneğin:
var ortalama; // ortalamaya ilk değer atanmak zorunda değil.
def euro=2.47; // İlk değer hemen atanmalı.
def dolar; // Derleyici hata verir. İlk değer hemen atanmalı.
euro = 2.13; // Derleyici hata verir. Def olarak atanmış değişken'e değer atanamaz.
JavaFX'in güçlü özelliklerinden biri de binding (bağlanma) mekanizmasıdır. Bu mekanizma değişken başka bir değişkene ya da kod parçasına bağlanabilir. Örnek:
var  fizik_notu = 5.6;
var  kimya_notu = 7.2;
var toplam = bind  fizik_notu + kimya_notu;
Bu örnekte fizik ve/veya kimya notu değeri ne zaman değişirse toplam değişkeni tekrar hesaplanıp güncellenir. "def" bu örnekte önem kazanır. "def"'i bind ile güncel tutabiliriz. Bunun ne anlamı var diye sorabilirsiniz. Şöyle ki değişkeni başka biri değiştiremesin ama bazı durumlar da değişsin istiyorsunuz diyelim. "var" ile değişken değeri yanlışlıklada olsa değişebilir(kodu devir alan başka programcı ya da uykusu gelmiş olan sizin tarafınızdan). Ama "def" kullanırsak da değişkeni değiştiremeyiz. Fakat "def" i bir kod parçasına bağlarsak hem otomatik güncellenir hem de siz yada başkası yanlışlıkla değiştiremez. Bu durum gerçek hayatta bize başka bir ortamdan (veritabanı, internet) dolar kurunu alan bir kod yazarak "def" değişkenine bağlama ve böylece hem güncel kalıp hem de yanlışlık değişmesi olasılığından kurtulma açısından fayda sağlar. "def" 'in bir faydası da derleyicinin çeşitli optimizasyonlar uygulamasına fırsat verir. Değişkene sonradan değer atarsanız değer atanana kadar değişkenin tipi bellirli değildir. Atama yapılınca yapılan atamaya göre değişken tipi bellirlenmiş olur. Sert kodlanan dillerde değişkenin tipi hemen belirtilmelidir. Değişken tipi atama yapmadan önce de belirlenebilir. Değişken tipleri aşağıdaki gibidir.
  • Integer
  • Long
  • Short
  • Byte
  • Number
  • Double
  • Float
  • String
  • Array
  • Sequence
  • Herhangi bir java sınıfı (JButton v.s.)
Örnek:
var teker_sayısı: Integer = 4;
var PI:Number = 3.14;
var urun_adi:String = "Merck";
var kayit_dosyasi:File;
Gördüğünüz gibi değişken isminin önüne ":" işareti getirerek değişken tipini belirleyebilirsiniz. Number tipi her zaman floattır. Bu durum cep telefonları ile uyumluluk adına belirlenmiştir. Sequence JavaFX'e özel bir değişken tipidir. Integer, short, byte, float, double java daki ile aynıdır. String sınıf olarak değil değişken tipi olarak ele alınır. Sequenceler dizilere benzerler ancak JavaFX de dil tarafından desteklenen bazı ilginç özelliklere sahiptirler. Sequenceleri diğer yazılarımda ayrı olarak ele alacağım. Son olarak bir örnek vererek bir özellikten daha bahsedeceğim.
var x =23;
def y =145;
var a = {  var b =10;
              var c =x+y;
              c/b;
            }
Bu kod parçasında son ifadenin değeri a değişkenine atanır. Aynı durum "def" ve bind ile bağlanmış değişkenler içinde geçerlidir. Blok yazımın avantajı okunabilirliği anlatır. Blok içinde tanımlanan b ve c değişkeni blok dışında geçersizdir. Yani bu değişkenlere erişilemez ve derleyici hata verir. Değişkenlerin geçerlilik alanını sonraki yazımda işlemeyi düşünüyorum. O zamana kadar esen kalın.

12 Şubat 2009 Perşembe

JavaFX 1.1 Yayınlandı

JavaFX'in yeni sürümü JavaFX1.1 indirilmeye hazır durumda. JavaFX takımı mobil profilini common (ortak) profili ile birleştirdi. Bu karar JavaFX geliştiricilerine eğer Masaüstü profilini (Desktop) uygulamarında kullanmazlarsa direkt mobil ortamlarda çalışma garantisini veriyor.

4 Şubat 2009 Çarşamba

JMC (Java Media Component) ile Basit Java Video Player

JavaFx kullanmadan java video oynatıcısı yazmak mümkün. Ancak ilk önce www.javafx.com sitesinden JavaFX SDK'yı indirin. Netbeans versiyonu kendi dizininde javafx'i barındırır. Bu yüzden JavaFX SDK'yi seçiyoruz (C: diskine kurmanız işinizi kolaylaştırır). Windows da Bilgisayarımı sağ tıklayıp özellikleri seçiyoruz. Burdan gelişmiş sekmesine ordan da ortam değişkenlerinden sistem değişkenlerin den path değişkenini çift tıklıyorsunuz. Satırın en sonuna noktalı virgül ekleyerek JavaFX SDK'nın yolu+\lib\desktop\ ekliyoruz. Bende bu C:\javafx\lib\desktop şeklindedir. Bunu yapmamızın nedeni video programının birkaç dll dosyasına ihtiyacı var. Aslında dll dosyalarını programımız bulup yükleyebilirdi. Ancak jmc.dll dosyası diğer dll leri kendisi yükleyecek şekilde yapılandırılmış. Dolayısıyla bu girişim hata ile sonuçlanıyor. Eğer program Netbeans gibi bir ide yerine komut satırından çalıştırılacaksa jmc.jar dosyası class-path'e eklenmeli. IDE kullananlar ne yapacağını biliyordur diye tahmin ediyorum :) Programın bazı açıklamalarını okumanızı tavsiye ederim. Fazla vaktim olmadığından sadece bazı durumları açıkladım.

import com.sun.media.jmc.Media;
import com.sun.media.jmc.MediaProvider;
import com.sun.media.jmc.control.VideoControl;
import com.sun.media.jmc.control.VideoRenderControl;
import com.sun.media.jmc.event.BufferDownloadListener;
import com.sun.media.jmc.event.BufferDownloadedProgressChangedEvent;
import com.sun.media.jmc.event.DurationChangedEvent;
import com.sun.media.jmc.event.MediaDurationListener;
import com.sun.media.jmc.event.MediaSizeListener;
import com.sun.media.jmc.event.MediaStateEvent;
import com.sun.media.jmc.event.MediaStateListener;
import com.sun.media.jmc.event.SizeChangedEvent;
import com.sun.media.jmc.event.VideoRendererEvent;
import com.sun.media.jmc.event.VideoRendererListener;
import com.sun.media.jmc.track.MediaTrack;
import com.sun.media.jmc.type.ContainerType;
import com.sun.media.jmc.type.ProtocolType;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.URI;
import java.util.List;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;

/**
*
* @author Tamer
*/
public class Main {

  public Main() {

      JFileChooser chooser = new JFileChooser("D:/filimler/stargate/1/SG.A.05.01/");
      if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
          URI resource = chooser.getSelectedFile().toURI();
final MediaProvider mediaProvider = new MediaProvider(resource); // Media akışı (streamming) kullanmak istyorsanız başına  // (açıklama)  ekleyin.


          //final MediaProvider mediaProvider = new MediaProvider(URI.create("http://sun.edgeboss.net/download/sun/media/1460825906/1460825906_2956241001_big-buck-bunny-640x360.flv")); // Media akışı (streamming) kullanmak istyorsanız başına  // (açıklama)  ekleyin.
//            System.out.println(mediaProvider.getCapabilities());
//            System.out.println(mediaProvider.getControls());
//            System.out.println(mediaProvider.getCurrentPlayCount());
//            System.out.println(mediaProvider.getDuration());
//            System.out.println(mediaProvider.getMediaTime());
//            System.out.println(mediaProvider.getName());
//            System.out.println(mediaProvider.getPlayCount());
//            System.out.println(mediaProvider.getRate());
//            System.out.println(mediaProvider.getSource());
//            System.out.println(mediaProvider.getStartTime());
//            System.out.println(mediaProvider.getStopTime());

          mediaProvider.addBufferDownloadListener(new BufferDownloadListener() {

              public void mediaDownloadProgressChanged(BufferDownloadedProgressChangedEvent arg0) {
                  System.out.println(arg0.getProgress());
              }
          });
          mediaProvider.addMediaDurationListener(new MediaDurationListener() {

              public void mediaDurationChanged(DurationChangedEvent arg0) {
                  System.out.println(arg0);
              }
          });
          mediaProvider.addMediaSizeListener(new MediaSizeListener() {

              public void mediaSizeChanged(SizeChangedEvent arg0) {
                  System.out.println(arg0);
              }
          });
          mediaProvider.addMediaStateListener(new MediaStateListener() {

              public void endOfMediaReached(MediaStateEvent arg0) {
                  System.out.println(arg0);
              }

              public void playerStarted(MediaStateEvent arg0) {
                  System.out.println(arg0);
              }

              public void playerStopped(MediaStateEvent arg0) {
                  System.out.println(arg0);
              }

              public void playerRepeated(MediaStateEvent arg0) {
                  System.out.println(arg0);
              }

              public void stopTimeReached(MediaStateEvent arg0) {
                  System.out.println(arg0);
              }
          });
          mediaProvider.addPropertyChangeListener(new PropertyChangeListener() {

              public void propertyChange(PropertyChangeEvent evt) {
                  System.out.println(evt.getPropertyName());
              }
          });
          VideoControl control = mediaProvider.getControl(VideoControl.class);
          final JComponent videoPane = control.getVideoPane();
          videoPane.setIgnoreRepaint(true);
          final JFrame window = new JFrame();
          window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          window.add(videoPane);
          window.pack();
          window.setVisible(true);
          //control.setResizeBehavior(VideoControl.ResizeBehavior.Stretch);
//            System.out.println(videoPane.getIgnoreRepaint());
          window.addMouseListener(new MouseAdapter() {

              @Override
              public void mouseClicked(MouseEvent e) {
                  if (e.getClickCount() == 2) {
                      if (GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getFullScreenWindow() != null) {
                          GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(null);
                          window.dispose();
                          window.add(videoPane);
                          window.setIgnoreRepaint(false); // Tam ekran apisi için gerekli
                          videoPane.setIgnoreRepaint(false);
                          window.setUndecorated(false);
                          window.setResizable(true);
                          window.pack();
                          window.setVisible(true);
                      // AWTUtilities.setWindowShape(window, new Ellipse2D.Float(0, 0, 500, 500)); // Pencereyi belirli bir şekle ayarlar. Ancak window.setUndecorated(true); olarak ayarlanmalıdır.
                      } else {
                          window.dispose();

23 Ocak 2009 Cuma

JavaFX dersleri

Günlüğüm de JavaFX dersleri vermek istiyorum. Ancak openjfx projesindeki değişiklere bakarak önümüzdeki sürümlerde -ki bugünlerde çıkmasını bekliyorum- byte,short gibi değişken tiplerinin gelmesi muhtemel gözüküyor. Bu yüzden programcılığın en temel yapı taşları olan değişkenler derslerin en başında gelince bir türlü başlayamıyorum.