[Java] Zadanie dla poczatkujacych

0

Witam, dopiero zaczynam moja przygode z programowaniem na studiach, a juz mam ogromne problemy. Zadanie brzmi:

 

Oprogramuj nastepujaca hierarchie klas:
Punkt - klasa definiujaca punkt na płaszczyznie.
Współrzedne punktu powinny byc zmiennymi prywatnymi, ale klasa powinna miec publiczne
metody, które umoliwia odczytanie ich wartosci.
Ksztalt - klasa abstrakcyjna zawierajaca:
- Zmienna prywatna: liste/tablice zmiennych typu Punkt.
- Metode abstrakcyjna void rysujKsztalt(Graphics g). Obiekt Graphics powinien byc obiektem z
pakietu java.awt.
- Metode do pobierania punktu o numerze nr z listy punktów. int pobierzPunkt(int nr). W
przypadku, gdy podany numer jest wiekszy od całkowitej liczby punktów powinien zostac
wyrzucony wyjatek.
- Powinnismy miec moliwosc przekazania dowolnej ilosci punktów do konstruktora tej klasy.
(ewentualnie wersja łatwiejsza: do konstruktora przekazujemy zawsze 3 punkty, zamiast zmiennej
prywatnej bedacej lista punktów tworzymy trzy zmienne prywatne – kada odpowiada kolejnemu
punktowi).
Odcinek - klasa definiujaca odcinek i dziedziczaca po klasie Ksztalt.
Prostokat - klasa definiujaca kwadrat i dziedziczaca po klasie Ksztalt. (Łatwiejsza wersja: prostokat
o krawedziach równoległych do krawedzi ekranu. Trudniejsza wersja: prostokat o krawedziach pod
dowolnym katem).
Trojkat - klasa definiujaca trójkat i dziedziczaca po klasie Ksztalt.
W klasach: Odcinek, Prostokat, Trojkat zdefiniuj metode rysujKsztalt(Graphics g) tak, aby
korzystała z metod drawLine(...), drawRect(...) z pakietu java.awt.
(Nadobowiazkowe - dodatkowe punkty):
Napisz klase testujaca w postaci apletu (dziedziczaca po klasie Applet z pakietu java.Applet)
i umiesc w metodzie void paint(Graphics g) kod słuacy do rysowania trójkatów, prostokatów i
odcinków.
Osadz aplet w pliku o nazwie Test.html w taki sposób, aby po dwukrotnym kliknieciu na plik
testujacy przegladarka wyswietlała narysowane kształty.

Nie mysle tu nawet o tym nadobowiazkkowym czy jakims trudniejszym wariantem. Generalnie umialam tylko stworzyc klase punkt, tablice. Zaś takie terminy jak klasa abstrakcyjna, dziedziczenie i to cale "Graphics" przerastaja moje mozliwosci na ten moment.

Bede wdzieczna za jakokolwiek pomoc. Podrawiam :)

0

Witam wszystkich,
Jest to mój pierwszy post na tym forum. Dlatego proszę wszystkich o wyrozumiałość jeżeli coś zrobie nie tak lub popełnie jakiś błąd. Odpowiadam akurat w tym temać, bo mam nadzieję że pomogę osobie która założyła ten temat jak również sobie poprzez wasze sugestie oraz pomoc w zrozumieniu zagadnień związanych z tym jezykiem programowania. Czytając ten post pomyślałem sobie, że jednak spróbuje zrobić te zadania, ponieważ jestem początkujący jeżeli chodzi o programowanie w języku Java. Dlatego proszę o pomoc w poprawie błedów oraz sugestie związane z kodem tego zadania(co można zrobić lepiej).
Jak na razie udało mi się narysować linie, ale oczywiście jest to kod do w początkowej fazie ;). Moje pytanie dotyczy tego w jaki sposób zrobić wyżej wymienioną metode int PobierzPunkt(int) aby zwracała zmienną typu INT ze współrzędnymi danego punktu? Dlatego w mojej wersji zwraca ona typ Punkt. Kolejne pytanie dotyczy użycia klasy ComponentPane która dziedziczy po JComponent. Czy da się narysować tą linie lub figury bez tworzenia klasy dziedziczącej po JComponent? Następne pytanie dotyczy metody void rysujKsztalt(Graphics g). Jak można ją inaczej rozwinąć tzn., gdy zmieniam rozmiar okna to za każdym razem jest tworzona nowa tablica typu Punkt, wydaje mi się że jest to spowodowane wywoływaniem metody void paintComponent(Graphics g) która jest za każdym razem wywoływana automatycznie do rysowania komponentu na którym znajduję się linia w górnym lewym rogu, ponieważ w jej wnętrzu jest tworzona nowa zmienna obiektowa, a raczej po wywołaniu metody rysujKształt(Graphics g) ponieważ w jej wnętrzu jest tworzona zmienna obiektowa klasy abstrakcyjnej. Mam nadzieje, że udało mi się sformułować w miare sensownie pytania.
POZDRAWIAM

Kod programu:

package zadanie;

import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class Zadanie {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		EventQueue.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				ZadanieRamka ramka = new ZadanieRamka();
				ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				ramka.setVisible(true);
			}
		});
	}

}

//-----------------Klasa Punkt-------------------
class Punkt {
	private int wX;
	private int wY;
	
	public Punkt(int x, int y) {
		wX = x;
		wY = y;
	}		
	
	//getery
	public int getwX() {
		return wX;
	}
	
	public int getwY() {
		return wY;
	}

}

//--------------------Klasa Ksztalt-------------------
abstract class Ksztalt {
	private Punkt[] tabPunkt;
	
	//Zmienic konstruktor!!
	public Ksztalt(int n, int x, int y) {
		
		if(tabPunkt == null) {
			
			tabPunkt = new Punkt[n];
			for(int i = 0; i < tabPunkt.length; i++) {
				System.out.println("Rozmiar tablicy: " + tabPunkt.length + " i: " + i);
				tabPunkt[i] = new Punkt(x, y);
				x += 5;
				y += 10;
			}
		}
	}
	
	//Metoda abstrakcyjna
	public abstract void rysujKsztalt(Graphics g);
	
	public Punkt pobierzPunkt(int nr) {
		
		Punkt pobranyPunkt;
		
		for(int i = 0; i < tabPunkt.length; i++) {
			if(i == nr) {
				pobranyPunkt = tabPunkt[i];
				return(pobranyPunkt); //???
			} else 
				if(nr > tabPunkt.length) {
					 new Exception("Nie ma takiego punktu o nr: " + nr);
				}
		}
		return null;
	}
}

//------------------Klasa Odcinek---------------------
class Odcinek extends Ksztalt {
	
	private Ksztalt odcinek;
	private int lp;
	private int wspX;
	private int wspY;
	
	public Odcinek(int lp, int wspX, int wspY) {
		
		super(lp, wspX, wspY);
		this.lp = lp;
		this.wspX = wspX;
		this.wspY = wspY;
	}
	
	@Override
	public void rysujKsztalt(Graphics g) {
		odcinek = new Odcinek(lp, wspX, wspY);
		
		g.drawLine(odcinek.pobierzPunkt(0).getwX(), odcinek.pobierzPunkt(0).getwY(),
				odcinek.pobierzPunkt(1).getwX(), odcinek.pobierzPunkt(1).getwY());
		}
}

class ComponentPane extends JComponent {
	
	private Ksztalt testOdcinek;
	
	public ComponentPane() {
		testOdcinek = new Odcinek(2, 0, 0);
	}
	
	public void paintComponent(Graphics g) {
		testOdcinek.rysujKsztalt(g);
		
	}
}

//----------------Wyświetlenie okna-----------------
class ZadanieRamka extends JFrame {
	
	public ZadanieRamka() {
		setTitle("ZadanieRamka");
		setSize(200, 200);
		
		//Dodanie panelu do ramki
		ComponentPane comp = new ComponentPane();
		add(comp);
	}
}

/*
//---------------Klasa Prostokat-----------------------
class Prostokat extends Ksztalt {
	
	public Prostokat() {
		super();
	}

	@Override
	public void rysujKsztalt(Graphics g) {
		
	}
}

//---------------Klasa Trojkat------------------------
class Trojkat extends Ksztalt {

	public Trojkat() {
		super();
	}

	@Override
	public void rysujKsztalt(Graphics g) {
		
	}
	
}
*/ 

Mam nadzieje, że przyda się ten kod programu założycielowi postu, bo z tego co widzę nie ma już zainteresowania.
POZDRAWIAM

POPRAWIONY KOD:

 
import java.awt.EventQueue;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Zadanie {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		EventQueue.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				ZadanieRamka ramka = new ZadanieRamka();
				ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				ramka.setVisible(true);
			}
		});
	}

}

//-----------------Klasa Punkt-------------------
class Punkt {
	private int wX;
	private int wY;
	
	public Punkt(int x, int y) {
		wX = x;
		wY = y;
	}		
	
	//getery
	public int getwX() {
		return wX;
	}
	
	public int getwY() {
		return wY;
	}

}

//--------------------Klasa Ksztalt-------------------
abstract class Ksztalt {
	private Punkt[] tabPunkt;
	private Random aRandom;
	private int liczbaP;
	private int x;
	private int y;
	
	//Zmienic konstruktor!!
	public Ksztalt(int n, int aX, int aY) {
		aRandom = new Random();
		this.liczbaP = n;
		this.x = aX;
		this.y = aY;
		
		if(tabPunkt == null) {
			if(liczbaP > 0) {
				tabPunkt = new Punkt[liczbaP];
				for(int i = 0; i < tabPunkt.length; i++) {
					System.out.println("Rozmiar tablicy: " + tabPunkt.length + " i: " + i);
					tabPunkt[i] = new Punkt(x, y);
					
					int ranX = aRandom.nextInt(ZadanieRamka.WIDTH_OKNA);
					int ranY = aRandom.nextInt(ZadanieRamka.HEIGHT_OKNA);
					x += ranX;
					y += ranY;
					System.out.println("x :" + x + " y:" + y);
				}
			} else 
				//Pierwszy indeks tablicy zaczyna się od 0
				if(liczbaP <= 0) {
					System.out.println("Za mała liczba punktów do narysowania kształtu.");
				}
		}
	}
	
	//Metoda abstrakcyjna
	public abstract void rysujKsztalt(Graphics g);
	
	public Punkt pobierzPunkt(int nr) throws Exception {
		Punkt pobranyPunkt;
		for(int i = 0; i < tabPunkt.length; i++) {
			if(i == nr) {
				pobranyPunkt = tabPunkt[i];
				return(pobranyPunkt);
			} 
		}
		return null;
	}
	
}

//------------------Klasa Odcinek---------------------
class Odcinek extends Ksztalt {

	public Odcinek(int lp, int wspX, int wspY) {
		super(lp, wspX, wspY);
	}
	
	@Override
	public void rysujKsztalt(Graphics g) {
		//Za pomoca operatora this odnosimy się to tego obiektu(Odcinek)
		try {
			g.drawLine(this.pobierzPunkt(0).getwX(), this.pobierzPunkt(0).getwY(),
					this.pobierzPunkt(1).getwX(), this.pobierzPunkt(1).getwY());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("Nie ma takiego punktu!");
			e.printStackTrace();
		}
		}
}

//---------------Klasa Prostokat-----------------------
class Prostokat extends Ksztalt {
	
	public Prostokat(int lp, int wspX, int wspY) {
		super(lp, wspX, wspY);
	}

	@Override
	public void rysujKsztalt(Graphics g) {
		try {
			g.drawRect(this.pobierzPunkt(0).getwX(), this.pobierzPunkt(0).getwY(), 100, 150);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("Nie ma takiego punktu!");
			e.printStackTrace();
		}
	}
}

//---------------Klasa Trojkat------------------------
class Trojkat extends Ksztalt {
	private int x0;
	private int y0;
	private int x1;
	private int y1;
	private int x2;
	private int y2;
	
	public Trojkat(int lp, int wspX, int wspY) {
		super(lp, wspX, wspY);
		try {
			x0 = this.pobierzPunkt(0).getwX();
			y0 = this.pobierzPunkt(0).getwY();
			x1 = this.pobierzPunkt(1).getwX();
			y1 = this.pobierzPunkt(1).getwY();
			x2 = this.pobierzPunkt(2).getwX();
			y2 = this.pobierzPunkt(2).getwY();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("Nie ma takiego punktu!");
			e.printStackTrace();
		}
	}

	@Override
	public void rysujKsztalt(Graphics g) {
		g.drawLine(x0, y0, x1, y1);
		g.drawLine(x1, y1, x2, y2);
		g.drawLine(x2, y2, x0, y0);
	}
	
}

class ComponentPane extends JPanel {
	
	private Ksztalt testOdcinek = new Odcinek(2, 45, 54);
	private Ksztalt testProstokat = new Prostokat(1, 23, 54);
	private Ksztalt testTrojkat = new Trojkat(3, 10, 15);


public void paintComponent(Graphics g) {
		testOdcinek.rysujKsztalt(g);
		testProstokat.rysujKsztalt(g);
		testTrojkat.rysujKsztalt(g);
	}
}

//----------------Wyświetlenie okna-----------------
class ZadanieRamka extends JFrame {
	
	public static int WIDTH_OKNA = 350;
	public static int HEIGHT_OKNA = 300;
	public ZadanieRamka() {
		setTitle("ZadanieRamka");
		setSize(WIDTH_OKNA, HEIGHT_OKNA);
		
		//Dodanie panelu do ramki
		ComponentPane comp = new ComponentPane();
		add(comp);
	}
}

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