2017-07-02 4 views
0

Ich möchte Text in meine vierte JPanel eingeben, und jedes Mal, wenn ich Enter drücke, um das erste JPanel mit dem Text zu aktualisieren . Ich habe einen Keylistener für den Return-Schlüssel hinzugefügt, er führt eine Funktion in der inneren Klasse AddSong aus, diese Funktion nimmt eine Arraylist von Text auf und gibt eine Zeichenkette zurück. Ich möchte diese Zeichenfolge auf dem JPanel im ersten Quadranten anzeigen, aber es funktioniert nicht. Im Moment glaube ich, dass es das erste JPanel entfernt und nicht aktualisiert. Ich bin sehr verwirrt, weil dies meine erste Begegnung mit Schlüsselereignissen ist, da ich neu im Programmieren bin.Wie referenziere ich die "display" Variable aus meiner inneren Klasse, um in der äußeren Klasse in meinem JLabel

Hier ist der 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

Bitte zeigen Sie uns, in welcher Zeile Sie den Fehler erhalten. (Und geben Sie uns nicht nur eine Zeilennummer. Das ist nicht gut genug für uns zu sagen, welche Zeile den Fehler verursacht.) – ajb

+0

Ich bekomme den Fehler in der Zeile, die liest "songList = new JLabel (addSong. Display, SwingConstants.CENTER); in der Musik-Player-Funktion in der Musik-Player-Klasse. –

Antwort

0

Willkommen bei SO. Wenn Sie einen Aktionslistener verwenden, können Sie den Schlüssellistener löschen.
Bitte beachten Sie die Kommentare:

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

Vielen Dank, das hat mein Problem gelöst! –

0

Um die Variable einer Klasse zu nutzen, müssen Sie eine Instanz davon zu schaffen, die für diese Variable einen konkreten Wert hält. addSong.display versucht dagegen, auf die Variable ohne eine CoCrete-Instanz zuzugreifen. Dies ist nur für statische Variablen zulässig.

Sie erstellen bereits eine Instanz von addSong ein paar Zeilen später input = new addSong();

Von dieser Instanz aus können Sie auf die Variable display zugreifen. Die Frage ist dann, ob es bereits den richtigen Wert hat oder ob Sie zuerst einen Code ausführen müssen, um den Wert richtig zu initialisieren.

Und bitte verwenden Sie nur Klassennamen, die mit einem Großbuchstaben in Java beginnen, und versuchen Sie, Substantive als Klassennamen zu verwenden.

+0

Es hat nicht schon den richtigen Wert, wie würde ich den Wert richtig initialisieren? –

+0

Ich verstehe nicht wirklich, wofür Sie dieses 'Display brauchen 'variable. Es sollte ausreichen, dass Sie den Text in' actionPerformed' berechnen und auf 'JLabel'' songList' setzen. –

Verwandte Themen