Netbeans’de Persistence Kullanımı ve önemli ipuçları

25 04 2008

Java Netbeans Desktop Database App.
(Resim:1 Netbeans resmi sitesinden persistence uygulaması örneği)

Ücretsiz Java Program Geliştirme Ortamı olan Netbeans IDE’nin 6.0 ve üstü sürümlerinde masaüstü programlar için desteklediği Persistence teknolojisi sayesinde veritabanı programcılığının rahatlığının .NET ile boy ölçüşür düzeye geldiği bilinmektedir.
Ancak bu teknolojinin yeni olması itibari ile internette ingilizce kaynak bile bulmakta sıkıntı çekilmektedir.
Persistence teknolojisinin en temel kullanımı hakkında Netbans’ın resmi sitesindeki:
http://www.netbeans.org/kb/60/java/gui-db.html
adresli makale inclenebilir. Bu makalede varolan bir veritabanından CRUD uygulaması ya da CREATE,UPDATE,DELETE uygulamasının yani Türkçesi ile; Veri ekleme, Veri güncelleme, Veri Silme uygulamasının yapılışı anlatılmaktadır. Buna bir de listeleme özelliği eklemek gerekir nitekip program listeleme özelliğini de otomatik olarak oluşturuyor.
Buraya kadar sorun yok;
Ancak Netbeans’ta sözkonusu makalede geçen veritabanından ya da kendinzize ait özel veriabanından spesifik sorgulama yapmak istediğinizde sofistike sql sorgusu rahatlığında işi gerçekleştiremiyorsunuz.
Bunun için geçirdiğim iki uykuz geceden sonra ortaya çıkardığım metodu sizlerle paylaşayım:

Netbeans\'de persistence kullanımı

(Resim2: Suat ATAN tarafından yazılan bir uygulanada Netbeans IDE’nin Inspector ekranı)

Gerek Netbeans’ın Desktop Database Project seçeneği ile otomatikmen oluşturulan projelerinde gerekse sizin program içinde herhangi bir component’e sağ tıklayıp data bindirmek için “bind” ibaresini tıklamanızda ekran kesitinde görüldüğü gibi kırmızı ve yeşil şeritle işaretlediğim componentler ortaya çıkar. Bu componentleri sağ tıklayıp properties (özellikleri) incelenince sorgunun:

SELECT t FROM Teklıfler t

gibi ilginç ve sql’den bozma olduğu görülür. Bu sorguyu maalesef WHERE, ORDER BY gibi taglarla zenginleştiremezsiniz. Bunun için yapmanız gereken işlem biraz uzun,şöyle ki;
Spesifik hale getirmek istediğiniz query’i (bundan böyle kırmızı şeritle işraretli comonenti ifade için böyle diyeceğim) seçip yine sağ tıklayarak “customize code” diyeceksiniz. Daha sonra kod bloğuna örneğin şöyle bir sorgu ekleyebilirsiniz:

Orjinalinde parantez içinde geçen sorgu SELECT t FROM Teklıflerlıstesı t iken siz şöyle yazabilirsiniz:

teklıflıstesıQuery = mocawaPUEntityManager.createQuery(“SELECT t FROM Teklıflıstesı t WHERE t.teklıfno =’”+SECILEN_TEKLIF_NO_STRING+”‘”);

Bu sorgu vasıtasıyla sorgumuzu filitreliyoruz. Gördüğünüz gibi biraz uzun ve sorgu dış parametre kabul etmiyor. Bu yüzden sorgu stringini değişken hale getiriyoruz. Durun daha bitmedi:
Bu hali ile herhangi bir yerden SECILEN_TEKLIF_NO_STRING değişkenini alarak veri dökümünü yapmaya çalışırsanız sonuçta yine veri dönmez. Bunun nedeni ise veri döküm listesinin örneğin bir tabloya ya da combobox’a bindirme işleminin Netbeans’ın standart programı içinde initComponents() metodu içinde kalması ya da bir kereye mahsus program başında çalıştırılması işidir.
Bu derdi de aşmak için verilerin ilgili component’e bir daha bindirilmesi gerekir. Bunu sağşamak için ise Netbeans’ın initComponents() metodu altındaki standart veri bindirme kodlarını kopyalayıp, sorgu filtre parameteresi ortaya çıktıktan sonraki olayla tekrar tetiklemektir.
Yani mesela bir buton tıklamasında bu kodları butonun tıklanma metodu altına tekrar yapıştırmaktır.

Aşağıda bunun güncel bir örneği var: (Kendi programımdan)

private void BT_TEKLIF_DETAYMouseClicked(java.awt.event.MouseEvent evt) {
// FİLTRE PARAMETERESİNİ BİR TEXTFİELDDEN ALIP DEĞİŞKENİMİZE YÜKLEDİK
SECILEN_TEKLIF_NO_STRING=SECILEN_TEKLIF_NO.getText();

//SORGUYU ENTITY MANAGER ILE TEKRAR İŞLEDİK
mocawaPUEntityManager = javax.persistence.Persistence.createEntityManagerFactory(“mocawaPU”).createEntityManager();

teklıflıstesıQuery = mocawaPUEntityManager.createQuery(“SELECT t FROM Teklıflıstesı t WHERE t.teklıfno =’”+SECILEN_TEKLIF_NO_STRING+”‘”);
teklıflıstesıList = teklıflıstesıQuery.getResultList();

//ŞİMDİ SONUÇLARI TABLOYA YENİDEN İŞLİYORUZ
org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, teklıflıstesıList, TABLO2);
org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${teklıfno}”));
columnBinding.setColumnName(“Teklıfno”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${boy}”));
columnBinding.setColumnName(“Boy”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${bırımfıyat}”));
columnBinding.setColumnName(“Bırımfıyat”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${dalga}”));
columnBinding.setColumnName(“Dalga”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${ebatSerıNo}”));
columnBinding.setColumnName(“Ebat Serı No”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${en}”));
columnBinding.setColumnName(“En”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${fıyatsafıaenı}”));
columnBinding.setColumnName(“Fıyatsafıaenı”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${kalıte}”));
columnBinding.setColumnName(“Kalıte”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${safıaboyu}”));
columnBinding.setColumnName(“Safıaboyu”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${safıaenı}”));
columnBinding.setColumnName(“Safıaenı”);
columnBinding.setColumnClass(String.class);
columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create(“${yukseklık}”));
columnBinding.setColumnName(“Yukseklık”);
columnBinding.setColumnClass(String.class);
bindingGroup.addBinding(jTableBinding);
jTableBinding.bind();

TEKLIF_DETAYLARI.setSize(600, 600);
TEKLIFLER_EKRANI.setVisible(false);
TEKLIF_DETAYLARI.setVisible(true);
TEKLIF_DETAYLARI.setTitle(“TEKLİF DETAYI: “+SECILI_FIRMA.getText());
}

Evet yukarıdan da anlaşılacağı üzere püf noktamız;

  1. Sorgumuzu yenilemek
  2. Ortaya çıkan sonuçları ilgili componentimize tekrar yüklemek
  3. Sorgularımızı alışılmış SQL tarzında değil, biraz daha özel bir formda string olarak kurmak

Değerli arkadaşlar;

Bu makalenin faydalı olacağına inanıyorum. Her türlü soru ve sorunlarınız için bana ulaşabilirsiniz.
Bu makaleyi de kaynak göstermek kaydı ile istediğiniz gibi kullanma hakkınız var.

Sevgi ve Java ile…





MySQL’de Türkçe Karakter Sorunu Yaşamamak İçin.

24 04 2007

Şimdiye Kadar Java’ka kod yazarken MySQL veri girişlerinde Türkçe karakter problemi yaşamamış da olabilirsiniz. Ancak her seferinde veritabanı bağlantı URL’sini yazarken aşağıdaki kodları da eklerseniz Türkçe karakter problemi yaşamazsınız.
Mesela klasik bağlantı adresimiz şu olsun:

c=DriverManager.getConnection(“jdbc:mysql://sunucuAdı/VeriTabanıAdı“);

Bu adresin Türkçe Karakter Sorunu yaşatması yüksektir.

Ancak adresi şu şekilde değiştirirsek:

c=DriverManager.getConnection(“
jdbc:mysql://sunucuAdı/VeriTabanıAdı?useUnicode=true&characterEncoding=latin5
);

Türkçe karakter sorunu yaşamayız.
(Yukarıdaki kodlarda veritabanı kullanıcı adı ve şifre girilmemiştir. Gerektiği takdirde getConnection fonksiyonu içinde String karakter olarak 2. ve 3. parametere olarak kullanıcı adı ve şife girilebilir.)





Daha pratik kod yazımı için; Netbeans’da Interface Kullanımı

24 03 2007

Yazdığınız program içinde tüm değişkenleri bir class içine yazıp bunları program içinden çağırmak pratik bir iş olacaktır ancak bunun için her seferinde:

CagrilacakClassAdi VekilHarf=new CagrilacakClassAdi();
VekilHarf.degisken1;

şeklinde yazmak zor bir işlemdir.
Aşağıda anlatacağım metot ise başka class’da bulunan değişkeni direkt olarak kullanmamızı sağlar

Netbeans’ta project menüsü içinden ilgili projeti seçip sağ tıklayarak “New>New Interface” diyerek bir Interface dosyası içine diyoruz.

package mypack;

/**
*
* @author Suat ATAN
*/
public interface YeniInterface{

//ZAMAN BELIRTIR
int ZAMAN=0;

}

Koyu kısım dışındaki kodlar otomatik olarak oluşuyor. Bundan sonra değişkenlerimizi yazıp standart değerlerini yazıyoruz.(mesela zaman gibi)

Daha sonra bu interface’yi yine project menüsünden sağ tıklayarak compile ettikten sonra ana programımızın bulunduğu class’a gelip:

package ana;
import mypack.YeniInterface;//once degiskenlerin bulundugu class import ediliyor
/**
*
* @author Suat ATAN
*/
public class NewJFrame extends javax.swing.JFrame implements YeniInterface{
….

kodlarına yeşil kısımlarda gözüktüğü gibi önce import ile class’ı çağırıyor daha sonra implements ibaresi ile ana programa dahil ediyoruz.

Bundan böyle ana program içinden ZAMAN değişkeni direkt lokal değişkenmiş gibi tanınır.

Bu sistemin faydası çok değişkenkli programlarda değişkenleri tek yerde toplayıp organize etmektir.

Henüz denemedim ama interface içinde metotlar da kullanılabiliyor kanaatindeyim.





paint() metodu ile ilgili spotlar

21 03 2007

  1. Paint metodu bilindiği üzere Java’nın her türlü geometerik şekil, yazı ve resim gibi görselleri göstermek için kullanılan bir metot olup her nesne koordinat düzleminde yerleştirilir.
  2. Paint metodunun birebir başka bir event metodu altından çağrılması güç olduğundan çoğunlukla şartlı ifadelerle (if, switch…) olay yakalaması sağlanır.
  3. Paint metodunda koordinat düzlemi normal kordinat düzlemine göre Y ekseninde baş aşağıdır. Bu durumun yaratacğı sıkıntıları şöyle aşabilirsiniz. Çizim alanını kare varsayarak ebat adında bir değişken tanımlayın. Mesala int ebat=500 ; olsun Programın her açılışında setSize(ebat,ebat); programı her açılışta 500×500 piksel alanında açmış olursunuz. Koordinatlarınınzın 0,0 noktasının tam ortada olacağını varsayarak orijin diye bir değişken belirleyin: int orijin=(int)(ebat/2);
  4. Bundan sonra yapacağınız drawLine metotlarında drawLine(p1x,p1y,p2x,p2y) yerine drawLine(p1x,orijin-p1y,p2x,orijin-p2y) derseniz çizeceğin grafik sizin kendi yarattığınız 0,0 düzlemine göre değişecektir.
  5. Appletler içinde paint metodu kullanılca her repaint() çağrısı ekranın bir önceki halini silip yenisini yazar ancak JFrame’ler içinden repaint() işleminde önceki ekran değişmez yazı ve görseller üstüste biner. Bu durumu engellemek için ise repaint() yerine:

g.clearRect(silinecek alan x noktası,silinecek alan y noktası,silinecek alan en,silinecek alan boy);

metodunu kullanabilirsiniz böylece görsel nesneler üstüste binmez.





Netbeans’ta JSlider(Slider) Kullanımı

21 03 2007


Java programcılığı yaparken son kullanıcı için özellikle hızlı biçimde herhangi bir değer değişikliği yapmak istenildiğinde Slider’ler kullanılır. Resimde örneği görülen JSlider 0 ila 30 arasında saniyede değişecek kare hızını değiştiriyor.

Sizler de Netbeans içinde JSlider kullanarak benzer ve kullanışlı şeyler geliştirebilirsiniz.

JSlider’in Netbeansta kullanımı çok kolaydır.

Aşağıdaki yönergeleri takip ederek resimde görülen JSlider benzeri bir amaca hizmet eden bir obje yaratabilirsiniz.

  1. Öncelikle Netbeans Palette menüsünden Swing alt menüsü içerisinden (jbuton, jtextfield gibi objelerin seçildiği alan) JSlideri seçiyoruz.
  2. Bu obje seçili durumda iken properties menüsünden Max Value ve Min Value yazan yerlere Max Value(en büyük değer) olarak 30 Min Value (En küçük değer olarak) 0 yazıyoruz. Bunun anlamı JSliderimiz her sürüklendiğinde 0 ila 30 arasında değişecek.
  3. Şimdi Netbeans klasiği olarak yine Jslider objesi seçili iken sağ tıklayıp events menüsünden change alt menüsünü oradan da StateChanged tıklayıp JSlider sürüklendiğinde yapılacak işlemi tanımlamaya başlıyoruz.
  4. Aşağıdaki kod 3. maddede anlatılan ve JSliderin sürüklenmesi ile dinamik olarak değerin nasıl alınıp kullanılacağını göstermektedir: ——————-
    public void stateChanged(ChangeEvent e) {    JSlider dinamikdeger= (JSlider)e.getSource();    if (!source.getValueIsAdjusting()) {        int fps = (int)dinamikdeger.getValue();        if (fps == 0) {            if (!frozen) stopAnimation();        } else {            delay = 1000 / fps;            timer.setDelay(delay);            timer.setInitialDelay(delay * 10);            if (frozen) startAnimation();        }    }}
    
    ---------
  5. Yeşil ile yazılan kısımlara dikkat edilecek olursa öncelikle dinamikdeger adlı bir JSlider objesi yaratılıyor. Bunu her seferinde siz de yapacaksınız.
  6. Daha sonra bu deger .getValue() metodu ile alınıyor. Bu metot sonucunda ortaya çıkan Integer değer JSliderin sürüklenip bırakıldığı andaki 0 ile 30 arasındaki (tabi bizim uygulamamız içinde) değerdir.
  7. Bu değer yukarıdaki programda fps adlı değişkene yüklenip program içinde animasyon hızı olarak kullanılıyor.
  8. Max ve Min Value değerleri eksi işaretli de olabili söz gelimi -250 ila +250 arasında da JSlider yapılabilir.

İşte JSlider bu kadar basit ve kullanışlı bir objedir. Bu objeyi kullanırken oluşan problemler için mesajlarınızı bekliyoruz.