Dynamiczna zmiana rozmiaru JButtonow

0

Czesc wszystkim! Mam problem staram sie napisac dynamiczna i plynna zmiane rozmiaru JButtonow. Moj kod wyglada tak:

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JLabel;

public class PanelRozszerzany extends Thread {
    public void run() {
    	double Wysokosc1=0;
    	double Wysokosc2=1;
    	
    	
    	while(Wysokosc1<1)
    	{
    			
    		try {
				
				Wysokosc1 +=0.1;
				Wysokosc2 -=0.1;
			
				Layout.SrodekDol.revalidate();
				Layout.SrodekDol.repaint();
				Layout.SrodekDol.removeAll();
				Layout.SrodekDol.setLayout(new GridBagLayout());
				
				Layout.gr3.insets = new Insets(0,0,0,0);
				Layout.gr3.fill = GridBagConstraints.BOTH;//ustaw na środku
				Layout.gr3.gridheight = 1;
				Layout.gr3.gridwidth = GridBagConstraints.REMAINDER;//szerokość na max
				
				Layout.gr3.weighty = Wysokosc2;
				Layout.gr3.weightx = 1;
				Layout.SrodekDol.add(new JButton("Cos"),Layout.gr3);
			
				Layout.gr3.insets = new Insets(0,0,0,0);
				Layout.gr3.fill = GridBagConstraints.BOTH;
				Layout.gr3.gridheight = 1;
				Layout.gr3.gridwidth = GridBagConstraints.REMAINDER;//szerokość na max
				
				Layout.gr3.weighty = Wysokosc1;
				Layout.gr3.weightx = 1;
				
			
				
				Layout.SrodekDol.add(new JButton("Animacja"),Layout.gr3);
				Layout.SrodekDol.repaint();
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		
    	
		    	
    	}
    	
    }
}

Jest to tylko wycinek kodu oczywiscie.Uzywam tutaj GridBagLayouta i w jego wlasciwosiach zmieniam weighty od wartosci 0 do 1 w 1 buttonie w drugim odwrotnie. Po odpaleniu tego zauwazylem ze program ma z tym problem i na pewien czas w ogole znikaja przyciski pozniej sie pojawiaja zmienione pozniej znowu znikaja itp itd.... czyli ogolnie nie jest to ani plynne ani fajne. Prosze o pomoc :)

0

zapodaj tego liba :)

0

o jakiego liba Ci chodzi? jezeli chodzi o caly program to jest on zbyt duzy zeby go tu wklejac... z tego co widze jezeli dodam zdarzenie do jakiegos buttona z tym aby przy kazdym kliknieciu zwiekszal jednego buttona a drugiego zmniejszal (nie uzywajac petli) to dziala to dobrze. A jak jest z petla to sie kisi miga znika

0

nie chodziło mi tylko o "Layout" bo na czystym projekcie nie startuje

0

Dobra napisalem na szybko cos podobnego:

import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Test {

 	public static double Wysokosc1;
 	public static double Wysokosc2;
 	public static GridBagConstraints gr3;
 	public static JPanel Srodek;
 	
	public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension dim = tk.getScreenSize();	//pobieramy rozdzielczosc ekranu
        frame.dispose();
    	frame.setResizable(false);
    	frame.setUndecorated(false);
    	frame.setLocation(0, 0);
    	frame.setSize(dim.width,dim.height);
    	addComponentsToPane(frame.getContentPane());
    	frame.setVisible(true);
        
    	
        

	}
	 public static void addComponentsToPane(Container pane) {
		pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
		Srodek = new JPanel();
		pane.add(Srodek);
	 	Srodek.setLayout(new GridBagLayout());
	 	gr3 = new GridBagConstraints();
	 	Wysokosc1=0;
	 	Wysokosc2=1;

        
        Srodek.setDoubleBuffered(true);
        
        
        gr3.insets = new Insets(0,0,0,0);
	 	gr3.fill = GridBagConstraints.BOTH;//ustaw na środku
	 	gr3.gridheight = 1;//wysokość na 1
	 	gr3.gridwidth = GridBagConstraints.REMAINDER;//szerokość na max
	 	gr3.weighty = Wysokosc2;//nie zwiększaj wysokości
	 	gr3.weightx = 1;
	 	JButton t1 = new JButton("Cos");
	 	t1.setDoubleBuffered(true);
		Srodek.add(t1,gr3);
	
	 	//SrodekDol.add(gdzie,gr3);
		gr3.insets = new Insets(0,0,0,0);
	 	gr3.fill = GridBagConstraints.BOTH;//ustaw na środku
	 	gr3.gridheight = 1;//wysokość na 1
	 	gr3.gridwidth = GridBagConstraints.REMAINDER;//szerokość na max
	 	gr3.weighty = Wysokosc1;//nie zwiększaj wysokości
	 	gr3.weightx = 1;
	 	final JButton t2 = new JButton("Animacja");
	 	t2.setDoubleBuffered(true);
		Srodek.add(t2,gr3);
		
		t2.addActionListener(new ActionListener()
		{

			@Override
			public void actionPerformed(ActionEvent arg0) {
				if(arg0.getSource() == t2)
				{
					//uruchamiamy watek
					Watek w1 = new Watek();
					w1.start();
					
					
				}
				
			}
			
			
			
		});
		 
	 
	 }

}



--------------------

import java.awt.GridBagConstraints;
import java.awt.Insets;

import javax.swing.JButton;


public class Watek extends Thread {
    public void run() {
    	
    	int i=0;
    	double Wysokosc1 = 0;
    	double Wysokosc2 = 1;
    	while(Wysokosc1<1)
    	{
    			
    		try {
				
    			//Test.Wysokosc1 +=0.1;
				//Test.Wysokosc2 -=0.1;
    			Wysokosc1 +=0.1;
				Wysokosc2 -=0.1;
			
				
    			
    			Test.Srodek.revalidate();
				Test.Srodek.repaint();
				Test.Srodek.removeAll();
				
				 	Test.gr3.insets = new Insets(0,0,0,0);
				 	Test.gr3.fill = GridBagConstraints.BOTH;//ustaw na środku
				 	Test.gr3.gridheight = 1;
				 	Test.gr3.gridwidth = GridBagConstraints.REMAINDER;//szerokość na max
				 	Test.gr3.weighty = Wysokosc2;
				 	Test.gr3.weightx = 1;
				 	JButton t1 = new JButton("Cos");
				 	t1.setDoubleBuffered(true);
				 	Test.Srodek.add(t1,Test.gr3);
				
				 	//SrodekDol.add(gdzie,gr3);
				 	Test.gr3.insets = new Insets(0,0,0,0);
				 	Test.gr3.fill = GridBagConstraints.BOTH;//ustaw na środku
				 	Test.gr3.gridheight = 1;//wysokość na 1
				 	Test.gr3.gridwidth = GridBagConstraints.REMAINDER;//szerokość na max
				 	Test.gr3.weighty = Wysokosc1;
				 	Test.gr3.weightx = 1;
				 	final JButton t2 = new JButton("Animacja");
				 	t2.setDoubleBuffered(true);
				 	Test.Srodek.add(t2,Test.gr3);
				
				
				Test.Srodek.repaint();
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		
    	
		    	
    	}
    	
    	
    	
    	
    }

}


Zamiast plynnego przejscia to te buttony znikaja i dopiero po chwili cos sie dzieje, ale ogolnie wyglada to beznadziejnie. Co musze w tym poprawic zeby dobrze chodzilo?

0

Dobra chyba juz wiem.... tego pierwszego repainta() oraz revalidate() wyrzucilem no i na sam koniec przed repaintem wrzucilem revalidate() i teraz chodzi plynnie:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1