Sunteți pe pagina 1din 6

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII

AL REPUBLICII MOLDOVA
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică şi Microelectronică
Departamentul Informatică şi Ingineria Sistemelor

Raport
pentru lucrarea de laborator Nr.6

la cursul de “Tehnici Avansate de Programare”

Verificat:
Osovschi M., lector universitar,
Departamentul Informatică şi IS,
Facultatea FCIM, UTM

Elaborat:
Studenta gr.CR-191,
Popov Biatrice-Maria

Chișinău – 2021
Tema lucrării: Crearea interfețelor grafice în baza tehnologiei JavaFX

Scopul lucrării
 Însuşirea modalităților de creare și realizare a interfețelor în Java utilizând tehnologia JavaFX

Obiectivele urmărite:
 Crearea interfeței programului
 Crearea obiectelor grafice

 Prezentarea lucrării

Problema 5
Să se reprezinte în ferestră un segment, ce se rotește în planul ecranului în jurul unuia din
punctele finale ale lui. Segmentul trebui să-şi schimbe culoarea de la un pas la altul.

Codul programului:
import java.awt.Color;
import java.awt.Graphics;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import java.util.Random;

public class ClockGui extends JFrame {


private static JFrame frame;
private static final int spacing = 15; //distanta dintre cifre
de la centrul ceasului
private static final float radPerNum = (float)(Math.PI/ -6);
//unghiul dintre fiecare numar este de 30 de grade (pi/-6)
private int size;
private int centerX;
private int centerY;
Random random;
Calendar cal;
int hour;
int minute;
int second;
Color colorSecond,colorMHour,colorNumber;
Timer timer;
public static void main(String args[]){
frame = new ClockGui();
frame.setTitle("Prototipul unui ceas");
frame.setVisible(true);
}
public ClockGui() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(700, 100, 400, 430);
getContentPane().setBackground(new Color(212, 234, 255));
timer = new Timer();
timer.schedule(new TickTimerTask(), 0, 1000); //rotirea
secundamerului pe 1 secunda
}

//Clasa TimerTask definește o sarcină care poate fi programată să


ruleze doar o dată sau pentru un număr repetat de timp
class TickTimerTask extends TimerTask {
@Override
public void run()
{
repaint();
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
size = 400 - spacing; // stabilirea marimii ceasului
centerX = 400/2; // stabilirea coordonatei X pentru centrul
ferestrei
centerY = 400/2+25; // stabilirea coordonatei y pentru
centrul ferestrei

drawNumberClock(g); //apelarea functiei de generare a


cifrelor ceasului
//generarea orei actuale
cal = Calendar.getInstance();
hour = cal.get(Calendar.HOUR);
minute = cal.get(Calendar.MINUTE);
second = cal.get(Calendar.SECOND);

//desenarea acelor ceasului

drawHands(g,hour,minute,second,colorSecond.RED,colorMHour.BLACK);}
//metoda de generare a cifrelor ceasornicului conform acelor de
rotație
private void drawNumberClock(Graphics g) {
for(int num=12;num>0;num--){
drawnum(g,radPerNum*num,num);
}}
//metoda de pozitionare a cifrelor
private void drawnum(Graphics g, float angle,int n) {
float sine = (float)Math.sin(angle);
float cosine = (float)Math.cos(angle);
int dx = (int)((size/2-20-25) * -sine);
int dy = (int)((size/2-20-25) * -cosine);
g.drawString(""+n,dx+centerX-5,dy+centerY+5);
}

//metoda de calculare a secundelor, minutelor si orelor și


miscarea acestora corespunzator
private void drawHands(Graphics g, double hour, double minute,
double second, Color colorSecond, Color colorMHour) {
double rsecond = (second*6)*(Math.PI)/180;
double rminute = ((minute + (second / 60)) * 6) * (Math.PI)
/ 180;
double rhours = ((hour + (minute / 60)) * 30) * (Math.PI) /
180;
random = new Random();
g.setColor(new Color(random.nextInt(255),
random.nextInt(255), random.nextInt(255)));
g.drawLine(centerX, centerY, centerX + (int) (150 *
Math.cos(rsecond - (Math.PI / 2))), centerY + (int) (150 *
Math.sin(rsecond - (Math.PI / 2))));
g.setColor(colorMHour);
g.drawLine(centerX, centerY, centerX + (int) (120 *
Math.cos(rminute - (Math.PI / 2))), centerY + (int) (120 *
Math.sin(rminute - (Math.PI / 2))));
g.drawLine(centerX, centerY, centerX + (int) (90 *
Math.cos(rhours - (Math.PI / 2))), centerY + (int) (90 *
Math.sin(rhours - (Math.PI / 2))));
}
}
Rezultatele obținute în consolă:

Concluzie:
Din motiv că codul programului pentru varianta mea (varianta 5) era în documentul cu
condițiile laboratorului, am decis să adaug careva elemente de interfață pentru a amplifica sarcina. De
aceea, am căutat un domeniu unde s-ar folosi un segment ce se rotește în jurul unuia din punctele sale
extreme și am ajuns la concluzia să creez cu ajutorul interfeței grafice în java un prototip al unui ceas a
cărui secundamer își schimbă culoarea la fiecare rotație. Am învățat noi clase predefinite și metode ale
acestora și deasemenea nou cunoștințe în programarea unei interfețe.