• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Java-Po wciśnięciu przycisku metoda repaint działa tylko raz

Object Storage Arubacloud
0 głosów
210 wizyt
pytanie zadane 1 grudnia 2018 w Java przez aaron Początkujący (300 p.)
zamknięte 1 grudnia 2018 przez aaron

Witam robię bardzo prosta grę w Javie i mam problem związany z tym że w momencie w którym wciskam przycisk który wywołuje metodę animacje która z kolei kilkukrotnie wywołuje metodę klasy JFrame repaint(); to repaint wykonuje  się tylko raz po zakończeniu działania przycisku. przez co nie mogę osiągnąć oczekiwanego efektu. tego samego kodu używałem w metodzie doDziela() i tam wszystko działało pionki przeskakiwały z jednego pola nr.1 na pole nr.2 itd. A z kolei ta sama metoda(animacje()) wywołana przy użyciu przycisku nie działa. Oto kod całego programu

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

public class KolkaGra
{
	private JFrame ramka;
	private KoloPanel panelKol;
	private KoloPanel []tablicaKol;
	private KolkaGra gra;
	private ArrayList<Gracz> listaGraczy;
	private JButton rzuc;
	private boolean czyLosuj;
	private boolean czyRobic;
	
	public static void main(String[] args)
	{
		KolkaGra gra=new KolkaGra();
		gra.doDziela();
	}
	public void doDziela()
	{
		gra=this;
		ramka=new JFrame();
		ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panelKol=new KoloPanel();
		tablicaKol=new KoloPanel[12];
		listaGraczy=new ArrayList<Gracz>();
		rzuc=new JButton("Rzuc");
		rzuc.addActionListener(new RzucListener());
		
		panelKol.obliczWspolrzedne();
		
		int zwyciestwo,porazka;
		do
		{
			zwyciestwo=(int)(Math.random()*12);
			porazka=(int)(Math.random()*12);
		}
		while(zwyciestwo==porazka);
		
		panelKol.setKolor(10,255,10,zwyciestwo);
		panelKol.setKolor(255,10,10,porazka);
		panelKol.add(rzuc);
		
		KoloPanel przykladoweKolo=new KoloPanel();
		Gracz gracz=new Gracz(255,255,255);
		Gracz komputer=new Gracz(0,0,0);
		komputer.setPoczatkowyX(przykladoweKolo.r-komputer.getR());
		
		listaGraczy.add(gracz);
		listaGraczy.add(komputer);
		
		ramka.getContentPane().add(BorderLayout.CENTER,panelKol);
		ramka.setSize(1000,750);
		ramka.setVisible(true);
	}
	
	class RzucListener implements ActionListener
	{
		public void actionPerformed(ActionEvent zd)
		{
			animacje();
		}
	}
	void animacje()
	{
		for(Gracz obecnyGracz:listaGraczy)
		{
			int poczatek=obecnyGracz.getPozycja();
			int r=(int)(Math.random()*6)+1;
			obecnyGracz.setRzut(r);
			for(int i=obecnyGracz.getPozycja(); i<=r+poczatek;i++)
			{
				if(i==12)
				{
					r-=(i-poczatek);
					i=0;
					poczatek=0;
				}
				obecnyGracz.setPozycja(i);
				
				System.out.println(i);
				ramka.repaint();
				gra.czyLosuj=false;
				try
				{
					Thread.sleep(1000);
				}
				catch(Exception ex)
				{
					ex.printStackTrace();
				}	
			}
		}
	
	}
	
	class KoloPanel extends JPanel
	{
		private int x,y;
		private int r=50;
		private Color kolor=new Color(10,10,255);
		
		public void paintComponent(Graphics g)
		{
			int losowa;
			
			for(KoloPanel k : tablicaKol)
			{
				g.setColor(k.kolor);
				g.fillOval(k.x,k.y,r,r);
			}
		
			//Wyswietlanie pionkow
			for(Gracz gracz:listaGraczy)
			{
				
				System.out.println("Repaint");
				g.setColor(gracz.getKolor());
				g.fillOval(tablicaKol[gracz.getPozycja()].x+gracz.getPoczatkowyX(), tablicaKol[gracz.getPozycja()].y+16, gracz.getR(), gracz.getR());			
			}
			
		}
		
		public void obliczWspolrzedne()
		{
			int x=500,y=50,wspolczynik=60,pomoc=0;
				
			for(int ile=0;ile<12;ile++)
			{
				KoloPanel k=new KoloPanel();			
				if(ile<6)
				{
					if(ile%2!=0)
					{
						x-=(ile*wspolczynik);
						y+=50;
						k.x=x;
						k.y=y;
						pomoc++;
						tablicaKol[12-pomoc]=k;
					}
					else
					{
						
						x+=(ile*wspolczynik);
						k.x=x;
						k.y=y;
						tablicaKol[ile-pomoc]=k;
					}
				}
				else
				{
					if(ile%2!=0)
					{
						x-=((12-ile)*wspolczynik);
						y+=50;
						k.x=x;
						k.y=y;
						pomoc++;
						tablicaKol[12-pomoc]=k;
						
					}
					else
					{
						x+=((12-ile)*wspolczynik);
						k.x=x;
						k.y=y;
						tablicaKol[ile-pomoc]=k;
					}
				}
			}
		}
		
		public void setKolor(int c,int z, int n, int i)
		{
			KoloPanel k=tablicaKol[i];
			k.kolor=new Color(c,z,n);
		}
	}
	class EastPanel extends JPanel
	{
		
	}
}

class Gracz
{
	private int pozycja;
	private int poczatkowyX;
	private int r=25;
	private Color kolor;
	private int rzut;
	
	public Gracz(int c,int z,int n)
	{
		this.kolor=new Color(c,z,n);
	}
	public int getR()
	{
		return r;
	}
	public int getPozycja()
	{
		return pozycja;
	}
	public int getPoczatkowyX()
	{
		return poczatkowyX;
	}
	public int getRzut()
	{
		return rzut;
	}
	public Color getKolor()
	{
		return kolor;
	}
	public void setPoczatkowyX(int p)
	{
		poczatkowyX=p;
	}
	public void setPozycja(int p)
	{
		pozycja=p;
	}
	public void setRzut(int r)
	{
		rzut=r;
	}
}


 

komentarz zamknięcia: znalazłem rozwiązanie sam
komentarz 1 grudnia 2018 przez aaron Początkujący (300 p.)
Dobra poradziłem sobie trzeba było utworzyć nowy wątek

Podobne pytania

0 głosów
1 odpowiedź 128 wizyt
pytanie zadane 2 maja 2019 w C i C++ przez linq Początkujący (420 p.)
0 głosów
0 odpowiedzi 271 wizyt
+1 głos
1 odpowiedź 303 wizyt

92,624 zapytań

141,482 odpowiedzi

319,823 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...