Coucou, alors voilà, j'essaie de progresser en Java et en Orienté Objet. J'ai fait un petit prototype pour un mini lecteur mp3 il y a quelques temps, et je souhaite m'y remettre. Pour l'instant j'ai 2 boutons dans swing pour faire une sélection de lignes (des titres de chansons) dans un .txt. On m'a conseillé pour aller plus loin de regarder les "limplémentation du format M3U qui est le format de référence des playlist MP3" qu'en pensez-vous ?
Merci pour vos conseils, j'ajoute une capture d'écran pour illustrer le projet, Bonne journée
Oh génial P.X.L je vais essayer d'améliorer l'interface ! à bientôt
Edit : premier problème étrange : j'ai essayé de renommer puis de recréer des boutons avec Swing, mais c'est comme si lors de l’exécution, l'ancienne version du programme se charge.
Si vous avez une idée de ce qu'il peut se passer ?
Voici un extrait de code :
btnNext = new JButton("next");
display = new JLabel("welcome");
// panel.add(btnL);
p.add(btnPrevious, BorderLayout.LINE_START);
// panel.add(btnR);
p.add(btnNext, BorderLayout.LINE_END);
J'ai aussi fait le btnNext.addActionListener sur le nouveau bouton, mais le display.setText ne s'est pas mis à jour ?
J'espère ne pas être trop confus, je remarque que le redimensionnement de mon panel ne bouge pas non plus, j'ai essayé de passer de 600x400 à 600x300 et cela ne semble pas être pris en compte lors de la nouvelle compilation,
Je ne connais pas bien Swing, je suis plutot JavaFX (que je recommande sachant que Swing tombe en desuetude) et le code extrait est trop incomplet pour en tirer des conclusions.
Merci pour ta réponse, je ne connais que Swing, voici le code plus complet :
Une class pour le player avec l'UI :
package fr.pack.omn;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Lecteur implements ActionListener{
protected int j = 0;
protected JLabel display;
protected JPanel p;
protected JButton btnL;
protected JButton btnR;
protected JButton btnPrevious;
protected JButton btnNext;
public JPanel getPanel(ArrayList <String> mySongs) {
JPanel p = new JPanel(new BorderLayout());
btnL = new JButton("aaaaaaaaaa");
btnR = new JButton("aaaaaaaaaa");
btnPrevious = new JButton("previous");
btnNext = new JButton("next");
display = new JLabel("welcome");
// panel.add(btnL);
p.add(btnPrevious, BorderLayout.LINE_START);
// panel.add(btnR);
p.add(btnNext, BorderLayout.LINE_END);
display.setText(mySongs.get(0 + j));
p.add(display, BorderLayout.CENTER);
// playerWin.getContentPane().add(panel);
btnPrevious.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnPrevious) {
if (j == 0) {
j = mySongs.size() - 1;
} else {
j--;
}
display.setText(mySongs.get(0 + j));
}
}
});
btnNext.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnNext) {
if (j == mySongs.size() - 1) {
j = 0;
} else {
j++;
}
display.setText(mySongs.get(0 + j));
}
}
});
return p;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
Une classe de lecteur mp3 :
package fr.pack.omn;
import javax.swing.JFrame;
public class PlayerWindow extends JFrame{
/**
*
*/
private static final long serialVersionUID = 1L;
public PlayerWindow() {
setTitle("player prototype");
setSize(600, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
Un Main pour l'executer :
package fr.pack.omn;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JPanel;
public class Main {
//java fr/pack/omn/Main C:/Users/x55v/Documents/PersonalCode/songs.txt
public static ArrayList <String> mySongs = new ArrayList<String>();
static Object mp3 = new Lecteur();
public static void main(String[] args) {
PlayerWindow playerWin = new PlayerWindow();
File f = new File(args[0]);
try (Scanner input = new Scanner(f)) {
while(input.hasNextLine()) {
String i = input.nextLine();
System.out.println(i);
mySongs.add(i);
}
} catch (FileNotFoundException e) {
System.err.println("I could not find " + f);
}
// JPanel panel = new JPanel(new GridLayout(2,2));
JPanel p = ((Lecteur) mp3).getPanel(mySongs);
playerWin.getContentPane().add(p);
playerWin.setVisible(true);
// JButton btnR = new JButton("Right");
// panel.add(btnR, BorderLayout.LINE_END);
}
}
Voilà, j'espère pouvoir progresser, j'ai aussi cette info dans la console :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at mp3Player/fr.pack.omn.Main.main(Main.java:17)
En espétant que cela puisse apporter plus d'infos sur mon souci, à bientôt
Oui je vois, mais plutot que te donner la solution, je vais te demander, vu que ton but est de progresser en oriente objet, de nettoyer ce bazar.
On va commencer par une bonne pratique de base, la separation des responsabilites: ton main fait du parsing de fichier, genere une liste de chanson, s'occuper de la vue... c'est trop
Commence par decouper ca en objets avec des responsabilites
1 objet qui va lire le fichier et sortir une liste de chansons
1 objet qui va representer la vue
Donc ta class Main ne devra plus contenir aucun de ces imports, mais seulement tes 2 objets dedies
C'est plus propre mais c'est pas encore ca, le principe de separer les responsabilites est de les... separer
Donc exit le PlayerWindow du ImportFile, le flux que tu veux est que ta vue recoive la liste des chansons, donc ton systeme de generation de cette liste(ImportFile) n'a pas besoin de la vue(PlayerWindow)
Au dela de ca, le code doit se trouver dans des fonctions, tu l'as juste colle dans une classe, il te faut donc creer une fonction dans la classe pour le code de lecture de fichier.
Si getPanel sert a creer, pourquoi est ce que ca s'appelle getPanel et que ca retourne un jpane?
Main est la classe qui contient un point d'entree, c'est la fonction main qui sera executee une fois la classe chargee, c'est dans cette fonction seulement que doit se placer le déroulement de ton application, même si les bloc static sont initialises avant l'appel a main();
Ta fonction import ne doit pas etre liee a la vue(swing), elle devrait pouvoir fonctionner si l'affichage etait en console, afin d'eviter la dependance entre les deux systemes.
Edit j'ai réduit le nombre d'erreur à 4 (cf.capture), j'espère ne rien avoir cassé. Merci pour la doc fournie, je compte m'y référer régulièrement, c'est vrai que le travail d'assimilation est colossal !
Voici le nouveaux code :
Main : suppression d'imports Lecteur : suppression d'erreurs
package fr.pack.omn;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
public class Lecteur implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
protected PlayerWindow() extends JFrame {
setTitle("player prototype");
setSize(600, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
protected int j = 0;
protected JLabel display;
protected JPanel p;
protected JButton btnL;
protected JButton btnR;
protected JButton btnPrevious;
protected JButton btnNext;
protected JButton Play;
public JPanel createPanel(ArrayList <String> mySongs) {
JPanel p = new JPanel(new BorderLayout());
JButton btnPlay = new JButton("Play");
btnL = new JButton("<<");
btnR = new JButton(">>");
btnPrevious = new JButton("previous");
btnNext = new JButton("next");
display = new JLabel("welcome");
// panel.add(btnL);
p.add(btnPrevious, BorderLayout.LINE_START);
// panel.add(btnR);
p.add(btnNext, BorderLayout.LINE_END);
display.setText(mySongs.get(0 + j));
p.add(display, BorderLayout.CENTER);
// playerWin.getContentPane().add(panel);
btnPlay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnPlay) {
if (j == 0) {
display.setText("playing");
}
}
}
});
btnPrevious.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnPrevious) {
if (j == 0) {
j = mySongs.size() - 1;
} else {
j--;
}
display.setText(mySongs.get(0 + j));
}
}
});
btnNext.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnNext) {
if (j == mySongs.size() - 1) {
j = 0;
} else {
j++;
}
display.setText(mySongs.get(0 + j));
}
}
});
//JPanel p = createPanel(mySongs);
//playerWin.getContentPane().add(p);
//playerWin.setVisible(true);
return p;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
ImportFile : suppression d'erreurs
package fr.pack.omn;
import java.awt.Component;
import java.awt.Container;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ImportFile {
public void imports(String[] args) {
//PlayerWindow playerWin = new PlayerWindow();
//private String[] args;
File f = new File(args[0]);
try (Scanner input = new Scanner(f)) {
while(input.hasNextLine()) {
String i = input.nextLine();
System.out.println(i);
Container mySongs;
mySongs.add(i);
}
//recuperer la liste des musiques trouvees grace a ImportFile.imports
return mySongs;
} catch (FileNotFoundException e) {
System.err.println("I could not find " + f);
}
}
}
Bonne journée, merci pour vos commentaires
Edit : j'ai réduit à 2 erreurs !
Mais j'ai du supprimer le return mySongs du ImportFile, ce n'est pas bien je pense, A+ ?
Edit: j'ai pu réduire à une seule erreur après pas mal d'efforts :
Mais je n'arrive pas à modifier les intitulés de boutons, l'interface de swing reste la même malgré mes modifications, votre aide est la bienvenue !
Edit: J'ai fait un autre projet Java, dans celui-ci je peux afficher un message pré-déterminé différent selon le bouton cliqué. Reste à implémenter la fonctionnalité liée au défilement de noms de chansons d'un fichier tiers, pour l'instant je n'ai pas pu le faire, pour récupérer les données d'un utilisateur. A+
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl