Malowanie x prostokątów

0

Witam,
Mam trzy klasy:

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

public class Main {
    public static void main(String[] args) {
        R r = new R();
        r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        r.setVisible(true);
    }
}

public class R extends JFrame {
    public R() {
        P p = new P();
        Container c = getContentPane();
        c.add(p);
    }
    
}

public class P extends JPanel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        Rectangle2D bbb = new Rectangle2D.Double(10, 10, 100, 100);
        g2.draw(bbb);
}

Powyższy program powinnien namalować jeden prostokąt.
Jak zmodyfikować ten program aby malował on X prostokątów, gdzie X to liczba tych prostokątów.
Tak aby współrzędne X prostokątów były przechowywane w tablicy i wartości tej tablicy by się zmieniały, a program np. co 1 sekundę pobierał by te wartości, zmazywał już namalowane prostokąty i malował nowe z nowymi współrzędnymi.
Jeśli chodzi o zmienianie wartości tablicy, to sobie poradzę. Niestety niewiem jak sprawić by program co jakiś czas malował X prostokątów.

Pozdrawiam
Marcin

0

Używasz wątku albo interfejsu Runable, korzystasz z metody z Sleep z odpowiednim parametrem

0

Witam,
A czy mógłby ktoś przykładowo zmodyfikować podany przeze mnie wcześniej program tak aby np. przesuwał (animował) jeden prostokąt.

Pozdrawiam

0

Zmodyfikowałem mój program. Teraz wygląda następująco:

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

public class Main {
    public static void main(String[] args) {
        R r = new R();
        r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        r.setVisible(true);
    }
}

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

public class R extends JFrame {
    public R() {
        P p = new P();
        setSize(300,300);
        Container c = getContentPane();
        c.add(p);
    }
    
}

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


public class P extends JPanel {
    
    Rectangle2D.Float obiekty[] = new Rectangle2D.Float[10];
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        
        for(int i = 0; i < 10; i++) {
            g2.fill(obiekty[i]);
        }
    }
    
    P() {
        for(int i = 0; i < 10; i++) {
            obiekty[i]=new Rectangle2D.Float(i*20,10,10,10);
        }
    }
}

Program maluje 10 kwadratów. Niestety nie potrafię zastosować wątków aby malował co sekundę 1 kwadrat.
Proszę o pomoc.

0

Kiedyś z nudów napisałem taki programik, wiec udostępnie Ci kod.

import java.util.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
public class Motylki extends JFrame{
	
	public Motylki(){
			Laka l = new Laka();
			getContentPane().add(l);
			setSize(500,500);
			show();
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			new Thread(l).start();
	}
	
	public static void main(String[] args){
		new Motylki();	
	}
	
}
class Laka extends JPanel implements Runnable{
	int step = 10;
	long delay = 1;
	boolean pause = false;
	Motylek[] motylki = new Motylek[10];
	JLabel predkosc = new JLabel();

		public Laka(){
			setTxt();
			add(predkosc);
			addKeyListener(new P());
			initMotylki();	
		}
		
		public boolean isFocusTraversable(){
			return true;
		}
		private void setTxt(){
			predkosc.setText("Odświeżanie: " + delay + ", krok: " + step);
		}
		private void setPause(){
			predkosc.setText("Pause");
		}
		
		private void initMotylki(){
			motylki[0] = new Motylek(Color.red,200,300);
			motylki[1] = new Motylek(Color.blue,200,100);
			motylki[2] = new Motylek(Color.black,200,50);
			motylki[3] = new Motylek(Color.yellow,20,150);
			motylki[4] = new Motylek(Color.pink,20,20);
			motylki[5] = new Motylek(Color.blue,200,250);
			motylki[6] = new Motylek(Color.gray,230,200);
			motylki[7] = new Motylek(Color.white,200,200);
			motylki[8] = new Motylek(Color.red,200,200);
			motylki[9] = new Motylek(Color.orange,200,0);
		}
		
		public void paintComponent(Graphics g){
			super.paintComponent(g);
			Graphics2D g2 = (Graphics2D)g;
			g2.setPaint(Color.green);
			Rectangle2D bg = new Rectangle2D.Double(0,0,500,500);
			g2.fill(bg);
			g2.draw(bg);
			
			for(int i=0;i<motylki.length;i++){
				motylki[i].newCords();
				g2.setPaint(motylki[i].getColor());
				Rectangle2D pros1 = 
					new Rectangle2D.Double(motylki[i].getX(),motylki[i].getY(),10,10);
				g2.fill(pros1);
				g2.draw(pros1);
			}
		}
		
		public void run(){
			try{
				while(true){
					Thread.sleep(delay);
					if(pause) continue;
										
				repaint();	
				}
				
			}catch(Exception e){}
		}
		
private class P implements KeyListener{
	
	public void keyPressed(KeyEvent e){
			int code = e.getKeyCode();
			if(code == KeyEvent.VK_UP)step += 5;
			else if(code == KeyEvent.VK_DOWN)step -= 5;
			else if(code == KeyEvent.VK_LEFT)step -= 1;
			else if(code == KeyEvent.VK_RIGHT)step += 1;
			
			if(code == KeyEvent.VK_Q) delay += 50;
			else if(code == KeyEvent.VK_W) delay -= 50; 
			else if(code == KeyEvent.VK_A) delay += 5;
			else if(code == KeyEvent.VK_S) delay -= 5;
			else if(code == KeyEvent.VK_Z) delay += 1;
			else if(code == KeyEvent.VK_X) delay -= 1;
			
			if(delay<0) delay =0;
			if(delay>10000) delay = 10000;			
			if(step <1) step =1;
			if(step>50) step = 50;
			//System.out.println(step + " " + delay);
			setTxt();
		}
		public void keyReleased(KeyEvent e){	}
		
		public void keyTyped(KeyEvent e){
			int code = e.getKeyChar();
			if(code == 'p'){
				if(!pause){
					pause = true;
				//	System.out.println("pause");
					setPause();
				}
				else{
					pause = false;
					setTxt();
					//System.out.println("unpause");
				}
			}
		}
}	
	
	
private class Motylek{
	private Color color;
	private double x1;
	private double y1;
	public Motylek(Color color, double x, double y){
		this.color = color;
		x1 = x;
		y1 = y;
	}
	
	public void newCords(){
		Random rand = new Random();
		switch(rand.nextInt(4)){
			case 0:{
			 	if((x1+step) <= 490) x1+=step;
				break;
			}
			case 1:{
				if((x1-step) >= 0)x1-=step;
				break;							
			}
			case 2:{
				if((y1+step) <= 490) y1+=step;
				break;
			}
			case 3:{
				if((y1-step) >= 0) y1-=step;
				break;
			}
		}
	}
	
	public double getX(){
		return x1;
	}
	public double getY(){
		return y1;
	}
	public Color getColor(){
		return color;
	}
	
}
	
}

Dalej baw sie sam ;)

Pozdrawiam BookaYashee

0

Witam,
Wielkie dzięki BookaYashee.
Twój przykład bardzo mi się przydał.

Pozdrawiam

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