/*****************************************************************
* Opdracht:
*
* - 3 knoppen Sorteren dienen opnieuw geactiveerd te worden
* - knop shuffle opnieuw activeren
* - dubbel klik op een liedje in de linkse tabel --> liedje komt rechts in de playlist
*
*****************************************************************/
package Main;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;
import Model.Song;
import Model.SongLijst;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.scene.media.Media;
@SuppressWarnings("serial")
public class MainApp extends JFrame {
JTable tabelLinks;
JTable tabelRechts;
JButton knopToevoegen;
JButton knopVerwijderen;
JButton knopShuffle;
JButton knopSorterenOpTitel;
JButton knopSorterenOpArtist;
JButton knopSorterenOpAlbum;
JButton knopKiesMuziekBasismap;
JButton knopPlay;
JButton knopPauze;
JFileChooser fileChooser;
JLabel label_volume;
JSlider slider_volume;
JLabel label_navigatie;
JSlider slider_navigatie;
JLabel label_tijd;
File dir;
SongLijst sl;
MediaPlayer m;
double volume = 0.5;
boolean paused = false;
public MainApp() {
new javafx.embed.swing.JFXPanel(); // nodige initialisatie om de javaFX mediaplayer te kunnen gebruiken in Swing
sl = new SongLijst();
dir = new File("music");
sl.init(dir);
sl.sorteerOpArtist();
sl.sorteerOpAlbum();
sl.sorteerOpTitel();
// maak het modelLinks
DefaultTableModel modelLinks = new DefaultTableModel() {
// maak niet editeerbaar
public boolean isCellEditable(int row, int column) {
return false;
}
};
modelLinks.addColumn("Titel");
modelLinks.addColumn("Artist");
modelLinks.addColumn("Album");
modelLinks.addColumn("File");
// maak het modelRechts
DefaultTableModel modelRechts = new DefaultTableModel() {
// maak niet editeerbaar
public boolean isCellEditable(int row, int column) {
return false;
}
};
modelRechts.addColumn("Titel");
modelRechts.addColumn("Artist");
modelRechts.addColumn("Album");
modelRechts.addColumn("File");
// vul gegevens in voor modelLinks
for (Song s : sl.getLijst()) {
modelLinks.addRow(new Object[] { s.getTitel(), s.getArtist(), s.getAlbum(), s.getFile() });
}
// maak tabelLinks met schuifbalk
tabelLinks = new JTable(modelLinks);
tabelLinks.setColumnSelectionAllowed(false);
tabelLinks.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabelLinks.getColumnModel().getColumn(0).setPreferredWidth(188);
tabelLinks.getColumnModel().getColumn(1).setPreferredWidth(188);
tabelLinks.getColumnModel().getColumn(2).setPreferredWidth(188);
tabelLinks.removeColumn(tabelLinks.getColumnModel().getColumn(3));
JScrollPane scrollTabelLinks = new JScrollPane(tabelLinks);
scrollTabelLinks.setPreferredSize(new Dimension(570, 700));
// maak tabelRechts met schuifbalk
tabelRechts = new JTable(modelRechts);
tabelRechts.setColumnSelectionAllowed(false);
tabelRechts.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabelRechts.getColumnModel().getColumn(0).setPreferredWidth(188);
tabelRechts.getColumnModel().getColumn(1).setPreferredWidth(188);
tabelRechts.getColumnModel().getColumn(2).setPreferredWidth(188);
tabelRechts.removeColumn(tabelRechts.getColumnModel().getColumn(3));
JScrollPane scrollTabelRechts = new JScrollPane(tabelRechts);
scrollTabelRechts.setPreferredSize(new Dimension(570, 700));
// hoofdpanel
JPanel panelHoofd = new JPanel(new BorderLayout());
// panel voor de knoppen bovenaan
JPanel panelBoven = new JPanel();
panelBoven.setLayout(new BoxLayout(panelBoven, BoxLayout.LINE_AXIS));
knopSorterenOpTitel = new JButton("Sorteren op Titel ");
knopSorterenOpArtist = new JButton("Sorteren op Artist ");
knopSorterenOpAlbum = new JButton("Sorteren op Album ");
knopKiesMuziekBasismap = new JButton("Kies bibliotheek");
knopPlay = new JButton(">");
knopPauze = new JButton("||");
slider_volume = new JSlider(JSlider.HORIZONTAL, 0, 100, (int) (volume * 100)); // horizontaal, min, max,
// startpositie
slider_navigatie = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); // vertikaal, min, max, startpositie
label_volume = new JLabel("Volume :");
label_navigatie = new JLabel("Navigatie :");
label_tijd = new JLabel("");
panelBoven.add(knopSorterenOpTitel);
panelBoven.add(knopSorterenOpArtist);
panelBoven.add(knopSorterenOpAlbum);
panelBoven.add(knopKiesMuziekBasismap);
panelBoven.add(knopPlay);
panelBoven.add(knopPauze);
panelBoven.add(label_volume);
panelBoven.add(slider_volume);
panelBoven.add(label_navigatie);
panelBoven.add(slider_navigatie);
panelBoven.add(label_tijd);
// panel voor de knoppen centraal
JPanel panelCentraal = new JPanel();
panelCentraal.setLayout(new BoxLayout(panelCentraal, BoxLayout.Y_AXIS));
knopToevoegen = new JButton("Toevoegen >>");
knopVerwijderen = new JButton("<< Verwijderen");
knopShuffle = new JButton("Shuffle");
panelCentraal.add(knopToevoegen);
panelCentraal.add(knopVerwijderen);
panelCentraal.add(knopShuffle);
knopToevoegen.setEnabled(false);
knopVerwijderen.setEnabled(false);
// knopToevoegen enable zetten zolang er een selectie links is
tabelLinks.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int count = tabelLinks.getSelectedRowCount();
knopToevoegen.setEnabled(count > 0);
}
});
// knopVerwijderen enable zetten zolang er een selectie rechts is
tabelRechts.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int count = tabelRechts.getSelectedRowCount();
knopVerwijderen.setEnabled(count > 0);
}
});
// event-handler voor knopToevoegen
knopToevoegen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DefaultTableModel fromModel = (DefaultTableModel) tabelLinks.getModel();
DefaultTableModel toModel = (DefaultTableModel) tabelRechts.getModel();
for (int index : tabelLinks.getSelectedRows()) {
Vector rowValue = (Vector) fromModel.getDataVector().get(index);
toModel.addRow(rowValue);
}
tabelLinks.clearSelection();
}
});
// event-handler voor knopVerwijderen
knopVerwijderen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DefaultTableModel fromModel = (DefaultTableModel) tabelRechts.getModel();
int selectedRow = -1;
while ((selectedRow = tabelRechts.getSelectedRow()) != -1) {
fromModel.removeRow(selectedRow);
}
}
});
// event-handler voor knopSorterenOpTitel
knopSorterenOpTitel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sl.sorteerOpTitel();
DefaultTableModel model = (DefaultTableModel) tabelLinks.getModel();
model.setNumRows(0);
for (Song s : sl.getLijst()) {
modelLinks.addRow(new Object[] { s.getTitel(), s.getArtist(), s.getAlbum(), s.getFile() });
}
}
});
// event-handler voor knopSorterenOpArtist
knopSorterenOpArtist.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sl.sorteerOpArtist();
DefaultTableModel model = (DefaultTableModel) tabelLinks.getModel();
model.setNumRows(0);
for (Song s : sl.getLijst()) {
modelLinks.addRow(new Object[] { s.getTitel(), s.getArtist(), s.getAlbum(), s.getFile() });
}
}
});
// event-handler voor knopSorterenOpAlbum
knopSorterenOpAlbum.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sl.sorteerOpAlbum();
DefaultTableModel model = (DefaultTableModel) tabelLinks.getModel();
model.setNumRows(0);
for (Song s : sl.getLijst()) {
modelLinks.addRow(new Object[] { s.getTitel(), s.getArtist(), s.getAlbum(), s.getFile() });
}
}
});
// event-handler voor knopKiesMuziekBasismap
fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
knopKiesMuziekBasismap.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int returnVal = fileChooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
JOptionPane.showMessageDialog(null, "duurt 3 seconden per 10 000 te onderzoeken bestanden",
"Opbouwen muziekbibliotheek", JOptionPane.PLAIN_MESSAGE);
dir = fileChooser.getSelectedFile();
sl.init(dir);
sl.sorteerOpArtist();
DefaultTableModel model = (DefaultTableModel) tabelLinks.getModel();
model.setNumRows(0);
for (Song s : sl.getLijst()) {
model.addRow(new Object[] { s.getTitel(), s.getArtist(), s.getAlbum(), s.getFile() });
}
}
}
});
// event-handler voor knopPlay
knopPlay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DefaultTableModel model = (DefaultTableModel) tabelRechts.getModel();
int selectedRow = tabelRechts.getSelectedRow();
if (!paused) {
if (selectedRow != -1) {
File file = (File) model.getValueAt(selectedRow, 3);
String uriString = file.toURI().toString();
if (m != null)
m.dispose();
m = new MediaPlayer(new Media(uriString));
slider_volume.setValue((int) (volume * 100));
slider_navigatie.setValue(0);
// event-handler om de navigatie-slider te laten schuiven
m.currentTimeProperty().addListener(new InvalidationListener() {
public void invalidated(Observable ov) {
double s = m.getCurrentTime().toSeconds();
slider_navigatie.setValue((int) (s / m.getMedia().getDuration().toSeconds() * 100));
int sec = (int) s;
int uren = sec / 3600;
sec = sec % 3600;
int min = sec / 60;
sec = sec % 60;
label_tijd.setText((uren != 0 ? uren : "") + " " + min + " : " + sec + " ");
}
});
// event-handler voor einde liedje --> start volgend liedje
m.setOnEndOfMedia(new Runnable() {
public void run() {
int selectedRow = tabelRechts.getSelectedRow();
if (selectedRow == tabelRechts.getModel().getRowCount() - 1)
selectedRow = 0;
else
selectedRow++;
tabelRechts.setRowSelectionInterval(selectedRow, selectedRow);
knopPlay.doClick();
}
});
if (m != null)
m.play();
}
} else if (m != null)
m.play();
paused = false;
}
});
// event-handler voor knopPauze
knopPauze.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
paused = true;
if (m != null)
m.pause();
}
});
// event-handler voor slider_volume
slider_volume.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
if (m != null) {
JSlider source = (JSlider) e.getSource();
volume = (double) source.getValue() / 100;
m.setVolume(volume);
}
}
});
// event-handler voor slider_navigatie
slider_navigatie.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider) e.getSource();
if (m != null) {
if (source.getValueIsAdjusting())
m.seek(Duration.seconds(source.getValue() / 100.0 * m.getMedia().getDuration().toSeconds()));
}
}
});
// event-handler voor dubbel klik op liedje rechts om het af te spelen
tabelRechts.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 2) {
paused = false;
knopPlay.doClick();
}
}
});
// event-handler voor dubbel klik op liedje links om het rechts in de playlist
// te krijgen
tabelLinks.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 2) {
DefaultTableModel fromModel = (DefaultTableModel) tabelLinks.getModel();
DefaultTableModel toModel = (DefaultTableModel) tabelRechts.getModel();
for (int index : tabelLinks.getSelectedRows()) {
Vector rowValue = (Vector) fromModel.getDataVector().get(index);
toModel.addRow(rowValue);
}
tabelLinks.clearSelection();
}
}
});
// event-handler voor knopShuffle
knopShuffle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DefaultTableModel model = (DefaultTableModel) tabelRechts.getModel();
Collections.shuffle(sl.getLijst());
model.setNumRows(0);
for (Song s : sl.getLijst()) {
modelRechts.addRow(new Object[] { s.getTitel(), s.getArtist(), s.getAlbum(), s.getFile() });
}
}
});
// laatste initialisaties
panelHoofd.add(panelBoven, BorderLayout.PAGE_START);
panelHoofd.add(scrollTabelLinks, BorderLayout.WEST);
panelHoofd.add(scrollTabelRechts, BorderLayout.EAST);
panelHoofd.add(panelCentraal, BorderLayout.CENTER);
this.getContentPane().add(panelHoofd);
this.setBounds(20, 50, 1280, 800);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("MediaPlayer 1.0");
}
public static void main(String[] args) {
MainApp app = new MainApp();
}
}