Animacja w aplecie

0

Witam Wszystkich,

Na wstępie dodam że jestem zielony w programowaniu java. Do rzeczy: Mam w swoim aplecie układ współrzędnych, przyciski i suwaki. Próbuję dodać do tego na początek przesuwający się napis HelloWorld z prawej do lewej strony ale nie za bardzo mi to wychodzi. Mam oddzielnie stworzony taki program i się uruchamia, ale nie wiem jak go wrzucić w mój aby działał Zamieszczam swój szkielet (przepraszam za słabo czytelność jego) :


package pakiet;
import javax.swing.*; 
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.applet.Applet;

public class Program
 {
    public static void main(String args[])
  {
    Okno okno=new Okno();
    okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    okno.setVisible(true);
   }
}
class Okno extends JFrame 
{
  public Okno() // 
  {
    setTitle("Tytuł");
    setSize(600,600);

    UkladPanel p=new UkladPanel();
    Container powzaw=getContentPane();
    powzaw.add(p);
  }
}
class UkladPanel extends JPanel implements Runnable
 {
public void run()
      {
        repaint();
      }
private static void createAndShowGUI()
{
        SpringLayout layout = new SpringLayout();
}
    LinkedList<Point2D.Double> points = new LinkedList<Point2D.Double>();
    public static float zoom = 40;
    Dimension size = null;
    // Center
    public static int midX;
    public static int midY;
    public static int defMidX = 315;
    public static int defMidY = 200;

    /* Dokładność */
    /* Przyciski */
    

      public UkladPanel() 
 {
     super();
        setBackground(Color.WHITE);

        this.setVisible(true);
/* Suwaki */
        init();
}
    private void init() 
    {
        repaint();
    }

    @Override   
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
/* Dynamiczne przeliczanie informacji */
    }
    /* Rysowanie osi */
    public void drawAxis(Graphics g, Dimension size, int midX, int midY) 
{

}
    public static void main (String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new UkladPanel().setVisible(true);
    Console.run(new UkladPanel(), 500, 500);
    createAndShowGUI();
            }
        });
    }
}

I kod programu który chce w nim umieścić:

class HelloAnim extends JApplet implements Runnable 
   {
    Image buforI;
    Graphics buforG;
    int x = 0;
    int y = 0;
    int width = 0;
    Thread my_thread = null;

    public void init()
      {
        x = size().width;
        y = size().height / 2;
        width = x;
        buforG = buforI.getGraphics();
      }

    public void start()
      {
        my_thread = new Thread(this);
        my_thread.start();
      }

    public void run()
      {
        while(true)
          {
            repaint();
            x -= 10;
            if(x < 0)
              x = width;

            try
              {
                Thread.sleep(100);
              }
            catch(InterruptedException e)
              {
              }
          }
      }

    public void paint(Graphics g)
      {
        g.drawString("Hello World!", x, y);
      }
      }

0

Mógłby chociaż ktoś mi wytłumaczyć co znaczy np taki zapis (druga linijka):

public static int dokl = 8;
double dx = 2f / (double) dokl;

0

Pewnie. dx dostaje wartość double 2/8 = 1/4 = 0.25 przy czym 2 jest stałą zmiennorzecinkową, a 8 to skonwertowana na double liczba int. Gdyby zapis był dx = 2/dokl, to wynikiem byłoby zero ponieważ wtedy w dzieleniu brałyby udział dwie liczby całkowite, więc dzielenie też byłoby całkowite (bez ułamków)
Wystarczy aby jeden składnik dzielenia był zmiennoprzecinkowy, a cała operacja jest przeprowadzana zmiennoprzecinkowo w podwójnej precyzji (czyli tak jak double). Tutaj oba elementy dzielenia są przekształcane do postaci zmiennoprzecinkowej pierwszy od razu jako stała double, a drugi w wyniku konwersji na double. Jedno lub drugie można pominąć, ale nie oba.

0

Dziękuję Olamagato_nz za wyczerpującą i zrozumiałą odpowiedź :)

0

Mam kolejny problem:
Mam napisany program do rysowania funkcji liniowej. Chciałbym teraz, aby jak włączę program to ta linia żeby była rysowana na moich oczach, a nie gotowa kreska. Jak to zrobić? Jest jakaś na to metoda? Proszę o pomoc.

P.S Nie pisałem tego w nowym temacie ponieważ nie wiem jak to nazwać zwięźle aby było zrozumiałe.

0

Musisz to chyba zrobić ręcznie. Dodajesz timera i powiedzmy co jedną setną dorysowujesz 1/100 prostej.

0

@Afish, to chyba nie jest takie proste. Weźmy prostą o końcach (0,0) oraz (100,30). Po podzieleniu na 100 części, pojedyncza część to odcinek o wymiarach (1piksel X 1/3 piksla). Trudno to narysować. Myślałem o takim rozwiązaniu (przy użyciu timera): rysujemy w pętli całą prostą i jej (coraz mniejszą) część zmazujemy. Ale boję się migania.

0

Masz przykładowe rozwiązanie w aplikacji desktopowej. Na aplet przerób sam.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Prosta extends JFrame
{
    protected int lewo=0;
    private Timer timer;
    //------------------------
    public static void main(String[] args)
    {
        new Prosta();
    }
    //------------------------
    public Prosta()
    {
        timer=new javax.swing.Timer(10, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                lewo+=1;
                repaint();
                if(lewo>800)
                {
                    timer.stop();
                }
            }
        });
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PanelProstej panel = new PanelProstej(this);
        add(panel,BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        timer.start();
    }
}
//------------------------------------------------
class PanelProstej extends JPanel
{
    private Prosta parent;
    //------------------------
    public PanelProstej(Prosta parent)
    {
        this.parent=parent;
        setPreferredSize(new Dimension(800,600));
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawLine(0,100,799,500);
        g.clearRect(parent.lewo,100,799,500);
    }
}
0

Dziękuję Wam za zainteresowanie i pomoc.
Ogólnie wiem co to jest aplikacja desktopowa, ale z tego kodu który "bo" podałeś nie za bardzo widzę jak to wywnioskowałeś, ale mniejsza o to, program się kompiluje, okno się otwiera, prosta się rysuje;) Dziękować jeszcze raz:)

0

Po dłuższej przerwie wziąłem się ponownie za mój program, próbowałem zaimplementować w nim tą aplikację desktopową ale NetBeans pokazuje mi ciągle jakiś wyjątek w linijce

g.clearRect(parent.lewo,100,799,500);

Czy jest możliwe cze clearRect się "gryzie z innym poleceniem?
Między aplikacją a aplikacją desktopową nie ma chyba duzej różnicy? Mógłby mnie ktoś oświecić? Program pisze w czterech różnych klasach.

0

Przy tak dokładnym opisie błędu

NetBeans pokazuje mi ciągle jakiś wyjątek w linijce
jedyna możliwa odpowiedź to: pewnie zrobiłeś jakiś błąd

0

Sorry.
komunikat z NetBeans:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
i potem w pierwszej linijce jest moja klasa podane w ktorym wierszu jest blad:
g.clearRect(parent.lewo,100,799,500);
Pomóż proszę.

0

Zapewne zmienna parent jest null, bez kodu dokładna diagnoza jest niemożliwa.

0

To mam tej zmiennej przypisać wartość początkową czy true ?
W kodzie podanym przez Ciebie nie przypisywałeś jej nica działa. czemu?

0
class PanelProstej extends  JPanel
{
    private Prosta parent;
    //------------------------
    public PanelProstej(Prosta parent)
    {
        this.parent=parent; // A co to jest jak nie przypisanie ???
        setPreferredSize(new Dimension(800,600));
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawLine(0,100,799,500);
        g.clearRect(parent.lewo,100,799,500);
    }
}
0

No tak, masz racje, no więc tak samo przypisałem więc to nie to chyba?
Szczerze to nie rozumiem zapisu z nawiasu z tego wiersza:
public PanelProstej(Prosta parent)

0

Do konstruktora klasy PanelProstej przekazywana jest referencja do obiektu klasa Prosta. Potrzebne jest to by dwie klasy mogły wymieniać informacje. W moim przykładzie zmianą wartości zmiennej lewo zajmował się Timer w klasie Prosta, a klasa PanelProstej wykorzystywała tę zmienną do zamalowania części narysowanej prostej.

        g.drawLine(0,100,799,500); //rysuje całą prostą
        g.clearRect(parent.lewo,100,799,500); //(malejąca) część prostej jest mazana
0
bo napisał(a)

Zapewne zmienna parent jest null, bez kodu dokładna diagnoza jest niemożliwa.

Wracając do kodu. mógłbyś mi podać nr gg bądz e-mail? Nie chciałbym udostępniać kodu publicznie.

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