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.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
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.pldoc.pisz.plpdf.pisz.plmarcelq.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 |
|