Wyświetlanie komponentu po upływie czasu

0

Witam,
napisałem pewien program, który ma za zadanie wyświetlić kwadrat po upływie 2 sec i jeślu użytkownik go naciśnie to ma zniknąć, i tak w kółko, aż licznik nie osiągnie 30. Lecz mam program, gdyż kwadrat nie chce mi się wyświetlić i nie wiem dlaczego :( Tu jest kod:

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


public class Mouse extends JComponent {
	public Mouse()
	{
		squares = new ArrayList<Rectangle2D>(1);
		current = null;
		
		addMouseListener(new MouseHandler());
		addMouseMotionListener(new MouseMotionHandler());
		
	}

	public void time()
	{
		for(int i = 0; i <30; i += 2)
		{
			ActionListener listner = new Time();
			Timer t = new Timer(sec, listner);
			t.start();	
		}
	}
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		if(drawRectangle)
		{
			int x = new Random().nextInt(679);
			int y = new Random().nextInt(779);
			Rectangle2D rec = new Rectangle2D.Double(x,y,20,20);
			g2.setPaint(Color.BLACK);
			g2.fill(rec);

		}
	}
	public void add(Point2D p)
	{
		double x = p.getX();
		double y = p.getY();
		current = new Rectangle2D.Double(x - 20, y - 20, 20, 20);
		squares.add(current);
		repaint();
	}
	public void remove(Rectangle2D s)
	{
		if(s == null)
			return;
		if(s == current)
		{
			current = null;
			squares.remove(s);
			repaint();
		}
	}
	public Rectangle2D find(Point2D p)
	{
		for(Rectangle2D r : squares)
		{
			if(r.contains(p))
				return r;
		}
		return null;
	}
	private class Time implements ActionListener
	{
		public void actionPerformed(ActionEvent event) {
			drawRectangle = true;
			repaint();
			
		}
		
	}
	private class MouseHandler extends MouseAdapter
	{
		@SuppressWarnings("unused")
		public void Cliked(MouseEvent event)
		{
			current = find(event.getPoint());
				remove(current);
		}
	}
	private class MouseMotionHandler implements MouseMotionListener
	{

		@Override
		public void mouseDragged(MouseEvent event) {
			//brak opcji
		}

		@Override
		public void mouseMoved(MouseEvent event) {
			if(find(event.getPoint()) == null) 
				setCursor(Cursor.getDefaultCursor());
			else
				setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			
		}
		
	}
	private int sec = 2*1000;
	private boolean drawRectangle = false;
	private Rectangle2D current;
	private ArrayList<Rectangle2D> squares;
}

Ps. Proszę jeszcze o sprawdzenie kodu, gdyż jestem początkującym i pewnie mogłem zrobić błędy.
Z góry dziękuje.

0

Rozwiązałem program, pojawiania się kwadratów po upływie czasu, lecz teraz zauważyłem, że akcje myszy nie działają. Nie mam pomysłu jak to rozwiązać :( Tu jest kod:

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


public class Mouse extends JComponent {
	Date start = new Date();
	Timer timer;
	public Mouse()
	{
		squares = new ArrayList<Rectangle2D>(1);
		current = null;
		
		addMouseListener(new MouseHandler());
		addMouseMotionListener(new MouseMotionHandler());
		
		 time();
	}
	public void time()
	{
		timer = new Timer();
		timer.schedule(new Time(),start, sec);
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		if(drawRectangle)
		{
			int x = new Random().nextInt(700);
			int y = new Random().nextInt(600);
			Rectangle2D rec = new Rectangle2D.Double(x,y,20,20);
			g2.setPaint(Color.BLACK);
			g2.fill(rec);
			if(i == 30)
			{
				Font font = new Font("SansSerif", Font.BOLD + Font.ITALIC, 155);
				g2.setFont(font);
				String message = "Koniec";
				g2.drawString(message, 150, 250);
				
			}

		}
	}
	public void add(Point2D p)
	{
		double x = p.getX();
		double y = p.getY();
		current = new Rectangle2D.Double(x - 20, y - 20, 20, 20);
		squares.add(current);
		repaint();
	}
	public void remove(Rectangle2D s)
	{
		if(s == null)
			return;
		if(s == current)
		{
			current = null;
			squares.remove(s);
			repaint();
		}
	}
	public Rectangle2D find(Point2D p)
	{
		for(Rectangle2D r : squares)
		{
			if(r.contains(p))
				return r;
		}
		return null;
	}
	private class Time extends TimerTask
	{
		public void run() {
			
			drawRectangle = true;
			repaint();	
			i++;
			if( i == 30)
			{
				timer.cancel();
			}
			
		}
		
	}
	private class MouseHandler extends MouseAdapter
	{
		@SuppressWarnings("unused")
		public void Cliked(MouseEvent event)
		{
			current = find(event.getPoint());
			if(current != null)
				remove(current);
		}
	}
	private class MouseMotionHandler implements MouseMotionListener
	{

		@Override
		public void mouseDragged(MouseEvent event) {
			//brak opcji
		}

		@Override
		public void mouseMoved(MouseEvent event) {
			if(find(event.getPoint()) == null) 
				setCursor(Cursor.getDefaultCursor());
			else
				setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
			
		}
		
	}
	private int i = 0;
	private int sec = 1500;
	private boolean drawRectangle = false;
	private Rectangle2D current;
	private ArrayList<Rectangle2D> squares;
}

Proszę o pomoc

1

Np teraz działa:

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


public class Mouse extends JComponent {
    Date start = new Date();
    Timer timer;
    public Mouse()
    {
        squares = new ArrayList<Rectangle2D>(1);
        current = null;

        addMouseListener(new MouseHandler());
        addMouseMotionListener(new MouseMotionHandler());

        time();
    }
    public void time()
    {
        timer = new Timer();
        timer.schedule(new Time(),start, sec);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        if(drawRectangle)
        {
            int x = new Random().nextInt(700);
            int y = new Random().nextInt(600);
            Rectangle2D rec = new Rectangle2D.Double(x,y,20,20);
            add(new Point(x,y));
            drawRectangle = false;
            g2.setPaint(Color.BLACK);
            g2.fill(rec);
            if(i == 30)
            {
                Font font = new Font("SansSerif", Font.BOLD + Font.ITALIC, 155);
                g2.setFont(font);
                String message = "Koniec";
                g2.drawString(message, 150, 250);

            }

        }
    }
    public void add(Point2D p)
    {
        double x = p.getX();
        double y = p.getY();
        //current = new Rectangle2D.Double(x - 20, y - 20, 20, 20);
        current = new Rectangle2D.Double(x, y, 20, 20);
        squares.add(current);
        //repaint();
    }
    public void remove(Rectangle2D s)
    {
        if(s == null)
            return;
        if(s == current)
        {
            current = null;
            squares.remove(s);
            repaint();
        }
    }
    public Rectangle2D find(Point2D p)
    {
        for(Rectangle2D r : squares)
        {
            if(r.contains(p))
                return r;
        }
        return null;
    }
    private class Time extends TimerTask
    {
        public void run() {

            drawRectangle = true;
            repaint();
            i++;
            if( i == 30)
            {
                timer.cancel();
            }

        }

    }
    private class MouseHandler extends MouseAdapter
    {
        @Override
        public void mouseClicked(MouseEvent e) {
            super.mouseClicked(e);
            current = find(e.getPoint());
            if(current != null)
                remove(current);

        }
        /*
        @SuppressWarnings("unused")
        public void Clicked(MouseEvent event)         {
            current = find(event.getPoint());
            if(current != null)
                remove(current);
        } */
    }
    private class MouseMotionHandler implements MouseMotionListener
    {

        @Override
        public void mouseDragged(MouseEvent event) {
            //brak opcji
        }

        @Override
        public void mouseMoved(MouseEvent event) {
            if(find(event.getPoint()) == null)
                setCursor(Cursor.getDefaultCursor());
            else
                setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

        }

    }
    private int i = 0;
    private int sec = 1500;
    private boolean drawRectangle = false;
    private Rectangle2D current;
    private ArrayList<Rectangle2D> squares;
}
0

Naprawdę wielkie dzięki :) A teraz jeszcze takie jedno pytanko, ma ktoś może pomysł jak zrobić by zliczał kwadraty które usunęliśmy ?

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