19 Nisan 2009 Pazar

Bir Film İzledim....

Hani deriz ya bazen bir film izledim, bir kitap okudum hayatım değişti diye ne kadar doğrudur bu söz. Ben birkaç kez yaşadım bunu hayatım değişti diyemeyeceğim ama bakışımı duruşumu her zaman okuduklarım, izlediklerim etkiledi. Bazen bana daha cesur olmayı öğrettiler, bazen daha çok çalışmayı. Ama hep birşeyler kattılar. Bu yazıyı yazmaya yaklaşık bir hafta önce karar verdim. O zaman yazacaklarımı belliydi ama geçen zaman içinde unuttum sanırım yazarken aklıma gelecekler o yüzden biraz dağınık bir yazı olacak.

Geçen hafta bir arkadaşımın tavsiyesi üzerine Beyaz Melek'i izledim. Çok bizden bir filmdi doğrusu izlediğimi o kadar çok sevindim ki. Evdeydim filmi izlerken annem,kardeşim sürekli etrafta olduğundan ağlamamak için kendimi zor tuttum ama bazen tutamadığım anlarda oldu doğrusu. Peki bu yazmamın asıl amacı neydi? Beni ağlatan birşeyi yazmak mı?

Ben bu yazıyı filmin sonunda çıkan bir yazıdan dolayı yazıyorum.
"Türkiye'de toplam 237 huzurevi bulunmaktadır. 16.188 kişinin yaşadığı huzurevlerinin %80'i büyükşehirlerdedir. Anadolu'da ise barındıracak yaşlı insan bulunamadığından huzurevlerinin %5'i kapatılmışıtır."
Bu yazıyı okuyunca şunu düşündüm doğrusu. "Biz bu insanlara ne yaptık da böyle oldu." Bu düşüncenin aynısına Mutluluk filminin başında olan bir oğlun gözyaşları içinde annesinden ondan utandığı için özür dilediğinde kapılmıştım.

Türkiye de kültür,adetler,göreneklerden uzaklaşma belirgin olarak zaten var. Fakat bu seviyeye gelmiş olması cidden düşündürücü. Bu ülke şimdiye kadar toplumsal bağlarıyla bu hale gelmişken bu toplumsal bağlar çok hızlı bir şekilde yok oluyor. Tabi bunun da en belirgin olarak görüldüğü yerler büyükşehirler. Büyükşehirlerde artık öyle bir insan yapısı var ki size selam veren birini gördüğünüzde artık şaşırıyorsunuz. Komşuluk ilişkilerinden zaten bahsetmiyorum hiç ama ne boyutta olduğunu görmeniz için bir olayı yazacağım.
"Ramazan günü bazı yörelerde adet olarak komşular birbirlerine yemek götürürler. Ev sahibimiz ramazanın ilk günü apartman içerisinde yemek verecek yer bulamamış. İnsanlar bizim yemeğimiz var diyerek yemeği kabul etmemişler. O da bu yemek eve gitmeyecek diyerek esnafa vermiş yemeği."

Beyaz Melek deki o söze geri dönersek eğer. Biraz kendimizi sorguladığımızda bulduklarımız kendimizi bile korkutacak seviyede. Aile kuracağımız zaman kaçımız anne babamızı yanına alacağını düşünüyor. Anne babamızın bakıma ihtiyacı olduğunda ben onları yanıma alırım bakarım yalnız bırakmam diye kaçımız söyleyebiliyoruz. Kaçımız, eşimiz bize "ya o ya ben" dediğinde karşı çıkacağız. Hadi bunlar çok derin sorular peki kaçımız arkadaşlarımızın yanında annemiz aradığında rahatlıkla konuşuyoruz. Rahatlıkla "annecim" diyebiliyoruz. Kaçımız dışarıda anne babamızın giyinişinden utanmadan onlarla rahatlıkla geziyoruz. Kaçımız onların bize yaptığı fedakarlıkların yarısı yapacağımıza inanıyoruz. İnsan bu sorulara cevap aradığında kendisinden cidden utanıyor.

Yaşımız artık bizleri belirli şeyleri düşünmeye itiyor. Hayatın rutininden kurtulduğumuz zamanlarda ileriyi düşündüğümüzde hepimizin bazı hayalleri var doğrusu. Maddi olarak hayaller hep değişse de, hepimiz ileride güzel bir aile hayatı istiyoruz. Çoluk çocuğumuz olsun, torunlarımız olsun beraber oynayalım diye hepimizin içinden geçiyor ileriye baktığımızda. Biraz önce yazdıklarıma baktığımda asıl soru ileriye baktığımızda ortaya çıkıyor. Biz çocuklarımızdan ne bekleyeceğiz, şu an bizim yaptıklarımızı kaldırabilirmiyiz, yaptıklarımızdan ne kadar utanacağız ve yaptıklarımıza baktıktan sonra ne yüzle bir beklenti içinde olacağız. Biraz düşünsek hiç fena olmaz doğrusu.....

8 Nisan 2009 Çarşamba

Bir bilgisayar mühendisi ne zaman tamam der....

22 yaşında bir bilgisayar mühendisliği öğrencisiyim. İlerisi hakkında düşündüğümde yapmam ve bilmem gerekenlere baktığımda içimi bir korku kaplıyor doğrusu. Geçenlerde okumam gereken programlama kitaplarının bir listesini yaptım. O an için listedeki kitap sayısı 20 kadardı. Şimdi ise çok daha fazla ve biliyorum gün geçtikçe artacak artacak artacak.Çünkü sürekli yeni bir teknoloji, yeni bir framework ve yeni versiyonlar ortaya çıkıyor. Hergün internet üzerinde dolaşırken bir çok dökumana göz gezdiriyor ve okuyorum. Her okuduğum dökümanda bilmediğim bir teknoloji,bir tanım veya bir yapı ortaya çıkıyor. Bunlar hakkında da biraz araştırma yaptığımda ise yenileri çıkıyor ve bu bir ağaç şeklinde devam ediyor.

İşte beni korkutan bu ağaç oluyor. Bu ağacın sonu yok belli. Peki nerede durmak gerek. Ne zaman ben bu bana yeter diyebileceğim. Sanırım bunu diyemeyeceğim de peki o zaman ne zamamn ben oldum diyebilirim. Bu sorunun bir cevabı var mı diye merak ediyorum. Ben biliyorum ki okumam gereken kitapları bitirsem kendime güvenim biraz daha artacaktır. Ben daha fazla birşeyler biliyorum diyebileceğim. Ama sürekli yeni kitaplar ekleneceğini düşünürsek sürekli de birşeyler eksik kalacaktır.

Peki daha güzel bir soruyla devam edelim. Bu kadar olumsuz bakıştan sonra bir bilgisayar mühendisinin görevi bütün teknolojileri bilmek midir? Yoksa ihtiyacı olduğunda araştırıp öğrenmesi mi gerekir. Ben açıkçası bu konuda bir bilgisayar mühendisinin mümkün olduğu kadar çok teknoloji üzerinde bilgi sahibi olması gerektiğini düşünüyorum. Tabi ihtiyacı olduğun araştıracaktır. Fakat bir insan boş zamanlarını yeni birşeyler araştırarak da değerlendirmelidir. Yeni birşeyler öğrenmek ille o kodu yazabilmek değildir. Ne işe yaradığını, nerede kullanılması gerektiğini,artı eksilerini bilmek bence bir bilgisayar mühendisi için gereklidir.

Bilgisayar mühendisi olarak bizlerin görevi yapılacak projede kullanılacak yapıları en verimli,en güvenli,en ucuz ve en kolay olarak belirlememizdir. Bilgisayar mühendisi açıkçası kullanılacak yapılar arasında hangisinin daha iyi olduğunu belirleyen kişidir. Yaptığı işte nelerin önemli olduğunu belirleyen buna göre tercihlerini yapandır. Yoksa oturup çalışan kod yazmak değildir bilgisayar mühendisinin işi. Bilgisayar mühendisi kod yazmamalıdır demiyorum ama asıl işi kod yazmak değildir.

Google ın Java Şef Mühendisi Joshua Bloch bir api tasarımı ile ilgili kitabında eğer apinizde nelerin önemli olduğunu belirlemek ve önemli kısımları iyileştirmek için nelerden vazgeçeceğiniz üzerine kafa patlatıyorsanız iyi bir yazılımcı oldunuz demektir diyor.

Ayrıca Sun ın sitesinde öğrencilere ünlü java geliştiricileri tarafından verilen tavsiyeler var okumanızı tavsiye ederim.

7 Nisan 2009 Salı

Bir Apple Reklamı....




Topluma uymayanlar, başkaldıranlar, problem çıkaranlar,

kare deliklerdeki yuvarlak çiviler, nesneleri farklı görenler,
kurallardan çok hoşnut değiller.

Süregelene saygıları yok.

Onların sözünü tekrarlayabilirsiniz,
onlara katılmayabilirsiniz,
onları göklere de çıkartabilirsiniz,
aleyhlerinde de konuşabilirsiniz.

Ama yapamayacağınız tek şek onları umursamamaktır.
Çünkü onlar nesneleri değiştiriyorlar.
İnsan ırkını ileriye sürüyorlar.

Ve her nekadar bazıları onları çılgın olanlar olarak görse de,
biz dâhilik görüyoruz.

Çünkü dünyayı değiştirebileceğine inanacak kadar çılgın olanlar,
dünyayı değiştirenlerdir.

6 Nisan 2009 Pazartesi

Facebook Göndermeleri

Facebook çok önemli bir site tamam lafım yok buna hergün bende bilmem kaç kere tıklıyorum. Son zamanlarda malum facebook video olayına da el attı ve bence artık facebook daki en büyük kullanım bu videolarda oluyor. Hergün onlarca video gönderiliyor. Youtube un pabucu dama atıldı diyebiliriz neredeyse. Ben sadece bir giriş olsun diye yazdım buraya kadar olan kısmı öyle facebook ne kadar büyük bir icat, hayatımızın herşeyi olayına girmeyeceğim. Benim asıl belirtmeye çalıştığım olay daha farklı, facebook üzerinden yapılan siyaset ve eleştiriler.

Ben insanların siyasi görüşlerine daima saygı duydum. İstediğin her düşünceye inanabilirsin. Fakat facebookta bu işin cidden cılkı çıktı diyebilirim. Genelde Akp ye karşı olanlar özellikle seçimlerden sonra çok fazla şekilde ağır konuşmaya başladılar. Açıkçası insanların bu kadar sinirlenmelerini anlamıyorum. Bazı şeyleri sanırım daha oturtamadık biz. Özellikle bu çoğunluğun seçimi olayını, düzeyli tartışarak fikirlerini yaymayı düşüncelerini açıklamayı. Mesela ben kalkıp Akpli bir adamın yanlış yaptığını ülkeyi kötülüğe sürüklediğini söylemek istesem kalkıp ona koyun, yardıma, kömüre aldanan aptal, fethullahçı gibi sıfatlar kullanmam. Kullanırsam adamı daha çok o partiye bağlarım öncelikle. Mesela ben Galatasaraylıyım sen bana Fenerbahçenin 6 tane attığı videoyu atıp altına 6alatasaray,ezikler. Yazarsan ben fenerli mi olacağım, benim aklım başıma mı gelecek. Var mı böyle bir saçmalık Allah aşkına.

Eğer bir insan bu şekilde yorumlar yapıyorsa sadece kendi egosunu tatmin ediyor demektir ve bunun başka bir açıklaması da yoktur. Bunları sadece senin düşüncendeki adamlar okur ve bunun ikinize de yararı olmaz. Bu yüzden benim sizlere önerim biraz daha insancıl yaklaşmanız olacaktır. Aşağılayarak,rencide ederek, aptal olmakla, üç kuruşa satmakla suçlayarak düşüncelerinizi onaylatamazsınız. Sadece bazılarının ekmeğine yağ sürmüş olursunuz. Kendi safınızı belirtirsiniz, antipati toplarsınız ve sizinle aynı düşünceye sahip bazı insanlarında desteğini alırsınız.

Peki ya doğru yöntem nedir? Benim görüşüme göre böyle bir video gönderecekseniz. Videoya başlığı sadece konuyu belirten birşey yazın ama bu gerçek yüzü falan olması. Mesela diyelim ki Erdoğanın ünlü laik konuşmasını gönderiyorsanız."Erdoğan" yazın ve geçin. Bu şekilde herkesin dinlemesini sağlamış olursunuz. Lütfen iletilerinizde insanları aşağılamaya, küçük düşürmeye çalışmayın. Uğur Dündar ın Akp oy oranlarını açıklarken eğitim düzeyini bas bas vurgulaması gibi olayları vurgulamayın. Bu tür bir vurgulama eğitimli kişiler oy kullansın gibi demokrasi anlayışına ters yaklaşımlar ortaya çıkartır ve eğitim düzeyi düşük insanların antipatisini çeker. İnsanların davranışlarını inada bindirmiş olursunuz. Yorumlarınızı yaparken bu ülkenin değerlerine laf dokundurmayın. Hatta özellikle bu değerlerin ne kadar değiştirilmeye çalışıldığından bahsedin. Ben size bu konuda bir çok magazinsel programda görmeye alıştığınız "Gönül Çil" in Bahçeşehir Üniversitesinde yaptığı konuşmayı öneririm. Bu teyzem eğitimli biri değil ama o kadar güzel ve doğru konuşuyor ki birçok eğitimlinin yapamadığını yapıyor ve herkes bu kadını ayakta alkışlıyor. Bu teyzemin konuşması bence emsal niteliği taşıyor bizlere.

3 Nisan 2009 Cuma

Kaynak Kodlarını Html Kodu Haline Getirme

Kaynak dosyalarını html koduna çeviren bir site kodlarınızın derli toplu olması ve < gibi işaretlerden dolayı bozulmaması için çok kullanışlı.
http://formatmysourcecode.blogspot.com/

30 Mart 2009 Pazartesi

Hatalı Kod Düzenlemesi1

Açıkçası kod yazma geçmişim çok eski değil fakat her programcı gibi kod yazma becerilerim gün geçtikçe artıyor. Bunun nedeni tecrübe değil doğrusu işin tekniğini okuyarak öğrenmek oldu benim için. Bu becerileri birçok kitaptan elde ettim bu sayede artık okuduğum kitaplardaki hataları buluyorum, vay aptal bile dediklerim oluyor. Yaşıma ve benden ne kadar tecrübeli olduklarına bakmadan. Mesela şimdi biraz örnek göstereceğim neyin nasıl yapılması gerektiği konusunda.

Hatalı Kod:

class Urun {

private String ad = "";
private int fiyat = 0;

public Urun(String ad, int fiyat) {
this.ad = ad;
this.fiyat = fiyat;
}

public int getFiyat() {
return fiyat;
}

public void setFiyat(int fiyat) {
this.fiyat = fiyat;
}

public String getAd() {
return ad;
}

public void setAd(String ad) {
this.ad = ad;
}
}

public class Satis {

private ArrayList<Urun> urunler = new ArrayList<Urun>();

public void yeniUrunEkle(Urun urun) {
urunler.add(urun);
}

public void urunCıkar(String urunAdi) {
Urun silinecekUrun = null;
boolean sil = false;
for (Urun u : urunler) {
if (u.getAd().equals(urunAdi)) {
silinecekUrun = u;
sil = true;
break;
}
}
if (sil) {
urunler.remove(silinecekUrun);
}
}

public int toplamFiyat() {
int toplamFiyat = 0;
for (Urun u : urunler) {
toplamFiyat += u.getFiyat();
}
return toplamFiyat;
}

public static void main(String[] args) {
Satis satis = new Satis();
satis.yeniUrunEkle(new Urun("Harddisk",1000));
System.out.println(satis.toplamFiyat());
satis.yeniUrunEkle(new Urun("Ekran Karti",2000));
System.out.println(satis.toplamFiyat());
satis.yeniUrunEkle(new Urun("Ses Karti",1500));
System.out.println(satis.toplamFiyat());
satis.urunCıkar("Harddisk");
}
}


Şimdi bu kodumuzda neler eksik ve neler hatalı ona bakacağız baya hatalı bir kod olduğunu söylemem gerek.

1-) Burada en dikkat çeken hata toplamFiyat() metodudur. Bu metotda her çağırışta fiyat yeniden toplanmaktadır. Bunun yerine yapılması gereken ise bir global toplam fiyat değişkeni yapıp sınıfı buna göre dizayn etmekten geçer. Bu şekilde her toplam metodu çağırıldığında bütün liste yeniden taranmamış olur. Bu tip hatalar programın gereksiz yere bilgisayar kaynaklarını kullanmasına sebep olur.


public class Satis {

private int toplamFiyat = 0;
private ArrayList<Urun> urunler = new ArrayList<Urun>();

public void yeniUrunEkle(Urun urun) {
urunler.add(urun);
toplamFiyat += urun.getFiyat();
}

public void urunCıkar(String urunAdi) {
Urun silinecekUrun = null;
boolean sil = false;
for (Urun u : urunler) {
if (u.getAd().equals(urunAdi)) {
silinecekUrun = u;
sil = true;
break;
}
}
if (sil) {
urunler.remove(silinecekUrun);
toplamFiyat -= silinecekUrun.getFiyat();
}
}

public int toplamFiyat() {
return toplamFiyat;
}

public static void main(String[] args) {
Satis satis = new Satis();
satis.yeniUrunEkle(new Urun("Harddisk", 1000));
System.out.println(satis.toplamFiyat());
satis.yeniUrunEkle(new Urun("Ekran Karti", 2000));
System.out.println(satis.toplamFiyat());
satis.yeniUrunEkle(new Urun("Ses Karti", 1500));
System.out.println(satis.toplamFiyat());
satis.urunCıkar("Harddisk");
}
}


2-)Bu programdaki diğer bir hata ise urunCikar(String urunAdi) metodunda kullanılan foreach döngüsüdür. Bu şekilde isimle ürün arama işlemlerinde Hashtable yapısı kullanılması program sistem kaynakları açısından çok büyük yararlar kazandırır.
Hashtable veri yapısına göre Satis sınıfımızı düzenlersek.


public class Satis {

private int toplamFiyat = 0;
private Hashtable<String,Urun> urunler = new Hashtable<String,Urun>();

public void yeniUrunEkle(Urun urun) {
urunler.put(urun.getAd(), urun);
toplamFiyat += urun.getFiyat();
}

public void urunCıkar(String urunAdi) {
Urun silinecekUrun = urunler.remove(urunAdi);
if (silinecekUrun != null) {
toplamFiyat -= silinecekUrun.getFiyat();
}
}

public int toplamFiyat() {
return toplamFiyat;
}

public static void main(String[] args) {
Satis satis = new Satis();
satis.yeniUrunEkle(new Urun("Harddisk", 1000));
System.out.println(satis.toplamFiyat());
satis.yeniUrunEkle(new Urun("Ekran Karti", 2000));
System.out.println(satis.toplamFiyat());
satis.yeniUrunEkle(new Urun("Ses Karti", 1500));
System.out.println(satis.toplamFiyat());
satis.urunCıkar("Harddisk");
}
}

Using Signed Applet

Applet java şu sıralar gözden düşmüş bir teknolojisi fakat Türkiye de birçok şirket Java ile uygulama yapıldığından bazen üstleriniz sizden appletle ile yapılmış bir program isteyebiliyor. Benimde başıma böyle bir durum geldi doğrusu bir senaryoyu gösterecek bir applet yapmam istendi. Ağaç yapısını yaprakları birbirine sokmadan yapmanın ne kadar zor olduğunu anlamış oldum bu şekilde. Appletimin içinde bir filechooser kullanmam gerekiyordu. Applet viewer çalıştırdım çok güzel çalıştı fakat web browser da bir türlü çalışmadı bende araştırdım.(Bir bilene danıştım.) Appletin signed applet haline getirilmesi gerekiyormuş bu tür durumlar için. Bilginiz olsun eğer applet yeni bir panel yada dialog açması gerekiyor yada bilgisayar üzerinde değişiklik yapma ihtiyacı duyuyorsa security manager engeline takılmaması için signed applete çevirin bu şekilde bu sorunu aşabilirsiniz. Bu durumda applet başlamadan önce jre sizden onay ister. Eğer onay verirseniz applet yüklenir.
Appleti signed etmek için tıklayın

27 Mart 2009 Cuma

Autoboxing Problem in foreach in Java

Java2 ile javaya eklenen foreach döngüsü en çok kullandığımız döngü oldu birden fakat bu döngü kullanılırken dikkat edilmesi gereken birkaç bölüm var.
1-)
List<String> strings=new ArrayList<String>();
for(String s:strings){
strings.remove(s);
}

Foreach döngüsü kullanırken dikkat edilmesi gereken hususlardan birisi liste üzerinde değişiklik yapılmasına izin verilmemesidir. Yukarıdaki örnekteki gibi silme ve ekleme işlemlerinde uyarı alırsınız. Tabi bu runtime da olur. Compile uyarısı değildir. Bu tür durumlarda eski yönteme dönmeniz gerekir.

for(Iterator iter=strings.iterator();iter.hasNext();){

}

yada geçici bir liste tutmanız gerekir.
List<String> tempList=new ArrayList<String>();
for(String s:strings)
{
if(s.equals("Ali")){
tempList.add(s);}
}
strings.removeAll(tempList);


İkinci yöntem daha garantilidir.

2-)foreach döngüsünde dikkat edilmesi gereken diğer bir husus ise primitive type larda autoboxing , String ise immutable durumundan dolayı oluşan farklı bir memory location gösterme durumudur. Örneğin

for(String s:strings){
// örneğin her elemana "01" yazısını eklemek istiyoruz.
s=s+"01";
}
bunu işlemi yaptığınızda olması beklenen şey bütün elemanlara "01" eklenmesidir. Fakat strings immutable olduğundan dolayı bunu yazdığımızda artık s nesnesi farklı bir nesneyi gösterir bu yüzden yaptığımız değişiklik liste üzerinde etki etmez. Bunu çözmek için yine eski yöntemi kullanacağız.

for(int i=0;i<strings.size();i++){
strings.set(i,strings.get()+"01");
}


int,double,float gibi primitive typelarda da aynı durum farklı bir nedenle meydana gelir. foreach döngüsü sadece nesneler üzerinde çalışır. Bu yüzden int gibi primitive typelar autoboxing ile Integer nesnesine çevirilir. İşte bu durum olay array üzerinde değişiklik yapmak gerektiğinde bize foreach döngüsünde sorun çıkartır.

int[] ints=new int[20];

for(Integer i:ints){
i+=20;
}

Yukarıdaki kodda listedeki bütün elemanlarının değerlerinin 20 artması beklenir fakat biz toplama işlemini yaptığımızda autoboxing yöntemi tekrar çalışır ve artık i nesnesi bize array in bir elemanını göster bu yüzden liste üzerinde bir değişiklik oluşmaz. Bunu da çözmenin yolu yine eski yönteme dönmektir.

for(int i=0;i<ints.length;i++){
ints[i]+=20;
}

26 Mart 2009 Perşembe

Singleton Desing Pattern, Tek bir nesne oluşturma

Singleton Tasarım şablonu bir sınıftan sadece bir nesne oluşturma esasına dayanır. Bu yapıyı oluşturmadaki en önemli husus ise sınıftan nesne oluşturulmasını engelleme bölümüdür. Bunu sağlamak için sınıfın constructor ı private olarak tanımlanır. Bu şekilde sınıftan nesne oluşturulumu engellenmiş olur.

/**@author Uğur Erdinç urec2005@hotmail.com
**/
public class Singleton{

private Singleton instance=new Singleton();

private Singleton(){
//Code
}

public Singleton getInstance(){
return instance;
}

}

Java Swing PopMenu ve MenuItem

Java Swing üzerinde bir Popup Menu oluşturmak için öncelikle hangi component üzerinde oluşması gerektiğini belirliyorsunuz ve o component a bir MouseActionListener ekliyorsunuz.Ben burada bir table üzerine ekleme yapacağım.

JTable table = new JTable();
table.addMouseListener(new java.awt.event.MouseAdapter() {

public void mousePressed(java.awt.event.MouseEvent evt) {
tableMousePressed(evt);
}
});


MousePressed metodumuzu yazdıkdan sonra sağ tıklama ile bir popup menü oluşturmak için sağ tuşuna basılıp basmadığını kontrol ediyoruz.Koyu olarak yazdığım kısım sağ tuş ile tıklanıp tıklanılmadığını kontol ediyor.

private void tableMousePressed(java.awt.event.MouseEvent evt) {
if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) {
}
}


Sağ tuşa tıkladığını anladığımızda tıklanılan yerde bir popup menü oluşturmak için.Aşağıdaki yöntemi kullanıyoruz.

private void tableMousePressed(java.awt.event.MouseEvent evt) {
if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) {
JPopupMenu jPopupMenu1 = new JPopupMenu();
jPopupMenu1.setLocation(evt.getPoint());
jPopupMenu1.setInvoker(table);
}
}


Popup Menümüze seçenekler eklemek ve seçeneklerimizi belirli bir action göndermek için ise frame (yada panel) sınıfımızın içinde yeni bir sınıf oluşturuyoruz.

public class DesktopApplication1View extends FrameView {

public class PopupActionListener implements ActionListener {
public void actionPerformed(ActionEvent actionEvent) {

}
}
}

Bu işlemi yaptıktan sonra ise pop-up menümüze seçenekleri ekliyoruz.

private void tableMousePressed(java.awt.event.MouseEvent evt) {
if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) {
JPopupMenu jPopupMenu1 = new JPopupMenu();
jPopupMenu1.setLocation(evt.getPoint());
jPopupMenu1.setInvoker(table);
ActionListener ae = new PopupActionListener();
JMenuItem copyItem = new JMenuItem("Copy");
copyItem.addActionListener(ae);
jPopupMenu1.add(copyItem);
JMenuItem cut = new JMenuItem("Cut");
cut.addActionListener(ae);
jPopupMenu1.add(cut);
}
}


Menu özelliklerini ekledikden sonra ise verdiğimiz isimlere göre PopUpActionListener a göre actionlar ekliyoruz.

public class DesktopApplication1View extends FrameView {

public class PopupActionListener implements ActionListener {
public void actionPerformed(ActionEvent actionEvent) {
if (actionEvent.getActionCommand().equals("Copy")) {
//action
}else if(actionEvent.getActionCommand().equals("Cut")) {
//action
}
}
}
}


Ve bu şekilde istediğimiz PopUpMenuye ulaşmış oluyoruz.

19 Mart 2009 Perşembe

Dual List Dialog

Dual liste için internette biraz araştırma yaptım fakat tam istediğimi bulamayınca kendim yaptım. Siz uğraşmak zorunda kalmayın.
import java.awt.Container;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.swing.AbstractListModel;
import javax.swing.BoxLayout;
import javax.swing.JDialog;
import javax.swing.JFrame;

/**
*
* @author Uğur Erdinç urec2005@hotmail.com
*/
public class DualListBoxDialog extends JDialog {

private static final long serialVersionUID = 1L;
private Set<String> listsValues = null;
private List<String> unSelectedElements = new ArrayList<String>();
private List<String> selectedElements = new ArrayList<String>();
private AbstractListModelImpl unSelectedElementsListModel = new AbstractListModelImpl();
private AbstractListModelImpl selectedElementsListModel = new AbstractListModelImpl();
private static boolean sendSelectedElements = false;
private javax.swing.JList SelectedElementsList;
private javax.swing.JButton rightButton;
private javax.swing.JButton allRightButton;
private javax.swing.JButton leftButton;
private javax.swing.JButton allLeftButton;
private javax.swing.JButton okButton;
private javax.swing.JButton cancelButton;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JButton moveToButtomButton;
private javax.swing.JButton moveToDownButton;
private javax.swing.JButton moveToTopButton;
private javax.swing.JButton moveToUpButton;
private javax.swing.JList unSelectedElementsList;
// End of variables declaration

private class AbstractListModelImpl extends AbstractListModel {

private static final long serialVersionUID = -3157345586446100254L;
private String[] strings = {""};

public AbstractListModelImpl() {
}

public int getSize() {
return strings.length;
}

public Object getElementAt(int i) {
return strings[i];
}

public void setData(String[] strings) {
this.strings = strings;
fireContentsChanged(strings, 0, strings.length - 1);
}
}

public DualListBoxDialog(Set<String> listsValues, JFrame frame) {
super(frame, true);
this.listsValues = listsValues;
unSelectedElements.addAll(listsValues);
Container contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
jScrollPane1 = new javax.swing.JScrollPane();
unSelectedElementsList = new javax.swing.JList();
jScrollPane2 = new javax.swing.JScrollPane();
SelectedElementsList = new javax.swing.JList();
rightButton = new javax.swing.JButton();
allRightButton = new javax.swing.JButton();
leftButton = new javax.swing.JButton();
allLeftButton = new javax.swing.JButton();
moveToButtomButton = new javax.swing.JButton();
moveToDownButton = new javax.swing.JButton();
moveToUpButton = new javax.swing.JButton();
moveToTopButton = new javax.swing.JButton();
okButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
setName("Form");
jScrollPane1.setName("jScrollPane1");
contentPane.add(jScrollPane1);
unSelectedElementsList.setModel(unSelectedElementsListModel);
unSelectedElementsList.setName("unSelectedElementsList");
jScrollPane1.setViewportView(unSelectedElementsList);
jScrollPane2.setName("jScrollPane2");
SelectedElementsList.setModel(selectedElementsListModel);
SelectedElementsList.setName("SelectedElementsList");
jScrollPane2.setViewportView(SelectedElementsList);
contentPane.add(jScrollPane2);
rightButton.setText("Right");
rightButton.setName("rightButton");
rightButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
rightButtonActionPerformed(evt);
}
});
contentPane.add(rightButton);
allRightButton.setText("All Right");
allRightButton.setName("allRightButton");
allRightButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
allRightButtonActionPerformed(evt);
}
});
contentPane.add(allRightButton);
leftButton.setText("Left");
leftButton.setName("leftButton");
leftButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
leftButtonActionPerformed(evt);
}
});
contentPane.add(leftButton);
allLeftButton.setText("All Left");
allLeftButton.setName("allLeftButton");
allLeftButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
allLeftButtonActionPerformed(evt);
}
});
contentPane.add(allLeftButton);
moveToButtomButton.setText("Buttom");
moveToButtomButton.setName("moveToButtomButton");
moveToButtomButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
moveToButtomButtonActionPerformed(evt);
}
});
contentPane.add(moveToButtomButton);
moveToDownButton.setText("Down");
moveToDownButton.setName("moveToDownButton");
moveToDownButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
moveToDownButtonActionPerformed(evt);
}
});
contentPane.add(moveToDownButton);
moveToUpButton.setText("Up");
moveToUpButton.setName("moveToUpButton");
moveToUpButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
moveToUpButtonActionPerformed(evt);
}
});
contentPane.add(moveToUpButton);
moveToTopButton.setText("Top");
moveToTopButton.setName("moveToTopButton");
moveToTopButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
moveToTopButtonActionPerformed(evt);
}
});
contentPane.add(moveToTopButton);
okButton.setText("OK");
okButton.setName("okButton");
okButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
contentPane.add(okButton);
cancelButton.setText("Cancel");
cancelButton.setName("cancelButton");
cancelButton.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
contentPane.add(cancelButton);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(contentPane);
contentPane.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(layout.createSequentialGroup().add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING).add(layout.createSequentialGroup().addContainerGap().add(okButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 58, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).add(18, 18, 18).add(cancelButton)).add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup().add(18, 18, 18).add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 172, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).add(18, 18, 18).add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false).add(allRightButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(allLeftButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(leftButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(rightButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).add(27, 27, 27).add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 172, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED).add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false).add(moveToUpButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(moveToButtomButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(moveToDownButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(moveToTopButton)))).addContainerGap(24, Short.MAX_VALUE)));
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(layout.createSequentialGroup().add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(layout.createSequentialGroup().add(117, 117, 117).add(rightButton).addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED).add(allRightButton).addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED).add(leftButton).addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED).add(allLeftButton)).add(layout.createSequentialGroup().add(45, 45, 45).add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING).add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 296, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 296, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))).add(layout.createSequentialGroup().add(121, 121, 121).add(moveToTopButton).addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED).add(moveToUpButton).addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED).add(moveToDownButton).addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED).add(moveToButtomButton))).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 9, Short.MAX_VALUE).add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE).add(cancelButton).add(okButton)).addContainerGap(31, Short.MAX_VALUE)));
reorderLists();
pack();
}

private void rightButtonActionPerformed(java.awt.event.ActionEvent evt) {
int[] selectedListValues = unSelectedElementsList.getSelectedIndices();
if (selectedListValues != null && selectedListValues.length > 0) {
for (Integer i : selectedListValues) {
selectedElements.add(unSelectedElements.remove(i.intValue()));
}
reorderLists();

}
}

private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {
setVisible(false);
dispose();
sendSelectedElements = true;
}

private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
setVisible(false);
dispose();
sendSelectedElements = false;
}

private void allRightButtonActionPerformed(java.awt.event.ActionEvent evt) {
selectedElements.addAll(unSelectedElements);
unSelectedElements.clear();
reorderLists();
}

private void leftButtonActionPerformed(java.awt.event.ActionEvent evt) {
int[] selectedListValues = SelectedElementsList.getSelectedIndices();
if (selectedListValues != null && selectedListValues.length > 0) {
for (Integer i : selectedListValues) {
unSelectedElements.add(selectedElements.remove(i.intValue()));
}
reorderLists();
}
}

private void allLeftButtonActionPerformed(java.awt.event.ActionEvent evt) {
unSelectedElements.addAll(selectedElements);
selectedElements.clear();
reorderLists();
}

private void moveToTopButtonActionPerformed(java.awt.event.ActionEvent evt) {
int[] selectedListValues = SelectedElementsList.getSelectedIndices();
if (selectedListValues != null && selectedListValues.length > 0) {
List<String> tempList = new ArrayList<String>();
for (Integer i : selectedListValues) {
tempList.add(selectedElements.get(i));
}
selectedElements.removeAll(tempList);
selectedElements.addAll(0, tempList);
reorderLists();
for (int i = 0; i < selectedListValues.length; i++) {
selectedListValues[i] = i;
}
SelectedElementsList.setSelectedIndices(selectedListValues);
}
}

private void moveToUpButtonActionPerformed(java.awt.event.ActionEvent evt) {
int[] selectedListValues = SelectedElementsList.getSelectedIndices();
int[] newSelectedListValues = new int[selectedListValues.length];
if (selectedListValues != null && selectedListValues.length > 0) {
int count = 0;
ArrayList<String> firstElements = new ArrayList<String>();
boolean checkFirstElement = true;
for (Integer i : selectedListValues) {
if (checkFirstElement && i == 0) {
firstElements.add(selectedElements.remove(0));
for (int j = 0; j < selectedListValues.length; j++) {
selectedListValues[j]--;
}
checkFirstElement = false;
newSelectedListValues[count] = Integer.MAX_VALUE;
} else if (i == 0) {
firstElements.add(selectedElements.remove(0));
newSelectedListValues[count] = Integer.MAX_VALUE;
for (int j = 0; j < selectedListValues.length; j++) {
selectedListValues[j]--;
}
} else {
selectedElements.add(i.intValue() - 1, selectedElements.remove(i.intValue()));
newSelectedListValues[count] = i.intValue() - 1;
}
count++;
}
count = 0;
if (firstElements.size() != 0) {
selectedElements.addAll(0, firstElements);
for (int i = 0; i < newSelectedListValues.length; i++) {
if (newSelectedListValues[i] == Integer.MAX_VALUE) {
newSelectedListValues[i] = count;
count++;
} else {
newSelectedListValues[i]++;
}
}
}
reorderLists();
SelectedElementsList.setSelectedIndices(newSelectedListValues);
}
}

private boolean moveGroupDown(ArrayList<Integer> group) {
if (group.isEmpty()) {
return false;
}
if (selectedElements.size() - 1 == group.get(group.size() - 1).intValue()) {
return false;
} else {
ArrayList<String> tempList = new ArrayList<String>();
for (int i = 0; i < group.size(); i++) {
tempList.add(selectedElements.remove(group.get(0).intValue()));
}
int position = group.get(0).intValue() + 1;
for (String s : tempList) {
selectedElements.add(position, s);
position++;
}
return true;
}
}

private void moveToDownButtonActionPerformed(java.awt.event.ActionEvent evt) {
int[] selectedListValues = SelectedElementsList.getSelectedIndices();
if (selectedListValues != null && selectedListValues.length > 0) {
ArrayList<Integer> group = new ArrayList<Integer>();
for (int index = 0; index < selectedListValues.length; index++) {
int selectedValue = selectedListValues[index];
if (group.isEmpty()) {
group.add(selectedValue);
} else {
if (group.get(group.size() - 1).intValue() == selectedValue - 1) {
group.add(selectedValue);
} else {
if (moveGroupDown(group)) {
for (int j = index - group.size(); j < index; j++) {
selectedListValues[j]++;
}
}
group.clear();
}
}
}
if (moveGroupDown(group)) {
for (int j = selectedListValues.length - group.size(); j < selectedListValues.length; j++) {
selectedListValues[j]++;
}
}
reorderLists();
SelectedElementsList.setSelectedIndices(selectedListValues);
}
}

private void moveToButtomButtonActionPerformed(java.awt.event.ActionEvent evt) {
int[] selectedListValues = SelectedElementsList.getSelectedIndices();
if (selectedListValues != null && selectedListValues.length > 0) {
int position = selectedElements.size() - 1;
List<Integer> tempList = new ArrayList<Integer>();
for (Integer i : selectedListValues) {
tempList.add(i);
}
Collections.sort(tempList);
Collections.reverse(tempList);
for (Integer i : tempList) {
selectedElements.add(position, selectedElements.remove(i.intValue()));
position--;
}
position = selectedElements.size() - 1;
reorderLists();
for (int i = 0; i < selectedListValues.length; i++) {
selectedListValues[i] = position;
position--;
}
SelectedElementsList.setSelectedIndices(selectedListValues);
}
}

private void reorderLists() {
Collections.sort(unSelectedElements);
selectedElementsListModel.setData(selectedElements.toArray(new String[selectedElements.size()]));
unSelectedElementsListModel.setData(unSelectedElements.toArray(new String[unSelectedElements.size()]));
getContentPane().repaint();
unSelectedElementsList.setSelectedIndices(new int[]{});
SelectedElementsList.setSelectedIndices(new int[]{});
}
}