ďťż
 
czemu mryga? ďťż
 
czemu mryga?
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

czemu mryga?



Paweł Król - 21-12-2005 12:20
czemu mryga?
  Witam,
Przeszukałem na goglach archiwum i nie znalazłem precyzyjnej odpowiedzi.
Problem wygląda tak:

Mam dość prosty, acz rozbudowany aplet w Javie. We viewerze wygląda ok,
Eclipse nie pisze o żadnych błędach, a jednak po uruchomieniu tego na
stronie www mryga i nie bardzo to wygląda.

Czytałem że można poradzić sobie dzięki podwójnemu buforowaniu, jednak czy
są jakieś prostsze metody? (Skoro rysowanie kreski nie daje efektu mrygania,
to czemu wykonywanie funkcji rysującej 10000 kresek ma to powodować?)

Ktoś pomoże początkującemu?





Zbyszek Malec - 21-12-2005 12:20

  Paweł Król wrote (tak! stara dobra wrotka!):

> (Skoro rysowanie kreski nie daje efektu mrygania,
> to czemu wykonywanie funkcji rysującej 10000 kresek ma to powodować?)

Bo możesz zdążyć z namalowaniem kreski między kolejnymi odświerzeniami.
Podwójne buforowanie (w najprostszej postaci) jest bardzo proste do
zaimplementowania. Dla najwyższego komponenu w hierarchi zawierania ustaw
setDoubleBuffered(true). Tyle że lekko wzrośnie ci zużycie pamięci, ale z
tego pewnie zdajesz sobie sprawę.
Są oczywiście inne sposoby unikania mrygania, ale trochę trudniejsze w
implementacji.

--
Zbigniew Malec Ustronie:104 gg:2756100




a1 - 21-12-2005 12:20

  Paweł Król wrote:

> Czytałem że można poradzić sobie dzięki podwójnemu buforowaniu, jednak czy
> są jakieś prostsze metody?
Doublebuffering to naprawde niezbyt skomplikowana metoda, sprowadza sie
do tego ze tworzysz sobie obiekt Image o rozmiarach komponentu i
rysujesz na nim... mniej wiecej cos w te klocki:

// gdzies wczesniej np. w startApplet albo cos robisz cos takiego:
Image backBufferImg = createImage(getWidth(), getHeight());
Graphics backBufferGraphics = backBufferImage.getGraphics();

// metoda paint
void paint(Graphics g) {
// tutaj twoj paint, ale wszedzie zamiast g uzywasz backBufferGraphics
g.drawImage(backBufferImg, 0, 0, null);
}

(Skoro rysowanie kreski nie daje efektu mrygania,
> to czemu wykonywanie funkcji rysującej 10000 kresek ma to powodować?)

Bo jezeli cale 10000 lini ma byc narysowane "za jednym zamachem" to nie
"wyrobisz sie" z tym pomiedzy kolejnymi odswiezeniami ekranu co w
efkecie daje rysowanie po kawalku (a jeszcze od tego przewaznie dochodzi
czyszczenie tla i juz jest calkiem dyskoteka), przy zastosowaniu
dbbuffer, bezposrednio na ekranie rysujesz tylko raz (bitmape ktora
uzywasz jako backbuffera).

--

a1 (Bartek Janusz) mailto: arcone1 [at] invalid.gmail [dot] com




Paweł Król - 21-12-2005 12:20

  Hm, no tak, Pomysł jest ok. Ale pojawiają się błędy w console i nie wiem jak
sobie z nimi poradzić :( Głównie to NullPointerException i kolejne
at,at,at....

Użytkownik "a1" <arcone1@gmail.com> napisał w wiadomości
news:dnnccg$pja$1@inews.gazeta.pl...
> Paweł Król wrote:
>
> > Czytałem że można poradzić sobie dzięki podwójnemu buforowaniu, jednak
czy
> > są jakieś prostsze metody?
> Doublebuffering to naprawde niezbyt skomplikowana metoda, sprowadza sie
> do tego ze tworzysz sobie obiekt Image o rozmiarach komponentu i
> rysujesz na nim... mniej wiecej cos w te klocki:
>
> // gdzies wczesniej np. w startApplet albo cos robisz cos takiego:
> Image backBufferImg = createImage(getWidth(), getHeight());
> Graphics backBufferGraphics = backBufferImage.getGraphics();
>
> // metoda paint
> void paint(Graphics g) {
> // tutaj twoj paint, ale wszedzie zamiast g uzywasz backBufferGraphics
> g.drawImage(backBufferImg, 0, 0, null);
> }
>
> (Skoro rysowanie kreski nie daje efektu mrygania,
> > to czemu wykonywanie funkcji rysującej 10000 kresek ma to powodować?)
>
> Bo jezeli cale 10000 lini ma byc narysowane "za jednym zamachem" to nie
> "wyrobisz sie" z tym pomiedzy kolejnymi odswiezeniami ekranu co w
> efkecie daje rysowanie po kawalku (a jeszcze od tego przewaznie dochodzi
> czyszczenie tla i juz jest calkiem dyskoteka), przy zastosowaniu
> dbbuffer, bezposrednio na ekranie rysujesz tylko raz (bitmape ktora
> uzywasz jako backbuffera).
>
> --
>
> a1 (Bartek Janusz) mailto: arcone1 [at] invalid.gmail [dot] com





a1 - 21-12-2005 12:20

  Paweł Król wrote:
> Hm, no tak, Pomysł jest ok. Ale pojawiają się błędy w console i nie wiem jak
> sobie z nimi poradzić :( Głównie to NullPointerException i kolejne
> at,at,at....

Ech, ale to nie byl kod do wklejenia, ja to pisalem z pamieci :) sprawdz
createImage bo jak dobrze pamietam jezeli komponent nie jest displayable
to zwroci ci null'a, a nie pamietam czy w momencie wywolania metody
start() applet juz musi byc zresizowany i wstawiony do okna przegladarki
(wydaje mi sie ze tak ale glowy sobie nie dam uciac).

--

a1 (Bartek Janusz) mailto: arcone1 [at] invalid.gmail [dot] com




Paweł Król - 21-12-2005 12:20

  Ale bełkotliwa ta nomenklatura :) Umieściłem i Image i Graphics w paint(),
bo inaczej były kłopoty z wyjątkami. W javaviewerze działa.. To znaczy
wcześniej rysowałem wykeres z opóźnieniem - Thread.sleep() a tereaz, mimo że
to zostało, wyrzuca mi dopiero po chwili gotowy obraz.
Ale w przeglądarce IE nic to nie zmieniło :(
No i nie do końca rozumiem jaki związek ma bycie displayable z koniecznością
bycia zresizowanym itd.. ? W szkole uczą mnie tylko jak wypisać Stringa,
albo kreske..

Użytkownik "a1" <arcone1@gmail.com> napisał w wiadomości
news:dnne2v$4lm$1@inews.gazeta.pl...
> Paweł Król wrote:
> > Hm, no tak, Pomysł jest ok. Ale pojawiają się błędy w console i nie wiem
jak
> > sobie z nimi poradzić :( Głównie to NullPointerException i kolejne
> > at,at,at....
>
> Ech, ale to nie byl kod do wklejenia, ja to pisalem z pamieci :) sprawdz
> createImage bo jak dobrze pamietam jezeli komponent nie jest displayable
> to zwroci ci null'a, a nie pamietam czy w momencie wywolania metody
> start() applet juz musi byc zresizowany i wstawiony do okna przegladarki
> (wydaje mi sie ze tak ale glowy sobie nie dam uciac).
>
> --
>
> a1 (Bartek Janusz) mailto: arcone1 [at] invalid.gmail [dot] com




a1 - 21-12-2005 12:20

  Paweł Król wrote:
> Ale bełkotliwa ta nomenklatura :) Umieściłem i Image i Graphics w paint(),
> bo inaczej były kłopoty z wyjątkami.
To nie jest najszczesliwsze rozwiazanie bo wtedy przy kazdym wolaniu
metody paint tworzysz nowy obiekt Image i Graphics co troch trwa...

W javaviewerze działa.. To znaczy
> wcześniej rysowałem wykeres z opóźnieniem - Thread.sleep() a tereaz, mimo że
> to zostało, wyrzuca mi dopiero po chwili gotowy obraz.
> Ale w przeglądarce IE nic to nie zmieniło :(
Byc nie moze :> Bez kodu wiecej nic Ci nie poradze bo trudno na "czuja"
powiedziec gdzie tkwi blad.

> No i nie do końca rozumiem jaki związek ma bycie displayable z koniecznością
> bycia zresizowanym itd.. ?
Troche skrot myslowy zastosowalem trudaj bycie displayable nie ma nic
wspolnego z tym ze komponent jest zresizowany, ale chodzilo mi o to ze
createImage zwraca null gdy obiekt jest nie jest displayable, a pozatym
poniewaz tworzysz image o rozmiarach komponentu (getWidth() /
getHeight()) to dobrze by bylo zeby podczas tworzenia tego image
komponent mial wlasciwie rozmiary. Wlasciwie moglbys podpiac sobie
ComponentListener'a do appletu i tworzyc Image przy obludze eventu
componentResized).

--

a1 (Bartek Janusz) mailto: arcone1 [at] invalid.gmail [dot] com




Paweł Król - 21-12-2005 12:20

  Zatem pochwalę się moim nieprofesjonalnym programem publicznie, może komuś
się uda znaleźć tą potrzebną zmianę, żeby przestało mrugać a działało.
Oto i kod:

package pl.num;

import java.awt.*;
import java.applet.*;

public class Funkcja extends Applet {

boolean w,b,i,s,n,m,o;
public float skala(float a1, float b1, float c1, float d1, float x)
{
return c1+(x-a1)*(d1-c1)/(b1-a1);
}
Panel p1;
Font f,f1,f2;
TextField t1,t2,t3;

public void init()
{
f2=new Font("Comic Sans MS",Font.BOLD,14);
f1=new Font("Comic Sans MS",Font.ITALIC,12);
f=new Font("Comic Sans MS",Font.BOLD,18);
this.setLayout(new FlowLayout(FlowLayout.LEFT));
p1=new Panel();
p1.setBackground(Color.getHSBColor(0.1f,0.4f,1f));

p1.setLayout(new GridLayout(10,1,10,10));
Button c1=new Button("BISEKCJA");
c1.setBackground(Color.getHSBColor(0.1f,0.4f,1f));
p1.add(c1);

Button c2=new Button("SIECZNE");
c2.setBackground(Color.getHSBColor(0.1f,0.4f,1f));
p1.add(c2);

Button c3=new Button("NEWTONA (STYCZNE)");
c3.setBackground(Color.getHSBColor(0.1f,0.4f,1f));
p1.add(c3);

Button c4=new Button("ITERACJA");
c4.setBackground(Color.getHSBColor(0.1f,0.4f,1f));
p1.add(c4);

Button c5=new Button("WYKRES");
c5.setBackground(Color.getHSBColor(0.1f,0.4f,1f));
p1.add(c5);

Button c6=new Button("BEZ WYKRESU");
c6.setBackground(Color.getHSBColor(0.1f,0.4f,1f));
p1.add(c6);

Button c7=new Button("PSIKUS!");
c7.setBackground(Color.getHSBColor(0.1f,0.4f,1f));
p1.add(c7);

t1= new TextField("Dolna granica",8);
t2= new TextField("Górna granica",8);
t3= new TextField("Przybl.(z kropką!!)",8);
p1.add(t1);
p1.add(t2);
p1.add(t3);

add(p1);
//p1.validate();
}

public void Psikus (Graphics v22,boolean o1)
{
if (o1==true)
{ double a=1;

while (a<3000)
{
v22.setColor(Color.getHSBColor(0.7f,0.7f,(float)(a/3)));
try
{
Thread.sleep(20);
int r=(int)(a/10);//(int)a;
for (int q=0;q<=r;q++)
{int k=(int)Math.sqrt(r*r-q*q);
int l=(int)Math.sqrt(r*r-(q+1)*(q+1));
v22.drawLine(500+q,350+k,500+(q+1),350+l);
v22.drawLine(500-q,350-k,500-(q+1),350-l);
v22.drawLine(500+q,350-k,500+(q+1),350-l);
v22.drawLine(500-q,350+k,500-(q+1),350+l);
}
}
catch (InterruptedException e) {}
a=a+5;
}
}
}

public void Wykres(Graphics w,boolean w1)
{
if (w1==true)
{
int u1=Integer.parseInt(t1.getText());
int u2=Integer.parseInt(t2.getText());
int x2,y1,y2;
int uz=(int)skala(-15,15,250,850,u1);
int uz2=(int)skala(-15,15,250,850,u2);
for (int x1=uz;x1<uz2;x1++)
{x2=x1+1;
float xi=skala(250,850,-15,15,x1);
float xj=skala(250,850,-15,15,x2);
float yi=xi*xi*xi-3*xi-20;
float yj=xj*xj*xj-3*xj-20;
y1=Math.round(skala(-80,80,425,25,yi));
y2=Math.round(skala(-80,80,425,25,yj));
w.setColor(Color.getHSBColor(1f,0.85f,0.9f));
/* try
{*/
w.drawLine(x1,y1,x2,y2);
/*Thread.sleep(10);
}
catch (InterruptedException e) {}*/
w.setColor(Color.black);
} } }

public double Licz(double l){
return (l*l*l-3*l-20);}

public void Bisekcja(Graphics v,boolean b1)
{
if (b1==true)
{
int l1=0;
double prec=Double.parseDouble(t3.getText());
double d=Integer.parseInt(t1.getText());
double g=Integer.parseInt(t2.getText());

while(Math.abs(g-d)>prec)
{
if ((Licz(d)*Licz(g))<0)
{
if ((Licz(d+(g-d)/2)*Licz(g)<0)&&((g-d)*(g-d)>(1/1000)))
{d=d+(g-d)/2;}
else if (Licz(d+(g-d)/2)*Licz(g)>0&&(((g-d)*(g-d)>(1/1000))))
{g=d+(g-d)/2;}
}
else
{v.drawString("W podanym przedziale nie ma ",300,300);
v.drawString("pierwiastków, lub coś jest źle",300,320);break;}

v.setFont(f2);
v.drawString("Krok",180,260);
v.drawString("I-sze przyb. pierw.",215,260);
v.drawString("II-gie przyb. pierw.",355,260);
v.drawString("Przyblizony pierw.",660,260);
v.setFont(f1);
v.drawString(""+(g+Math.abs(g-d)/2),660,280+(10*l1));
v.drawString(""+(l1+1),192,280+(10*l1));

v.drawString(""+g,215,280+(10*l1));
v.drawString(""+d,355,280+(10*l1));
l1++;}
v.drawString("W kroku "+l1+" uzyskano przybliżenie",800,450);
v.drawString("wynoszące "+(g+Math.abs(g-d)/2),800,465);
v.drawString("Metoda Bisekcji rekurencyjnie wywołuje funkcję, która
po",675,30);
v.drawString("sprawdzeniu czy zadany przez użytkownika przedział
zawiera",675,50);
v.drawString("pierwiastek dzieli go na połowy i za nowy przedział
obiera",675,70);
v.drawString("ten z dwóch otrzymanych, który nadal zawiera
pierwiastek.",675,90);
v.drawString("Działanie kończy się wraz z uzyskaniem żądanego
przybliżenia.",675,110);
}
}

public void Sieczne (Graphics v2,boolean b3)
{if (b3==true)
{
int l1=0;
double prec=Double.parseDouble(t3.getText());
double d2=Integer.parseInt(t1.getText());
double g2=Integer.parseInt(t2.getText());

while(Math.abs(g2-d2)>prec)
{
if (((Licz(d2)*Licz(g2))!=0)&&(Licz(d2)-Licz(g2)!=0))
{double p=g2;
g2=d2-Licz(d2)*((d2-g2)/(Licz(d2)-Licz(g2)));
d2=p;
}
else
{v2.drawString("W podanym przedziale nie ma ",300,300);
v2.drawString("pierwiastków, lub własnie go podałeś
:)",300,320);break;}
v2.setFont(f2);
v2.drawString("Krok",180,260);
v2.drawString("I-sze przyb. pierw.",215,260);
v2.drawString("II-gie przyb. pierw.",355,260);
v2.drawString("Przyblizony pierw.",660,260);
v2.setFont(f1);
v2.drawString(""+(g2+(Math.abs(g2-d2)/2)),660,280+(10*l1));
v2.drawString(""+(l1+1),192,280+(10*l1));

v2.drawString(""+g2,215,280+(10*l1));
v2.drawString(""+d2,355,280+(10*l1));
l1++;}
v2.drawString("W kroku "+l1+" uzyskano przybliżenie",800,450);
v2.drawString("wynoszące "+(g2+Math.abs(g2-d2)/2),800,465);
v2.drawString("Metoda Siecznych polega na znalezieniu miejsca
zerowego",675,30);
v2.drawString("siecznej wyznaczanej przez dwa zadane (różne) punkty
",675,50);
v2.drawString("(i ich wartości) oraz przyjęciu znalezionego pierwiastka
",675,70);
v2.drawString("jako nowe, lepsze przybliżenie a następnie powtórzeniu
",675,90);
v2.drawString("operacji dla tego punktu i jednego z poprzednich aż do
",675,110);
v2.drawString("uzyskania żądanej dokładności.",675,130);
}
}

public void Newton (Graphics v3,boolean b4)
{if (b4==true)
{

int l1=0;
double prec=Double.parseDouble(t3.getText());
double d3=Integer.parseInt(t1.getText());
double dp=d3+10;

while(Math.abs(dp-d3)>prec)
{
if ((3*d3*d3-3)!=0)
{
dp=d3;
double b=Licz(d3)-(3*d3*d3-3)*d3;
d3=-(b/(3*d3*d3-3));
v3.setFont(f2);
v3.setColor(Color.black);
v3.drawString("Krok",180,280);
v3.drawString("Przyblizony pierw.",230,280);
v3.setFont(f1);
v3.drawString(""+d3,230,300+(10*l1));
v3.drawString(""+(l1+1),192,300+(10*l1));
l1++;}
else
d3=d3+1;}
v3.drawString("W kroku "+l1+" uzyskano przybliżenie wynoszące
"+d3,635,450);
v3.drawString("Metoda Stycznych (lub Newtona) polega na
obliczeniu",675,30);
v3.drawString("przybliżenia poprzez znalezienie miejsca zerowego
",675,50);
v3.drawString("prostej stycznej do wykresu w punkcie podanym na
początku,",675,70);
v3.drawString("przyjęcie wyliczonego punktu za
nowe,dokładniejsze",675,90);
v3.drawString("przybliżenie i powtórzeniu operacji na nowo obranym
punkcie",675,110);
v3.drawString("aż do uzyskania żądanej dokładności.",675,130);
}}

public void Iteracja (Graphics v4,boolean b5)
{if(b5==true)
{
double d4=Integer.parseInt(t1.getText());
double prec=Double.parseDouble(t3.getText());
double dp=d4+10;
int l1=0;

while(Math.abs(dp-d4)>prec)
{
if ((d4!=0)&&((20/d4)>(-3)))
{
dp=d4;
d4=Math.sqrt(3+(20/d4));
v4.setFont(f2);
v4.setColor(Color.black);
v4.drawString("Krok",180,280);
v4.drawString("Przyblizony pierw.",230,280);
v4.setFont(f1);
v4.drawString(""+d4,230,300+(10*l1));
v4.drawString(""+(l1+1),192,300+(10*l1));
l1++;}
else
d4=d4+1;}
v4.drawString("W kroku "+l1+" uzyskano przybliżenie wynoszące
"+d4,635,450);
v4.drawString("Metoda Iteracji stosuje zbieżną funkcję zadaną
przez",675,30);
v4.drawString("programistę, dla której obliczona wartość od
początkowej",675,50);
v4.drawString("argumentu staje się argumentem i liczona jest
nowa",675,70);
v4.drawString("wartość, będąca lepszym przybliżeniem szukanego
pierw.",675,90);
}}

Image backBufferImg = createImage(getWidth(), getHeight());
Graphics bBG = backBufferImg.getGraphics();

public void paint(Graphics g )
{super.setSize(1050,675);

setBackground(Color.getHSBColor(0.1f,0.4f,1f));

bBG.setFont(f);
bBG.drawString("Oto program Pawła Króla kl. IIId",180,30);
bBG.drawString("Do obliczania miejsc zerowych",180,50);
bBG.drawString("funkcji metodami numerycznymi",180,70);
bBG.setFont(f1);
bBG.drawString("Wybierz jedną z metod po lewej",195,90);
bBG.drawString("Opcja 'WYKRES' rysuje funkcję",195,105);

bBG.setColor(Color.getHSBColor(0.66666f, 0.5f, 1f));
bBG.drawLine(550,10,550,430);
bBG.drawLine(250,225,860,225);

int h=0;
while ((h/20)<31) // xowa co 1
{
bBG.drawLine(250+h,220,250+h,230);
bBG.drawString(""+((h/20)-15),245+h,218);
h=h+20;
}

int h1=0;
while ((h1/20)<21) //yowa co 8
{
bBG.drawLine(545,25+h1,555,25+h1);
bBG.drawString(""+((h1/20*8)-80),560,428-h1);
h1=h1+20;
}
bBG.setColor(Color.black);

Wykres(bBG,w);
Bisekcja(bBG,b);
Sieczne(bBG,s);
Newton(bBG,n);
Iteracja(bBG,i);
Psikus(bBG,o);
w=false;
o=false;
g.drawImage(backBufferImg, 0, 0, null);
}

public boolean action(Event e, Object arg)
{
if (e.target instanceof Button)
{
if (((Button) e.target).getLabel()=="WYKRES")
{
w=true;
repaint();

};

if (((Button) e.target).getLabel()=="BEZ WYKRESU")
{
w=false;
repaint();
};

if (((Button) e.target).getLabel()=="BISEKCJA")
{
b=true;s=false;n=false;i=false;o=false;
repaint();
};

if (((Button) e.target).getLabel()=="SIECZNE")
{
b=false;s=true;n=false;i=false;o=false;
repaint();
};

if (((Button) e.target).getLabel()=="NEWTONA (STYCZNE)")
{
b=false;s=false;n=true;i=false;o=false;
repaint();
};

if (((Button) e.target).getLabel()=="ITERACJA")
{
b=false;s=false;n=false;i=true;o=false;
repaint();
};

if (((Button) e.target).getLabel()=="PSIKUS!")
{
b=false;s=false;n=false;i=false;o=true;
repaint();
};

}
return false;
}
}

Użytkownik "a1" <arcone1@gmail.com> napisał w wiadomości
news:dnnfm5$cmv$1@inews.gazeta.pl...
> Paweł Król wrote:
> > Ale bełkotliwa ta nomenklatura :) Umieściłem i Image i Graphics w
paint(),
> > bo inaczej były kłopoty z wyjątkami.
> To nie jest najszczesliwsze rozwiazanie bo wtedy przy kazdym wolaniu
> metody paint tworzysz nowy obiekt Image i Graphics co troch trwa...
>
> W javaviewerze działa.. To znaczy
> > wcześniej rysowałem wykeres z opóźnieniem - Thread.sleep() a tereaz,
mimo że
> > to zostało, wyrzuca mi dopiero po chwili gotowy obraz.
> > Ale w przeglądarce IE nic to nie zmieniło :(
> Byc nie moze :> Bez kodu wiecej nic Ci nie poradze bo trudno na "czuja"
> powiedziec gdzie tkwi blad.
>
> > No i nie do końca rozumiem jaki związek ma bycie displayable z
koniecznością
> > bycia zresizowanym itd.. ?
> Troche skrot myslowy zastosowalem trudaj bycie displayable nie ma nic
> wspolnego z tym ze komponent jest zresizowany, ale chodzilo mi o to ze
> createImage zwraca null gdy obiekt jest nie jest displayable, a pozatym
> poniewaz tworzysz image o rozmiarach komponentu (getWidth() /
> getHeight()) to dobrze by bylo zeby podczas tworzenia tego image
> komponent mial wlasciwie rozmiary. Wlasciwie moglbys podpiac sobie
> ComponentListener'a do appletu i tworzyc Image przy obludze eventu
> componentResized).
>
> --
>
> a1 (Bartek Janusz) mailto: arcone1 [at] invalid.gmail [dot] com




Piotr Nabielec - 21-12-2005 12:20

  Hej,

Jak ja bym radził:

1. Wstaw do swojej klasy apletu dwa nowe pola:

protected Graphics bufferGraphics;
protected Image offscreen;

2. Przenieś wszystko co masz w paint do jakiejś innej metody, która też
bierze Graphics (zwykłe copy&paste albo zmiana nazwy) - ja to nazwę
paintComponent(Graphics g)

3. W paint() apletu zrób tylko

public void paint(Graphics g) {
if (bufferGraphics == null) {
offscreen = createImage(getWidth(), getHeight());
bufferGraphics = offscreen.getGraphics();
}

paintComponent(bufferGraphics);
g.drawImage(offscreen, 0, 0, null);
}

4. BARDZO WAŻNE: Przeciąż update()
public void update(Graphics g) {
paint(g);
}

Możesz zrobić stukrotne buforowanie i bez 4. kroku i tak będzie mrugać -
update standardowo czyści tło i dopiero woła paint. Jak go przeciążysz
tak jak tu podane to powinno zadziałać.

Ja tak sobie z tym radziłem.
Anyway jest sporo takich tutoriali na sieci mniej lub bardziej
intuicyjnych, ale ja walczyłem z tym trzy dni, ale za to znam prawie
wszystkie dostępne techniki :>

Poza tematem jak mogę parę rad do kodu:
1. bez linijki komentarza nawet nie chce się tego czytać :/
1.5 nazwy zmiennych nic nie mówią

2. masz sporo takich rzeczy w stylu :
while (a<3000) {
a = a + 5;

więc po pierwsze użyj a += 5; bo po to jest, a po drugie od takich
konstrukcji jest pętla for (dużo czytelniejsza niż błądzenie wzrokiem co
się dzieje ze zmienną a).

3. nie wiem czy się ze mną zgodzisz, ale tworzenie tych ośmiu buttonów
można elegancko zrobić w jednym forze korzystając jedynie z tablicy
stringów:
String[] nazwy = { "BISEKCJA", ... };
for (int index = 0; index < nazwy.length; index++) {
Button metoda = new Button(nazwy[index]);
metoda.setBackground(Color.getHSBColor(0.1f,0.4f,1 f));
p1.add(metoda);
}
I czytelniejsze toto i dużo łatwiej dodać następnego (chyba, że zrobiłeś
to w designerze w stylu VE).

4. Eh no sporo tego... catch (InterruptedException e) {}
nieładne to jest wszystko i tyle...

nawet jak to tylko na szybkie zaliczenie polecam poświęcić ze dwa-trzy
dni i przeczytać jakiś dobry poradnik, naprawdę zwróci się niesamowicie.

Poza tym bez nawet szczątkowych komentarzy i z tak nazwanymi zmiennymi
to się tego po prostu nawet nie chce czytać, bo Sherlock Holmes nie
jestem... - jak będziesz w przyszłości potrzebował pomocy to weź to
silnie pod uwagę.

Pozdrawiam i powodzenia

Piotrek




Paweł Król - 21-12-2005 12:20

  Cóż.. Program nie był pisany z myślą o publicznym udostępnianiu, a potem na
zmiany było za późno :) Wiem, że ciężko w tym coś odnaleźć.. Tak samo jak
świetnie rozumiem że niektóre operacje są troche bez sensu. Niemniej jednak
nie ma nikogo, kto mógłby zweryfikować tą poprawność, więc jest.. jak
widać..

Tak czy siak polecone sposoby, choć rozumiem o co chodzi i starałem się to
dostosować nie dają rezultatu :( To znaczy prawdopodbnie wina leży po mojej
stronie, bo nie umiem tego tak zrobić, żeby chciało działać.
Jeśli dobrze rozumiem, to cały mechanizm z buforowaniem działać ma tak:
1.Wszystkie operacje, które mają za zadanie się wykonać, mają zostać
zapisane przez jakąś metodę w stworzonym dla nich buforze
2.To coś ma stac się źródłem dla tworzonego obrazu (createImage)
3.Ów obraz już za pomocą zwykłego painta ma zostać wyświetlony

Czy tak?

I jeszcze pytanie, czy umieszczanie w programie repaintów, poprawiających
wyświetlane dane zależnie od wciśniętych buttonów nie psuje całego pomysłu?

Pozdrawiam,
Paweł

Użytkownik "Piotr Nabielec" <eloy@tlen.pl> napisał w wiadomości
news:dnniod$8fh$1@polsl.pl...
> Hej,
>
> Jak ja bym radził:
>
> 1. Wstaw do swojej klasy apletu dwa nowe pola:
>
> protected Graphics bufferGraphics;
> protected Image offscreen;
>
> 2. Przenieś wszystko co masz w paint do jakiejś innej metody, która też
> bierze Graphics (zwykłe copy&paste albo zmiana nazwy) - ja to nazwę
> paintComponent(Graphics g)
>
> 3. W paint() apletu zrób tylko
>
> public void paint(Graphics g) {
> if (bufferGraphics == null) {
> offscreen = createImage(getWidth(), getHeight());
> bufferGraphics = offscreen.getGraphics();
> }
>
> paintComponent(bufferGraphics);
> g.drawImage(offscreen, 0, 0, null);
> }
>
> 4. BARDZO WAŻNE: Przeciąż update()
> public void update(Graphics g) {
> paint(g);
> }
>
> Możesz zrobić stukrotne buforowanie i bez 4. kroku i tak będzie mrugać -
> update standardowo czyści tło i dopiero woła paint. Jak go przeciążysz
> tak jak tu podane to powinno zadziałać.
>
> Ja tak sobie z tym radziłem.
> Anyway jest sporo takich tutoriali na sieci mniej lub bardziej
> intuicyjnych, ale ja walczyłem z tym trzy dni, ale za to znam prawie
> wszystkie dostępne techniki :>
>
>
> Poza tematem jak mogę parę rad do kodu:
> 1. bez linijki komentarza nawet nie chce się tego czytać :/
> 1.5 nazwy zmiennych nic nie mówią
>
> 2. masz sporo takich rzeczy w stylu :
> while (a<3000) {
> a = a + 5;
>
> więc po pierwsze użyj a += 5; bo po to jest, a po drugie od takich
> konstrukcji jest pętla for (dużo czytelniejsza niż błądzenie wzrokiem co
> się dzieje ze zmienną a).
>
> 3. nie wiem czy się ze mną zgodzisz, ale tworzenie tych ośmiu buttonów
> można elegancko zrobić w jednym forze korzystając jedynie z tablicy
> stringów:
> String[] nazwy = { "BISEKCJA", ... };
> for (int index = 0; index < nazwy.length; index++) {
> Button metoda = new Button(nazwy[index]);
> metoda.setBackground(Color.getHSBColor(0.1f,0.4f,1 f));
> p1.add(metoda);
> }
> I czytelniejsze toto i dużo łatwiej dodać następnego (chyba, że zrobiłeś
> to w designerze w stylu VE).
>
> 4. Eh no sporo tego... catch (InterruptedException e) {}
> nieładne to jest wszystko i tyle...
>
> nawet jak to tylko na szybkie zaliczenie polecam poświęcić ze dwa-trzy
> dni i przeczytać jakiś dobry poradnik, naprawdę zwróci się niesamowicie.
>
> Poza tym bez nawet szczątkowych komentarzy i z tak nazwanymi zmiennymi
> to się tego po prostu nawet nie chce czytać, bo Sherlock Holmes nie
> jestem... - jak będziesz w przyszłości potrzebował pomocy to weź to
> silnie pod uwagę.
>
>
> Pozdrawiam i powodzenia
>
> Piotrek
>
>




user - 21-12-2005 12:20

  Paweł Król napisał(a):
> Mam dość prosty, acz rozbudowany aplet w Javie. We viewerze wygląda ok,
> Eclipse nie pisze o żadnych błędach, a jednak po uruchomieniu tego na
> stronie www mryga i nie bardzo to wygląda.

Polecam artykuł:

http://java.sun.com/products/jfc/tsc...ing/index.html




a1 - 21-12-2005 12:20

  Paweł Król wrote:

> Jeśli dobrze rozumiem, to cały mechanizm z buforowaniem działać ma tak:
> 1.Wszystkie operacje, które mają za zadanie się wykonać, mają zostać
> zapisane przez jakąś metodę w stworzonym dla nich buforze
> 2.To coś ma stac się źródłem dla tworzonego obrazu (createImage)
> 3.Ów obraz już za pomocą zwykłego painta ma zostać wyświetlony
>
> Czy tak?
Tak.

> I jeszcze pytanie, czy umieszczanie w programie repaintów, poprawiających
> wyświetlane dane zależnie od wciśniętych buttonów nie psuje całego pomysłu?
Nie, ale najlepiej bys zrobil gdybys dodal osobny komponent na ktorym
bedziesz rysowal wykres, i tylko na tym komponencie robil doublebuffering.

--

a1 (Bartek Janusz) mailto: arcone1 [at] invalid.gmail [dot] com
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    czemu dane www znikaja z darmowego serwera xhost po okolo 2 tyg? ms sql 2005 + mediator - czemu to tak strasznei wolno chodzi? mysql i cyrylica - czemu zapisuje mi w znaki formie &#....; ??? Czemu Photoshop nie widzi polskich liter? Matrox 750 - czemu ekrany się różnią ? [oracle] regexp - czemu nie działa? mssql - konwersja danych w jednej tabeli logo firmy elektroinstalacyjnej Kogo mozecie polecic jeszcze... Spring + Hibernate + Interceptor
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • marcelq.xlx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com