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:

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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.

 

www.informatika-programozas.hu - Hang (sound)

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!
 

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:
 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 



 

 

 

 

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


www.informatika-programozas.hu - Hang (sound)