2017-07-02 3 views
0

Je veux entrer du texte dans mon quatrième JPanel, et chaque fois que j'appuie sur enter pour mettre à jour le premier JPanel avec le texte . J'ai ajouté un keylistener pour la clé de retour, il exécute une fonction dans la classe interne AddSong, cette fonction prend dans un arraylist de texte, et renvoie une chaîne. Je veux afficher cette chaîne sur le JPanel dans le premier quadrent, mais cela ne fonctionne pas. En ce moment je crois qu'il enlève le premier JPanel, et ne met pas à jour. Je suis très confus parce que c'est ma première rencontre avec des événements clés comme je suis nouveau à la programmation.Comment puis-je référencer la variable "display" de ma classe interne, à utiliser dans la classe externe dans mon JLabel

Voici le code:

public class MusicPlayer extends JFrame{ 

    private static final int WIDTH = 400; 
    private static final int HEIGHT = 400; 
    private JLabel songList,songPlaying,c; 
    private JTextField enterSong; 
    private AddSong input; 

    public MusicPlayer(){ 

    //Text box enterSong, input passed to actionListener 
    input = new AddSong(); 
    enterSong = new JTextField(10); 
    enterSong.addActionListener(input); 

    //Numbers the quadrents 
    songList = new JLabel(input.printSongs(input.songList),SwingConstants.CENTER); 
    songPlaying = new JLabel("2",SwingConstants.CENTER); 
    c = new JLabel("c",SwingConstants.CENTER); 

    //Makes and sets size of pane 
    Container pane = getContentPane(); 
    pane.setLayout(new GridLayout(2,2)); 

    //Add JLabels to panes in the container 
    pane.add(songList); 
    pane.add(songPlaying); 
    pane.add(c); 
    pane.add(enterSong); 




    //KeyListener - return 
    addKeyListener(new KeyListener() { 
     @Override 
     public void keyPressed(KeyEvent ke){} 
     @Override 
     public void keyReleased(KeyEvent ke){} 
     @Override 
     public void keyTyped(KeyEvent ke){ 
      if(ke.getKeyCode()==KeyEvent.VK_ENTER){ 
       input.printSongs(input.songList); 
      } 
     } 
    }); 
    add(songList); 
    pack(); 

    setTitle("Andrew's Music Player"); 
    setSize(WIDTH,HEIGHT); 
    setVisible(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

    } 

    public class AddSong implements ActionListener{ 

    //List of Songs 
    ArrayList<String> songList = new ArrayList<String>(); 
    String display; 

    public AddSong(){ 
     display = ""; 
    } 
    public void actionPerformed(ActionEvent e){ 

     String song; 
     //get the text 
     song = enterSong.getText(); 

     //add current text string to list 
     songList.add(song); 

     //print songlist 
     System.out.print(printSongs(songList)); 

    } 

    public String printSongs(ArrayList<String> songList){ 
     display = ""; 
     for(int i = 0; i < songList.size(); i++){ 
      display += songList.get(i) + "\n"; 
     } 
     return display; 
    } 
    } 

    public static void main(String args[]){ 
    MusicPlayer boi = new MusicPlayer(); 
    } 

}

+0

S'il vous plaît nous montrer sur quelle ligne vous obtenez l'erreur. (Et ne nous donnez pas juste un numéro de ligne, ce n'est pas assez bon pour nous de dire quelle ligne cause l'erreur.) – ajb

+0

Je reçois l'erreur sur la ligne qui lit "songList = new JLabel (addSong. affichage, SwingConstants.CENTER); dans la fonction de lecteur de musique dans la classe de lecteur de musique –

Répondre

0

Bienvenue chez SO. Ayant un écouteur d'action, vous pouvez laisser tomber l'écouteur de clé.
S'il vous plaît noter les commentaires:

public class MusicPlayer extends JFrame{ 

    private static final int WIDTH = 400; 
    private static final int HEIGHT = 400; 
    private JLabel songsList,songPlaying,c; 
    private JTextField enterSong; 
    private AddSong input; 

    public MusicPlayer(){ 

     //Text box enterSong, input passed to actionListener 
     input = new AddSong(); 
     enterSong = new JTextField(10); 
     enterSong.addActionListener(input); 

     //Numbers the quadrents 
     songsList = new JLabel("No songs in list",SwingConstants.CENTER); 
     songPlaying = new JLabel("2",SwingConstants.CENTER); 
     c = new JLabel("c",SwingConstants.CENTER); 

     //Makes and sets size of pane 
     Container pane = getContentPane(); 
     pane.setLayout(new GridLayout(2,2)); 

     //Add JLabels to panes in the container 
     pane.add(songsList); 
     pane.add(songPlaying); 
     pane.add(c); 
     pane.add(enterSong); 

     //adding a key listenr to the Jframe is not need 
     //the enterSong.addActionListener(input); does the work 

     add(songsList); 
     pack(); 

     setTitle("Andrew's Music Player"); 
     setSize(WIDTH,HEIGHT); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

    } 

    public class AddSong implements ActionListener{ 

     //List of Songs 
     ArrayList<String> songList = new ArrayList<>(); 

     public AddSong(){ } 

     @Override 
     public void actionPerformed(ActionEvent e){ 

      String song; 
      //get the text 
      song = enterSong.getText(); 

      //add current text string to list 
      songList.add(song); 

      String songListAsString = printSongs(songList); 

      //update display with new song 
      songsList.setText(songListAsString); 

      //clear text field 
      enterSong.setText(""); 
     } 

     public String printSongs(ArrayList<String> songList){ 

      //using string builder is more efficient 
      //to have multiple lines in a JLabel you have to use 
      //html tags 
      //a JList would be more appropriiate 
      StringBuilder sb = new StringBuilder("<html>"); 

      for(int i = 0; i < songList.size(); i++){ 
       sb.append("<p>") 
        .append(songList.get(i)) 
        .append("</p>"); 
      } 

      sb.append("</html>"); 
      return sb.toString(); 
     } 
    } 

    public static void main(String args[]){ 
     MusicPlayer boi = new MusicPlayer(); 
    } 
} 
+0

Merci beaucoup, ceci a résolu mon problème! –

0

Pour accéder à la variable d'une classe, vous devez créer une instance de ce qui est titulaire d'une valeur concrète pour cette variable. D'autre part, addSong.display essaie d'accéder à la variable sans une instance cocrete. Ceci est uniquement autorisé pour les variables statiques. Vous créez déjà une instance de addSong quelques lignes plus tard input = new addSong();

De cette instance vous pouvez accéder à la variable display. La question est alors, si elle a déjà la valeur correcte ou si vous devez d'abord exécuter du code afin d'initialiser correctement la valeur.

Veuillez utiliser uniquement des noms de classes commençant par une majuscule en Java et essayez d'utiliser les noms comme noms de classe.

+0

Il n'a pas déjà la valeur correcte, comment puis-je initialiser correctement la valeur? –

+0

Je ne comprends pas vraiment ce que vous avez besoin de ce 'display 'variable.Il suffira que vous calculiez le texte dans' actionPerformed' et que vous le placiez dans la liste des chansons de 'JLabel' –