Gyakorlati alapok IV.
Végre ablakozunk! (AWT, Swing, JavaFX)
Hang (sound)
Ebben a rövid fejezetben egy alapszintű hanginzertálást implementálunk,
természetesen SWING-eszközök segítségével. Célunk ezzel, hogy a későbbiekben,
először a
Final Countdowner című fejezetben kidolgozott visszaszámláló
alkalmazás futtatásakor a végidő pillanatát ne csak számokkal, valamint
segédablakkal, hanem hangjelzéssel is jelezzük. A logikai alapfunkciók
megszokott módon külön osztályban futnak, ezért a hangért felelős rutinok egy
szintén különálló, Sound osztályba szervezettek.
Oktatási szempontból ebben a fejezetben voltaképpen ez az osztály az egyedüli
újdonság. Nem tagadom, hogy a kód (részben) az Internetről származik, de nem
probléma ez: a kötelező forrásmegjelölés figyelembevételével sok programozó
szereti, ha felhasználják implementációikat. Másrészről pedig ismerjük a jól
ismert mondást:
A junior és senior programozó közt csupán az a különbség, hogy az utóbbi jobban keres az Interneten.
Implementációs szempontból a hangért felelős osztály monolit egységet alkot;
ha gyorsan akarjuk a hanglejátszás problémáját megoldani, akkor tehát érdemes
így felhasználnunk. Megjegyzem: a sokféle találat közt ez az egyetlen volt az
azonnal működő kódegység.
Nézzük meg a Sound osztály kódját:
public class Sound {
public void play(String audioFilePath) {
File audioFile = new File(audioFilePath);
try {
AudioInputStream audioStream =
AudioSystem.getAudioInputStream(audioFile);
AudioFormat format =
audioStream.getFormat();
DataLine.Info info = new
DataLine.Info(Clip.class, format);
Clip audioClip =
(Clip)AudioSystem.getLine(info);
audioClip.open(audioStream);
audioClip.start();
} catch (Exception e) {
JOptionPane.showMessageDialog(new
Window().frame, "Something wrong with the sound!");
}
}
}
A kivételkezelés hibaüzenetét egy, a Window
osztály frame objektumából keletkező üzenetablak
jeleníti meg. Ezt
névtelen osztály (new Window().frame)
segítségével hoztuk létre.
Figyelem! A WAV file lejátszásához nyilvánvalóan először létre kell hozni azt, majd elérési útvonalát be kell állítani:
String audioFilePath = "E:/countdown.wav";
Nézzük meg a futtatható Java-kódot:
Main.java
public class
Main {
public static void main(String[] args) {
Window window = new Window();
}
}
Window.java
import javax.swing.*;
class Window extends JFrame {
JFrame frame = new JFrame();
JButton buttonPlay = new JButton("Play it!");
String audioFilePath = "E:/countdown.wav";
Sound sound = new Sound();
Window() {
super();
buttonPlay.setBounds(90, 100, 200, 20);
buttonPlay.addActionListener(event -> buttonActionPlay());
frame.add(buttonPlay);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Center center = new Center();
frame.setSize(400, 300);
frame.setTitle("PJP - Penzes Java Programming");
center.setCenter(frame);
frame.setLayout(null);
frame.setVisible(true);
}
private void buttonActionPlay() {
sound.play(audioFilePath);
}
}
Sound.java
import java.io.File;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
public class Sound {
public void play(String audioFilePath) {
File audioFile = new File(audioFilePath);
try {
AudioInputStream audioStream =
AudioSystem.getAudioInputStream(audioFile);
AudioFormat format =
audioStream.getFormat();
DataLine.Info info = new
DataLine.Info(Clip.class, format);
Clip audioClip =
(Clip)AudioSystem.getLine(info);
audioClip.open(audioStream);
audioClip.start();
} catch (Exception e) {
JOptionPane.showMessageDialog(new
Window().frame, "Something wrong with the sound!");
}
}
}
Center.java
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import javax.swing.JFrame;
public class Center {
void setCenter(JFrame frame) {
Point center =
GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
int x = (int) center.getX() - (frame.getWidth() / 2);
int y = (int) center.getY() - (frame.getHeight() / 2);
Point ablakCenter = new Point(x, y);
frame.setLocation(ablakCenter);
}
}
Végeredmény (a monitor közepén / felbontástól függetlenül/):
A Play it! gomb megnyomására hanglejátszás