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[]{});
}
}