Java - Grafika - Příklady (63.díl)

Napsal O webu (») 12. 10. 2008 v kategorii Programování, přečteno: 4823×
obrazky/java_logo.pngPříklad 3. V následujícím příkladu se budeme pokoušet vytvořit program, který bude generovat úsečky s náhodnými hodnotami souřadnic koncových bodů a náhodnou hodnotou barvy. Souřadnice jednotlivých počátečních a koncových bodů budeme ukládat do dynamické datové struktury ArrayList. Počet úseček je znám předem, výpočet tedy proběhne v cyklu for. Při návrhu struktury tříd použijeme princip kompozice a to na základě úvahy Má úsečka nějaké body?

Nejprve vytvoříme třídu Bod, bude obsahovat dvě datové položky představující souřadnice x, y bodu.
public class Bod {
private int x,y;
public Bod(int x, int y) {
this.x=x;
this.y=y;
}
}

Úsečku budou tvořit počáteční a koncový bod, bude mít uloženy informace o barvě. Nové instance třídy Usecka budou vytvářeny za použití explicitního konstruktoru, každé úsečka si nese informace o svých krajních bodech a barvě. Aby bylo možno úsečky možno v cyklu vykreslit, ve třídě jsou implementovány metody (tj. gettery) vracející informace o počátečním, koncovém bodě a barvě úsečky.
public class Usecka {
private Bod start, end;
private Color col;
public Usecka(int x1, int y1, int x2, int y2, Color col) {
this.start=new Bod (x1, y1);
this.end=new Bod (x2, y2);
this.col=col;
}
public Bod getStart(){return this.start;}
public Bod getEnd(){return this.end;}
public Color getColor(){return this.col;}
}

Vlastní generování úseček provádí ve svém konstruktoru třída Generovani. Jako formální parametry jsou explicitnímu konstruktoru předávány následující údaje: počet úseček, šířka a výška JPanelu.Vygenerované úsečky jsou ukládány do ArrayListu typu Usecky. Pro generování náhodných čísel použijeme statickou metodu random(), která se nachází ve třídě Math. Ve třídě jsou dále implementovány metody vracejícící počet vygenerovaných úseček a jednu úsečku.
public class Generovani {
private ArrayList <Usecka> u;
public Generovani(int kolik, int width, int height) {
u=new ArrayList <Usecka>();
for (int i=0; i<kolik;i++)
{
int x1=(int)(random()*width);
int y1=(int)(random()*width);
int x2=(int)(random()*width);
int y2=(int)(random()*width);
Color col=new Color((int)(random()*255),
(int)(random()*255), (int)(random()*255));
u.add(new Usecka(x1,y1,x2,y2,col));
}
}
public Usecka getUsecka(int index) {return this.u.get(index);}
public int getPocet(){return u.size();}
}

Vykreslení bude probíhat v předefnované metodě paintComponent() třídy Draw, která je potomkem třídy JComponent. V konstruktoru třídě předáváme odkaz na instanci třídy Generovani obsahující ArrayList. Vykreslování probíhá po jednotlivých položkách.
public class Draw extends JComponent{
Generovani gen;
public Draw(Generovani gen) {
this.gen=gen;
}
public void paintComponent(Graphics g)
{
for (int i=0;i<gen.getPocet();i++)
{
Usecka u=gen.getUsecka(i);
g.setColor(u.getColor());
g.drawLine(u.getStart().getX(),u.getStart().getY(),
u.getEnd().getX(), u.getEnd().getY());
}
}
}

Ve třídě Main, která je potomkem třídy JFrame se postaráme o vytvoření potřebných formulářů. Vytvoříme novou instanci g třídy Generovani a inicializujeme ji vhodnými parametry. V dalším kroku vytvoříme novou instanci třídy Draw, předáme ji jako parametr odkaz na instanci g třídy, instanci třídy Draw přidáme na JPanel za použití metody add(). Celý panel poté přidáme na formulář.
public class Main extends JFrame{
public Main(int width, int height) {
this.setSize(width, height);
this.setTitle("Usecky");
this.setLayout(new GridLayout(1,1));
Generovani g=new Generovani(30,width, height);
JPanel p=new JPanel();
p.setBackground(Color.WHITE);
p.setLayout(new BorderLayout());
p.add(new Draw(g));
this.getContentPane().add(p);
p.add(new Draw(g));
this.setVisible(true);
}
public static void main(String[] args) {
new Main(400,200);
}
}


Příklad by dále bylo možno vylepšit přidáním tlačítka generujícího po každém stisku novou posloupnost úseček. Na formulář bychom přidali tlačítko. Při umisťování na formulář použijeme BorderLayout, panel bude BorderLayout.CENTER,¨tlačítko BorderLayout.SOUTH.
JButton b =new JButton("Generuj");
this.add(b, BorderLayout.SOUTH);
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Generuj(e);
}
});
Metoda Generuj() vypadá takto:
public void Generuj(ActionEvent e)
{
g=new Generovani(30,width, height);
p=new JPanel();
p.setBackground(Color.WHITE);
p.setLayout(new BorderLayout());
p.add(new Draw(g));
this.getContentPane().add(p,BorderLayout.CENTER);
p.add(new Draw(g));
this.setVisible(true);
}

Autor: Filip Koval
Štítky: Java
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Milan z IP 88.103.234.*** | 4.5.2013 23:46
Vám tady skoro nic nefunguje fakt na pi.. stránka chudáci lidi co se tady uči.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel nula a dvanáct