animowany wykres <- obciaza mi procka na 100%

0

witam

Mam aplet z zakladkami. i w jednej z zakladek chcialbym zrobic wykres rysujacy sie po wcisnieciu guzika "start" (animowany wykres) . ponizej zamiescilem fragmenty funkcji obslugujacej watek i rysujacej.
PROBLEM polega na tym ze gdy sie rysuje to obciaza mi procka na 100% gdyz wykres sie ciagle odrysowuje od poczatku jak zrobic zeby tylko fragment wykresu sie dorysowywal tylko a nie caly wykres??

Czy moze ktos mi pomoc w tym??? (i zeby jeszcze dany fragment wykresu ktory juz sie narysowal nie znikal jesli bedzie dorysowywany dalszy ciag wykresu).

przy pomocy jednego przycisku wlacza sie, pauzuje wykres oraz ponownie rysuje sie wykres, zmienia sie etykieta przycisku (Start, stop)

jestem poczatkujacym w javie wiec nie mam zbyt wielkiego pojecia o tym

/// >>>>>>>>>zdarzenia<<<<<<<<<
public void actionPerformed(ActionEvent e){
if(e.getSource() == but4 ){

if(watek3==null){
flaga=1;

    (watek3 = new Thread(this)).start();
    but4.setLabel("Stop");

   

}

else{

    watek3=null;
    flaga=0;

    but4.setLabel("Start");
    if(time3==600) watek3=null;

}
}

}

//>>>>>>OBSLUGA WATKU:<<<<<<<<<

public void run(){

while (watek3 != null&&time3<600 &&flaga==1){
try{watek3.sleep(50);} catch (InterruptedException exc){return;}

       pjedno.repaint();   //wywolanie podfunkcji w void paint(Graphics g ) odrysowujacej wykres
      time3++;
     
         
       
   
   }
   
   
   

if(time3==600){
watek3.interrupt();
time3=0;
but4.setLabel("Animuj");

}
}

//>>>>>>>>FRAGMENT FUNKCJI RYSUJACEJ:<<<<<<<<

siny[77] =(Math.sin(77*0.04) fps33/2 + 80);
sinx[77]=77;
for(int t=78;t<time3+78;t=t+1)
{ g.setColor(Color.RED);
siny[t] =(Math.sin(t
0.04) *fps33/2 + 80);
sinx[t]=t;
g2.draw(new Line2D.Double(sinx[t-1]-40, siny[t-1], sinx[t]-40, siny[t]));

                        //charakterystyka idealna
                                       if(znacz30.isSelected())
                                       {
                               
                                               g.setColor(Color.GREEN);
                        if(siny[t]>80)
                                       g2.draw(new Line2D.Double(sinx[t-1]-40,siny[t-1]+100, sinx[t]-40, siny[t]+100));
                                              if(siny[t]<=80)
                                       g2.draw(new Line2D.Double(sinx[t-1]-40, pom[0]+100, sinx[t]-40, pom[0]+100));
                                               g.setColor(Color.BLUE);
                                       if(siny[t]>80)
                                       g2.draw(new Line2D.Double(sinx[t-1]-40,pom[0]+230, sinx[t]-40, pom[0]+230));
                                              if(siny[t]<80)
                                       g2.draw(new Line2D.Double(sinx[t-1]-40, siny[t-1]+230, sinx[t]-40, siny[t]+230));
                        }
                       
                        /// cha-ka rzeczywista
                        if(znacz31.isSelected())
                                       {
                                                     
                                       
                                               g.setColor(new java.awt.Color(0, 100, 0));
                        if(siny[t]>75)
                                       g2.draw(new Line2D.Double(sinx[t-1]-40,siny[t-1]+100, sinx[t]-40, siny[t]+100));
                                              if(siny[t]<75)
                                       g2.draw(new Line2D.Double(sinx[t-1]-40, pom[1]+100, sinx[t]-40, pom[1]+100));
                                               g.setColor(new java.awt.Color(0, 0, 200));
                                       if(siny[t]>75)
                                       g2.draw(new Line2D.Double(sinx[t-1]-40,pom[1]+235, sinx[t]-40, pom[1]+235));
                                              if(siny[t]<75)
                                       g2.draw(new Line2D.Double(sinx[t-1]-40, siny[t-1]+235, sinx[t]-40, siny[t]+235));
                        }
                        }

z gory dzieki za pomoc

jak sie synchornizuje watki?? jesli mam np 3 watki rysujace wykresy i jesli wlacze rysowanie w jednej zakladce w aplecie i w drugiej zakladce aplecie i wtrzeciej... zeby dobrze dzialaly watki gdyz odwoluja sie do jednej funkcji rysujacej??

Czy mozna jakos stosowac indexy w jtextarea?? np. R z indeksem 1

czy mozna wywolac w danej funkcji rysujacej:

try{watek3.sleep(50);} catch (InterruptedException exc){return;}

???

jesli tak to jak sie to robi?

0

Chcesz pokazać gotowy wykres czy wykres powstający ?
Jeśli wykres powstający, to niestety musisz rysować wielokrotnie - aplet nie dostaje informacji jaką część rysunku użytkownik zasłonił innym oknem i co w związku z tym trzeba odrysować. Odrysowana będzie wszystko.
Jeśli gotowy wykres, to rozwiązaniem jest rysowanie w pamięci.

int[] pixels=new int[width*height];
// fragment rysujący:
for(int i=0;i<width*height;i++)
if (...)
  pixels[i]=Color.black);
else
  pixels[i]=Color.white);
//utworzenie obrazu
MemoryImageSource source=new MemoryImageSource(width,height,pixels,0,width);
Image image=createImage(source);
//odtworzenie obrazka w metodzie paint(..)
 if(image!=null)
{
     g.drawImage(image,0,0,this);
}

pozdrawiam

0

Ma być wykres powstający w czasie rzeczywistym. czyli widzimy jak sie kazdy fragment jego rysuje. czy w funckji rysujacej mozna zastosowac jakos opoznienie tzn w petli ktorej rysuje sie wykres dac opoznienie np 50ms??

0

Można, ponieważ czas opóźnienia należy dobrać eksperymentalnie, to lepiej mieć zmienną

int delay;

Wartość zmiennej delay można odczytywać z pliku tekstowego z parametrami programu lub pozwalać użytkownikowi edytować.

Thread ct=Thread.currentThread();
for (int i=0;i<=ileIteracji;i++)
{
   if(delay>0)
   {
       try
       {
           ct.sleep(0,delay); // tak jest jeśli delay jest w milisekundach, jeśli w sekunfach, to ct.sleep(delay);
       }
       catch (InterruptedException e)
       {
       }
    }
    // tutaj kolejny krok rysowania
 } 

pozdrawiam

0

znalazlem taki aplecik ktory rysujacy w czasie rzeczywsitym:

Aplet rysuje koło o wzrastającym promieniu. Na końcu pojawia się napis "Surprise!"

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

public class Surprise extends Applet {
  // Surprise with an exploding balloon
  // Author: Rachel McDermott, September 27, 1996

  public void init() {
    setForeground(Color.yellow);
  }

  public void paint (Graphics g) {
    Dimension size = getSize();        
/* getSize() - Metoda pobierająca wymiary apletu
    obiekt typu Dimension ma dwa pola width i height   */
    int diameter = 0,
        cx = size.width,
        cy = size.height,
        cmin = (int)Math.min(cx, cy);

    while (diameter < cmin) {
      g.fillOval((cx-diameter)/2, (cy-diameter)/2,
                 diameter, diameter);
      diameter++;
      try {
        Thread.sleep(10);               // sleep for 10 msec
      } catch (InterruptedException t){}
    }

    g.setColor(Color.red);
    g.drawString("Surprise!", (cx-53)/2, (cy+14)/2);
    g.setColor(Color.yellow);
  }
} 

dalem opznienie:
try {
Thread.sleep(10); // sleep for 10 msec
} catch (InterruptedException t){}
}
dalem to poznienie do zakladki w moim aplecie w ktorej rysowany jest wykres i nie dziala to tak jak w tym kodzie po wyzej. TZN: klikajac w zakladke w ktorej jest wykres musze odczekac az dopiero ten wykres sie narysuje i dopiero wtedy pojawi mi sie zawartosc zakladki!! po prostu "przywiesza zakladke " na czas narysowania tego wykrewsu. i dopiero jak sie narysuje ten wykres TO DOPIERO WTEDY WIDZE ZAWARTOSC ZAKLADKI. w pewnym sensie rysuje sie wykres w czasie rzeczywsitym ale tego nie widze jak zrobic zeby bylo widac??? i np zmieniajac warosc suwaka (wartosc suwaka jest powiazana z wartosciami wykresu) znowu przywiesza aplet na czas narysowania tego wykresu (nie widze jak sie rysuje ten wykres) i po skonczeniu petli pojawia sie nagle wykres zmieniony zgodnie z wartoscia suwaka. Czemu nie rysuje sie ten wykres w czasie rzeczywistym w zakladce (punkt po punkcie)??

0

Użyj timer'a. W funkcji obsługi timera dorysowuj kolejną część. Wątek jest zbędny i tylko przysparza kłopoty.

0

a jak sie uzywa timera jakis przyklad?

0
krzysiek_x napisał(a)

a jak sie uzywa timera jakis przyklad?

Załamka. Już nie wiem czy to ja mam jakieś dziwne dni czy sie namówiliście ;).

http://www.google.pl/search?q=java+timer

0

Sprawdzałeś w praktyce działanie Timerów (java.util.Timer i javax.swing.Timer) ? Ja tak, u mnie nie działają jeśli korzystam z klasy JApplet (działają w klasie Applet).
A teraz coś dla Krzyśka

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

public class TestTimera extends JApplet
{
      static public JApplet naszAplet;
      //----------------------
      public void init( )
      {
            java.util.Timer timer = new java.util.Timer( );
            Zadanie zadanie = new Zadanie( );
            timer.schedule(zadanie,2000,500);
            naszAplet = this;
      }
}

class Zadanie extends TimerTask
{
      static boolean czerwony = true;
      public void run( )
      {
            if(czerwony == true)
            {
                  TestTimera.naszAplet.setBackground(Color.blue);
                  czerwony=false;
            }
            else
            {
                  TestTimera.naszAplet.setBackground(Color.green);
                  czerwony=true; 
            } 
      }
}

Po zmianie klasy JApplet na Applet działa.
pozdrawiam

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