Timer + graphics2D draw

0

Witam mam problem

Chcialbym napisac klase ktora rysuje mi np. co sekunde nowa linie na panelu
javax.swing.Timer t = new javax.swing.Timer(1000,sluchacz);

i w sluchaczu
g.draw(new Line.Float(p1,p2));

i nie rysuje linii...

wszystko sie kompiluje, linia sie rysuje gdy nie ma jej w sluchaczu i wszystko inne dziala

0

oczywiscie powinno byc new Line2D ;)

0

A może po prostu zapomniałeś odpalić timer?

0

nie nie jest t.start();

gdy zamiast g2.draw wpisze np. System.out.println("cos tam");

to dziala

0

Mi to działa:

class RandLinesPanel extends JPanel {
	private static Random rand = new Random(47);
	public RandLinesPanel() {
		setPreferredSize(new Dimension(400,400));
		Timer timer = new Timer(1000, new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				repaint();
			}
		});
		timer.start();
		
	
	
	}
	public void paintComponent(Graphics g) {
		g.drawLine(rand.nextInt(400), rand.nextInt(400), 200, 200);
 	}
	
}

0

hehe nie wpadłem na to że ... repaint()... :P

dzięki wielkie

0

Witam ponownie

Pojawił się kolejny problem

mam program który rysuje koleją linię wykresu co 1 sekunde
Problem polega na tym że 1 linia rysuje sie po 1 sekundzie czyli wszystko ok,
ale po 2 sekudzie rysuje sie juz kilka linii a po 3 prawie cały wykres ...

część kodu
(...)
public Wykres wykres = new Wykres(p0,tab);
Graphics2D g2;
public void PanelWykresZSG()
{
setPreferredSize(new Dimension(400,400));
}

public void paint(Graphics g)
{
    g2 = (Graphics2D) g;
    javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            g2.draw(wykres.nextLine());
            repaint();
        }
    });
    timer.start();
}

(...)

Poza tym zauważyłem dziwną sprawę , gdy manualnie zmieniam rozmiar panelu CAŁY_PROGRAM się jakby restartuje i zaczna rysować wszystko od nowa ...
Dlaczego ?

metoda nextLine() klasy Wykres zwraca nową linię (new Line(x,y));

0
    public void paint(Graphics g)
    {
        g2 = (Graphics2D) g;
        javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                g2.draw(wykres.nextLine());
                repaint();
            }
        });
        timer.start();
    }

repaint(), to żądanie odświeżenia, a więc wykonania metody paint(), paint() uruchamia kolejny timer i wywołuje repaint(),...
Podsumowując, wywoływanie repaint() z paint() i tworzenie nowego timera wewnątrz paint(), to, imho, zupełny nonsens.

0

hmm jak wstawie ActionListenera z repaint() do konstruktora klasy,
a w metodzie paint zostawie tylko g2.draw(...) to rysuje tylko pierwszą linię ...

i jak pisałem wyżej przy zmianie rozmiaru panelu wykres(a właściwie linia...) rysuje się od nowa

HELP

0

Spłodziłem taki przykładzik:

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

public class Linie extends JFrame
{
    protected ArrayList<Line2D.Float> odcinki=new ArrayList<Line2D.Float>();
    public static void main(String[] args)
    {
        new Linie();
    }
    //------------------------
    public Linie()
    {
        setLayout(new FlowLayout());
        add(new MyPanel(this));
        final Random r=new Random();
        javax.swing.Timer timer=new javax.swing.Timer(1000, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                Line2D.Float l=new Line2D.Float(400*r.nextFloat(),300*r.nextFloat(),400*r.nextFloat(),300*r.nextFloat());
                odcinki.add(l);
                repaint();
            }
        });
        timer.start();

        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}
//------------------------------------------------
class MyPanel extends JPanel
{
    private Linie parent;
    //------------------------
    public MyPanel(Linie parent)
    {
        super();
        setPreferredSize(new Dimension(400,300));
        this.parent=parent;
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2=(Graphics2D)g;
        for(Line2D.Float l:parent.odcinki)
            g2.draw(l);
    }
}

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