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

Java Timer blad przy tworzeniu obiektu

Object Storage Arubacloud
+1 głos
252 wizyt
pytanie zadane 20 kwietnia 2018 w Java przez neos Początkujący (320 p.)

Piszę program symulujący masę na sprężynie. Muszę użyć do tego JApplet. Nie wiem czemu, ale przy tworzeniu obiektu timer wyrzuca mi błedy w konsoli i nic się nie rysuje na applecie. Gdy usunę timer = new Timer() to wszsytko jest w porządku. O co chodzi? W instrukcji mam zapisane że obiekt timer muszę stworzyć w metodzie init().

 

package com.company;
import javax.swing.*;
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;
//main class
public class SpringApplet extends JApplet{

    int width, height;

    private SimTask simTask;
    private SimEngine simEngine;
    private Timer timer;


    @Override
    public void init() {

            width = 1000;
            height= 1000;
            setSize(width,height);
            this.simEngine = new SimEngine(3f,5f,3f,20f,200f, 200f, 10f, 200f,150f);
            this.simTask = new SimTask(this.simEngine, this, 0.02f);
            timer = new Timer(true);
            timer.scheduleAtFixedRate(simTask,0,20);

    }

    @Override
    public void paint(Graphics g) {

        g.setColor(Color.GREEN);
        g.drawLine(0,0,500,500);
    }
}

1 odpowiedź

0 głosów
odpowiedź 20 kwietnia 2018 przez Wiciorny Ekspert (269,710 p.)
edycja 20 kwietnia 2018 przez Wiciorny

Czym jest SimTask, i EngineTask?

Generalnie- nie możesz wywoływać "innych procesów w Applecie" bo applet jest singletonem i jest to kontener

https://stackoverflow.com/questions/12227171/java-security-accesscontrolexception-occured-when-running-an-applet

U mnie kod działa poprawnie z obiektem Timer, jednak :) problem leży w 

 private SimTask simTask;

    private SimEngine simEngine;

nie wiem jak wygląda implementacja potem wewnatrz, ale prawdopodobnie jak tu pisze "zbyt wiele wątków uruchamiasz na raz" 

Zaglądnij sobie do metody z klasy Timer- jest ona oparta o Runnable- wątki, co warto mieć na uwadze to fakt że jest to metoda synchroniczna, wiec  tylko jeden wątek moze mieć do niej dostęp, a u Ciebie wątków tworzy sie troche więcej 

stąd naruszenie modifyThreadGroup  

1
komentarz 21 kwietnia 2018 przez neos Początkujący (320 p.)
package com.company;


import java.util.TimerTask;

public class SimTask  extends TimerTask{

    private SimEngine simEngine;
    private SpringApplet springApplet;
    private double delta_t;

    public SimTask (SimEngine simEngine, SpringApplet springApplet, double delta_t)
    {

        this.simEngine = simEngine;
        this.springApplet = springApplet;
        this.delta_t = delta_t;
    }


    public void run() {
        simEngine.Simulate(delta_t);
        springApplet.repaint();

    }



}

 

package com.company;




public class SimEngine {
    //parameters
    private double M;
    private double K;
    private double C;
    private double L0;
    private double massX0;
    private double massY0;
    private double pointX0;
    private double pointYO;
    private static double G = 9.81f;
    //private Vector2D massSpeed;
    //private Vector2D gravityForce;
    private double massSpeed;


    //getters
    public double getM() {
        return M;
    }
    public double getK() {
        return K;
    }
    public double getC() {
        return C;
    }
    public double getL0() {
        return L0;
    }
    public double getMassX0() {
        return massX0;
    }
    public double getMassY0() {
        return massY0;
    }
    public double getPointX0() {
        return pointX0;
    }
    public double getPointYO() {
        return pointYO;
    }

    public double getG() {
        return G;
    }


    public SimEngine(double M, double K, double C, double L0, double massX0, double massY0, double massSpeed, double pointX0, double getPointYO )
    {
        this.M = M;
        this.K = K;
        this.C = C;
        this.L0 = L0;
        this.massX0 = massX0;
        this.massY0 = massY0;
        this.massSpeed = massSpeed;
        this.pointX0 = pointX0;
        this.pointYO = getPointYO;

    }

    public void Simulate(double stepTime)
    {
        double force =  this.massY0*(-this.K) + this.massSpeed*this.C;
        double a = force/M;
        this.massSpeed = massSpeed + a*stepTime;
        this.massY0 = massY0 + massSpeed*stepTime + a*stepTime*stepTime/2;

    }

    public void restart()
    {
        massSpeed = 0f;
    }
}


To jest kod klas SimEngine i SimTask. Na Eclipse wszystko działa :/ Dlaczego są problemy z InteliJ? :/

Podobne pytania

0 głosów
1 odpowiedź 355 wizyt
pytanie zadane 4 maja 2016 w Java przez DeBos123 Nałogowiec (44,950 p.)
+1 głos
2 odpowiedzi 131 wizyt
pytanie zadane 6 kwietnia w JavaScript przez sensor Użytkownik (680 p.)
0 głosów
0 odpowiedzi 195 wizyt
pytanie zadane 16 grudnia 2022 w JavaScript przez PtaQ Początkujący (280 p.)

92,565 zapytań

141,418 odpowiedzi

319,602 komentarzy

61,951 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!

...