Documente Academic
Documente Profesional
Documente Cultură
LUCRAREA NR. 6
Interfețe grafice cu utilizatorul. Swing.
1. Scopul lucrării
Această lucrare de laborator prezintă modul de realizare a unei interfețe grafice utilizator folosind
pachetul java.swing. Se vor prezenta câteva programe demonstrative ce cuprind și tratarea
evenimentelor ce sunt generate de componentele grafice.
Scopul este de a crea o animație simplă în care un cerc se mișcă pe o fereastră din colțul din
stânga-sus în colțul din dreapta-jos.
Pașii:
• Desenăm un obiect în punctul de coordonate x și y
g.fillOval (20, 50, 100, 100);
// 20 de pixeli față de marginea din stânga, 50 de pixeli față de marginea de sus
• Redesenezi obiectul într-un punct cu alte coordonate x și y
g.fillOval( 25, 55, 100, 100);
// 25 de pixeli față de marginea din stânga, 55 de pixeli față de marginea de sus
(obiectul se mișcă puțin către dreapta și în jos
• Repetăm pasul anterior, modificând valorile x și y atât timp cât trrebuie să continue
animația.
package lab6Swing;
import javax.swing.*;
import java.awt.*;
1
Laborator Programare Java Lucrarea nr. 6
gui.go();
}
frame.getContentPane().add(drawPanel);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
}
Această aplicație reprezintă o parte dintr-o aplicație mai complexă ce va fi finalizată într-un laborator
următor. Aplicația va fi numită MașinaMuzicală ce va permite trimiterea de secvențe muzicale prin
2
Laborator Programare Java Lucrarea nr. 6
rețea, la fel ca într-o cameră de discuții (char room). Pentru început vom realiza o interfață grafică în
care se desenează aleator în ritmul muzicii.
Pentru a construi o astfel de aplicație ne sunt necesare câteva cunoștințe legate de biblioteca
JavaSound, care va fi descrisă în continuare.
Biblioteca JavaSound este o colecție de clase și interfețe adăugate începând cu versiune 1.3.
Biblioteca JavaSound este împărțită în două categorii: MIDI și Sampled. Pentru exemplu propus vom
folosi numai MIDI. MIDI este acronimul de la Musical Instrument Digital Interface și reprezintă un
protocol standard, care permite comunicarea între diferite dispozitive de sonorizare electronice. Din
punctul de vedere al aplicației MașinaMuzicală se poate considera că MIDI este un fel de partitură
muzicală pe care o introducem într-un pian electronic. Altfel spus, datele MIDI nu conțin nici un sunet,
ci doar instrucțiuni ce pot fi folosite de un instrument care recunoaște protocolul MIDI pentru redarea
unor sunete. Pentru obținerea sunetelor propriu-zise, avem nevoie de un instrument care poate să
citească și să redea fișierul MIDI. Instrumentul poate fi unul fizic sau unul software. Pentru aplicația
noastră vom folosi instrumental integrat în Java. Acesta se numește sintetizator, deoarece creează
sunete. Înainte de a putea reda vreun sunet avem nevoie de un obiect Sequencer (generator de
secvențe). Acesta este un obiect care preia datele MIDI și le trimite către instrumentele
corespunzătoare. Îl vom folosi pentru redarea muzicii. Clasa Sequencer face parte din pachetul
javax.sound.midi.
Avem nevoie de 4 lucruri:
• Dispozitivul care redă muzica
- Acesta este secvențiatorul (un obiect Sequencer)
• Muzica pe care trebuie să o redai (o melodie)
- Secvența este melodia redată de obiectul Sequencer
• Partea dintr-o secvență care conține informațiile propriu-zise
- O pistă este locul în care sunt păstrate toate datele melodiei
• Informațiile muzicale propriu-zise: notele muzicale, durata etc.
- Un eveniment MIDI este un mesaj pe care-l poate înțelege obiectul Sequencer.
Obs. Ne putem imagina că secvențiatorul este un CD palyer, secvența este un CD cu o singură
melodie ( cu o singură pistă). Informațiile despre redarea melodiei sunt stocate în pistă, iar pista face
parte dintr-o secvență.
Pașii parcurși:
• Obții un obiect Sequencer și îl deschizi
3
Laborator Programare Java Lucrarea nr. 6
Metoda setMessage
a.setMessage(144, 1, 44, 100);
- Primul argument: tipul mesajului (144 înseamnă NOTE ON, 128 înseamnă NOTE OFF)
- Al doilea argument: canalul (de ex, un muzician dintr-o formație, canalul 1 înseamnă
muzicianul 1 (toboșarul, de ex) etc.)
4
Laborator Programare Java Lucrarea nr. 6
- Al treilea argument: nota care trebuie redată ( un număr între 0 și 127, de la notele
joase la cele înalte)
- Al patrulea argument: viteza ( cât de repede și de tare trebuie apăsată clapa, de ex)
Programul muzical-artistic:
• Creează o serie de mesaje (evenimente MIDI) pentru redarea unor note aleatorii la pian
(sau la alt instrument ales)
• Înrregistrează un obiect Listener pentru evenimente
• Pornește redarea melodiei, cu ajutorul secvențiatorului
• De fiecare dată când este apelată metoda de tratare a evenimentului din obiectul Listener,
desenează un dreptunghi aleatoriu în panoul de desen și apelează metoda repaint( ).
Codul complet al aplicației este mai jos:
package lab6Swing;
import javax.sound.midi.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
public class MiniMusicPlayer {
static JFrame f = new JFrame("Video muzical ");
static MyDrawPanel ml;
5
Laborator Programare Java Lucrarea nr. 6
int r = 0;
for (int i = 0; i < 60; i+= 4) {
r = (int) ((Math.random() * 50) + 1);
track.add(makeEvent(144,1,r,100,i));
track.add(makeEvent(176,1,127,0,i));
track.add(makeEvent(128,1,r,100,i + 2));
} //sfarsit for
// adauga evenimentul la pista
sequencer.setSequence(seq);
sequencer.start();
sequencer.setTempoInBPM(120);
} catch (Exception ex) {ex.printStackTrace();}
}
public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
MidiEvent event = null;
try {
ShortMessage a = new ShortMessage();
a.setMessage(comd, chan, one, two);
event = new MidiEvent(a, tick);
}catch(Exception e) { }
return event;
}
class MyDrawPanel extends JPanel implements ControllerEventListener {
// initializam cu false si ii vom atribui true atunci cand primim un eveniment
boolean msg = false;
6
Laborator Programare Java Lucrarea nr. 6
• Construim o interfață grafică cu 256 de casete de validare (JCheckBox) care inițial sunt
neselectate, 16 etichete (JLabel) pentru numele instrumentelor și patru butoane (JButton).
• Înregistrăm un obiect ActionListener pentru fiecare dintre cele patru butoane. Așteptăm până
când utilizatorul apasă butonul Start, apoi parcurgem toate cele 256 de casete de validare, le
citim starea și construim o pistă MIDI.
• Configurăm sistemul MIDI, inclusiv obținerea unui obiect Sequencer, crearea unei secvențe și
crearea unei piste. Folosim metoda setLoopCount, adăugată în versiunea 5, această metodă
ne permite să specificăm de câte ori vrem să fie reluată o secvență. De asemenea, folosim
factorul de tempo al secvenței pentru creșterea sau scăderea ritmului de redare și pentru
păstrarea aceluiași tempo de la o iterație a ciclului la următoarea.
• După apăsarea butonului Start, metoda de tratarea a evenimentelor pentru acest buton
apelează metoda buildTrackAndStart( ). În această metodă parcurgem cele 256 de casete de
validare, le obținem starea și folosim aceste informații pentru a construe o pistă MIDI ( cu
ajutorul metodeI makeEvent( ) ) . După construirea pistei, pornim secvențiatorul, care redă
continuu melodia (deoarece parcurgem secvența cyclic) până când utilizatorul apasă butonul
Stop.
Codul aplicației este dat mai jos:
import java.awt.*;
import javax.swing.*;
import javax.sound.midi.*;
import java.util.*;
import java.awt.event.*;
JPanel mainPanel;
ArrayList<JCheckBox> checkboxList; // stocam casetele de validare intr-un ArrayList
Sequencer sequencer;
Sequence sequence;
Track track;
JFrame theFrame;
// numele instrumentelor, ca matrice String, pentru construirea etichetelor
String[] instrumentNames = { "Bass Drum", "Closed Hi-Hat", "Open Hi-Hat", "Acoustic
Snare", "Crash Cymbal",
7
Laborator Programare Java Lucrarea nr. 6
int[] instruments = { 35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58, 47, 67,
63 };
background.add(BorderLayout.EAST, buttonBox);
background.add(BorderLayout.WEST, nameBox);
theFrame.getContentPane().add(background);
8
Laborator Programare Java Lucrarea nr. 6
grid.setVgap(1);
grid.setHgap(2);
mainPanel = new JPanel(grid);
background.add(BorderLayout.CENTER, mainPanel);
// creare casete de validare, inizializarea lor cu valoarea false (ca sa nu fie selectate)
//si adaugarea lor in lista ArrayList si panoul GUI
for (int i = 0; i < 256; i++) {
JCheckBox c = new JCheckBox();
c.setSelected(false);
checkboxList.add(c);
mainPanel.add(c);
}
setUpMidi();
} catch (Exception e) {
e.printStackTrace();
}
}
9
Laborator Programare Java Lucrarea nr. 6
trackList[j] = key;
} else {
trackList[j] = 0;
}
}
// pentru acest instrument si pt toate cele 16 masuri creeaza
evenimentele si le
// adauga la pista //melodiei
makeTracks(trackList);
track.add(makeEvent(176, 1, 127, 0, 16));
}
//
track.add(makeEvent(192, 9, 1, 0, 15));
try {
sequencer.setSequence(sequence);
//specificam nr de iteratii ale ciclului, in acest caz secventa va fi rulata continuu
sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
sequencer.start();
sequencer.setTempoInBPM(120);
} catch (Exception e) {
e.printStackTrace();
}
}
// creeaza evenimentele pentru un instrument la un moment dat, pentru toate cele 16 masuri
10
Laborator Programare Java Lucrarea nr. 6
if (key != 0) {
track.add(makeEvent(144, 9, key, 100, i));
track.add(makeEvent(128, 9, key, 100, i + 1));
}
}
}
public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
MidiEvent event = null;
try {
ShortMessage a = new ShortMessage();
a.setMessage(comd, chan, one, two);
event = new MidiEvent(a, tick);
} catch (Exception e) {
e.printStackTrace();
}
return event;
}
1. Scrieți un program care afișează într-o fereastră toate fonturile disponibile pe platforma
folosită.
2. Scrieți o aplicație care desenează un cerc care își schimbă culoarea de fiecare dată când
utilizatorul execută clic pe buton.
11