Konuyu görüntüle
IUCODERS FORUM > Programlama > JAVA > Java swing
Yazar
serdr


avatar
Istanbul
Kayıt: 13.07.2006
19.02.2007-12:04 #17118
Java swing (JFrame vs) ile uğraşanlar mutlaka olmuştur.
şöyle bi durum var:
amaç yeni bi frame açıp içindeki bi scrollable panelin içine 200 adet tuş(vb) koymak.

JFrame  fr=new JFrame("yeni pencere");
        fr.setSize(1024,738);  // boyut, lokasyon vs..
        fr.setLocation(0,0);     //..
        fr.setLayout(null);       //..
        fr.setVisible(true);       //..
       
        
        Container f_con= fr.getContentPane();  // pencere içerik taşıyıcısı.. nesneler buna eklenecek
        f_con.setLayout(null);                          //..
        
        
        JPanel list =new JPanel();  //> içinde 190 tane tuş alt alta bulunan bi liste paneli olacak
        list.setLayout(null);           //..
        list.setSize(1015,650);      //..


        for(int i=0;i<200;i++){    //> 200 tane tuşu  liste paneline ekle, ve boyutunu büyüt
            JButton newbut=new JButton("buton>"+i);
            newbut.setSize(99,29);
            newbut.setLocation(1,i*50);

            list.add(newbut); 
            list.setPreferredSize(new java.awt.Dimension(997,i*50));
         }
        
        JScrollPane mainpanel=new JScrollPane(list);  //> bu scrollable bölümün içinde liste bulunacak
  
        mainpanel.setSize(1015,650);
        mainpanel.setLocation(5,50);
 
   
        f_con.add(mainpanel);  // pencere taşıyıcısına   mainpaneli ekle




bu program compile da bi sorun vermiyor. yalnız çalıştığına bazen ok, bazen de boş pencere çıkarıyor. (rakamı büyütürsek bu daha sık oluyor)
.. 200 adet tuş ekleyemezmi swing? yeri gelir 2000 nesne eklenir yani.

yoksa code un yönteminde mi bi arıza var anlayamadım.






Yazar
onur


avatar
Two Story Town
Kayıt: 14.01.2006
19.02.2007-14:06 #17124
Dikkat ettiysen yazdigin kodda frame i olusturuyorsun ancak pencereyi kapattigin vakit olacaklara
dair herhangi birsey yazmamissin.Yani sen her class i calistirdiginda o heap te yerini aliyor ancak
pencereyi kapatinca kapansada o class calismaya devam ediyor.

koda fr.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

ekledim duzeldi. 9-10 kere calistirdim bir sorun gormedim.

import javax.swing.*;
import java.awt.Container;
public class Test {

    	public Test() {
   		 
   		 buttonEkle();
   		 
   		 }
   		 
	    public void buttonEkle(){
                JFrame fr=new JFrame("yeni pencere");
		fr.setSize(1024,738); // boyut, lokasyon vs..
		fr.setLocation(0,0); //..
		fr.setLayout(null); //..
		fr.setVisible(true); //..
                fr.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		Container f_con= fr.getContentPane(); // pencere içerik taşıyıcısı.. nesneler buna
		f_con.setLayout(null); //..
		
		
		JPanel list =new JPanel(); //> içinde 190 tane tuş alt alta bulunan bi liste paneli olacak
		list.setLayout(null); //..
		list.setSize(1015,650); //..
		
		
		for(int i=0;i<200;i++){ //> 200 tane tuşu liste paneline ekle, ve boyutunu büyüt
		JButton newbut=new JButton("buton>"+i);
		newbut.setSize(99,29);
		newbut.setLocation(1,i*50);
		
		list.add(newbut);
		list.setPreferredSize(new java.awt.Dimension(997,i*50));
		}
		
		JScrollPane mainpanel=new JScrollPane(list); //> bu scrollable bölümün içinde liste
		
		mainpanel.setSize(1015,650);
		mainpanel.setLocation(5,50);
		
		
		f_con.add(mainpanel); // pencere taşıyıcısına mainpaneli ekle

	    }
	    
	    public static void main(String[] args){
	    	Test t = new Test();
	    }
    
}



Bir de 200 tane buttonu for un icinde container a doldurmak islemciyi oldurmeden thread ile yapilabilir.

import javax.swing.*;
import java.awt.Container;
public class Test2{
        JFrame fr;
    	public Test2() {
            
           thread1 = new Thread(){
               public void run(){
                 while(true){
                     threadButtonEkle();
                 }
               }
             };
             thread1.start();
            
        }
        
        public void threadButtonEkle(){
	    
                    fr=new JFrame("yeni pencere");
                    fr.setSize(1024,738); // boyut, lokasyon vs..
                    fr.setLocation(0,0); //..
                    fr.setLayout(null); //..
                    fr.setVisible(true); //..
                    fr.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

                    Container f_con= fr.getContentPane(); // pencere içerik taşıyıcısı.. nesneler buna
                    f_con.setLayout(null); //..


                    JPanel list =new JPanel(); //> içinde 190 tane tuş alt alta bulunan bi liste paneli
                    list.setLayout(null); //..
                    list.setSize(1015,650); //..


                    for(int i=0;i<200;i++){ //> 200 tane tuşu liste paneline ekle, ve boyutunu büyüt
                        JButton newbut=new JButton("buton>"+i);
                        newbut.setSize(99,29);
                        newbut.setLocation(1,i*50);

                        list.add(newbut);
                        list.setPreferredSize(new java.awt.Dimension(997,i*50));
                    }

                    JScrollPane mainpanel=new JScrollPane(list); //> bu scrollable bölümün içinde liste

                    mainpanel.setSize(1015,650);
                    mainpanel.setLocation(5,50);

                    f_con.add(mainpanel); // pencere taşıyıcısına mainpaneli ekle
                    thread1.stop();
               
        }
            
	    public static void main(String[] args){
	    	Test2 t = new Test2();
	    }
    
            private Thread thread1;
}








Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
19.02.2007-14:20 #17125
swingle uğraşırken profiler kullanmakta fayda var.





N/A
Yazar
serdr


avatar
Istanbul
Kayıt: 13.07.2006
19.02.2007-14:21 #17126
Uğraştığın için çok teşekkür.
Exit on close u biliyorum. buraya yazmadan önce alakasız satırları sildim kodu kısaltmak için. o haliyle sorun çıkarıyodu zaten.
ya bazen tutuyor 100 kere arka arkaya sorun çıkarmıyor. sonra yine boş açılabiliyor..
rakamı 200 diil de 2000 yaparsak bu çok sık oluyo.

Araştırdım çözdüm sonunda. belki ihtiyacı olanlar olur: tüm herşeyi f_con a ekledikten sonra
((JComponent)f_con).revalidate(); bu sorunu çözüyor. 10.000 nesneyi dahi sorunsuz ekleyebiliyorsunuz.. re paint mantığında bişiy.

thread için de sağol, deniycem bakalım...








Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb