Program to okno aplikacji w którym podane są pola które zależnie od prawdopodobieństwa zmieniają swój kolor w jakiś sposób. Nie wiem dlaczego niektóre piksele umierają. Można to sprawdzić przy podanym prawdopodobieństwie równym 0, oraz o to dlaczego tak dziwnie się one zmieniają, gdy brana jest średnia kolorów sąsiadów. Pewnie chodzi tutaj o synchronizacje. Nie potrafię poradzić sobie z tym problemem.
import java.awt.*;
import java.util.*;
import javax.swing.*;
/**
*
* Glowna klasa tworzaca watki
*
*/
public class Plansza extends JPanel {
/**
* Generator liczb losowych
*/
Random generator = new Random();
/**
* obiekty watkow
*/
pole pola[][];
/**
* Pamiec liczby wierszy i kolumn
*/
int maxx,maxy;
/**
*
* Klasa watkow
*
*/
public class pole extends Thread{
/**
* obiekt okienka
*/
JLabel figura;
/** obiekt panelu to ktorego dodwane sa okna*/
JPanel panel;
/** czas zmieniania sie koloru okna*/
int czas;
/** prwdopodobienstwo zmiany koloru*/
double prawdo;
/** zmienna sluzaca do synchronizacji*/
boolean running;
/** zmienne zapisujace polozenie okienka w panelu */
int m, n, k;
/**
* Konstruktor pola
* @param x zmienna panelu do ktorego sie odwoluje
* @param k zmienna czasu zmiany koloru
* @param p prawdopodobienstwo zmiany koloru
* @param m wiersz w ktorym znajduje sie okno
* @param n kolumna w ktorej znajduje sie okno
*/
pole(JPanel x,int k, double p,int m,int n){
this.m=m;
this.n=n;
this.k=k;
panel=x;
figura = new JLabel();
figura.setOpaque(true);
figura.setBackground(new Color(generator.nextInt(255),generator.nextInt(255),generator.nextInt(255)));
panel.add(figura);
czas = ((int)(((generator.nextDouble()+0.5)*1000))*k);
prawdo=p;
running = true;
}
/**
* funckcja uruchamiajaca watki
*/
public void run(){
while(running){
if(generator.nextDouble()<=prawdo){
figura.setBackground(new Color(generator.nextInt(255),generator.nextInt(255),generator.nextInt(255)));
}else {
Color a,b,c,d;
int p1,p2,p3,p4;
if(n<maxx-1) p1=n+1;
else p1=0;
if(n!=0) p2=n-1;
else p2=maxx-1;
if(m<maxy-1) p3=m+1;
else p3=0;
if(m!=0) p4=m-1;
else p4=maxy-1;
pola[m][p1].running=false;
pola[m][p2].running=false;
pola[p3][n].running=false;
pola[p4][n].running=false;
a=pola[m][p1].figura.getBackground();
b=pola[m][p2].figura.getBackground();
c=pola[p3][n].figura.getBackground();
d=pola[p4][n].figura.getBackground();
figura.setBackground(new Color((a.getRed()+b.getRed()+c.getRed()+d.getRed())/4,(a.getBlue()+b.getBlue()+c.getBlue()+d.getBlue())/4,(a.getGreen()+b.getGreen()+c.getGreen()+d.getGreen())/4));
pola[m][p1].running=true;
pola[m][p2].running=true;
pola[p3][n].running=true;
pola[p4][n].running=true;
}
try {
sleep(pola[m][n].czas);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
czas = ((int)(((generator.nextDouble()+0.5)*1000))*k);
}
}
}
/**
* konstruktor planszy tworzaca okna
* @param m liczba wierszy
* @param n liczba kolumn
* @param k czas zmiany
* @param p prawdopodobienstwo zmiany koloru
*/
Plansza(int m,int n, int k,double p){
this.maxy=m;
this.maxx=n;
setLayout(new GridLayout(m,n));
pola = new pole[m][n];
for (int i=0;i<m;++i){
for(int j=0;j<n;++j){
pola[i][j]=new pole(this,k,p,i,j);
}
}
for (int i=0;i<m;++i)
for(int j=0;j<n;++j)
pola[i][j].start();
}
}
/**
* @author kamaz08
* @version 1.1
* @since 2015-06-01
*/
import java.awt.*;
import java.util.*;
import javax.swing.*;
/**
* Klasa uruchamiajaca aplikacje i pobierajaca argumenty
*
*
*/
public class ProgramGUI extends JApplet {
/** Obiekt planszy */
Plansza x;
/** Obiekt okna */
JFrame rama;
/**
* Funkcja uruchamiajaca aplikacje
* @param m liczba wierszy
* @param n liczba kolumn
* @param k czas zmiany
* @param p prawdopodobienstwo wybrania koloru
*/
public ProgramGUI(int m, int n, int k, double p){
rama=new JFrame("kamaz08");
rama.setSize(500,500);
rama.setVisible(true);
rama.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
rama.setLocationRelativeTo(null); //tworzy okno na srodku ekranu
x = new Plansza(m,n,k,p);
rama.add(x);
}
/**
* Funkcja startowa aplikacji pobierajaca parametry
* @param args argumenty uruchomienia
*/
public static void main(String args[]){
int n,m,k;
double p;
if(args[0]==null) m=10;
else m=Integer.parseInt(args[0]); //liczba wierszy
if(args[1]==null) n=10;
else n=Integer.parseInt(args[1]); //liczba kolumn
if(args[2]==null) k=10;
else k=Integer.parseInt(args[2]);
if(args[3]==null) p=0.8;
else p=Double.parseDouble(args[3]);
ProgramGUI okno = new ProgramGUI(m,n,k,p);
}
}
niezdecydowany