Как мне ссылаться на переменную "display" из моего внутреннего класса, чтобы использовать во внешнем классе в моем JLabel

Я хочу ввести текст в мою четвертую JPanel, и каждый раз, когда я нажимаю клавишу ввода, обновляется первая JPanel с текстом. Я добавил список ключей для ключа возврата, он запускает функцию во внутреннем классе AddSong, эта функция принимает массив текста и возвращает строку. Я хочу отобразить эту строку на JPanel в первом квадранте, но она не работает. Сейчас я считаю, что это удаление первой JPanel, а не обновление. Я очень смущен, потому что это моя первая встреча с ключевыми событиями, так как я новичок в программировании.

Вот код:

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();
  }

}

2 ответа

Решение

Добро пожаловать в ТАК. Имея слушателя действия, вы можете сбросить ключевой слушатель.
Пожалуйста, обратите внимание на комментарии:

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();
    }
}

Чтобы получить доступ к переменной класса, вам нужно создать ее экземпляр, который содержит конкретное значение для этой переменной. addSong.display с другой стороны, пытается получить доступ к переменной без конкретного экземпляра. Это разрешено только для статических переменных.

Вы уже создаете экземпляр addSong несколько строк спустя input = new addSong();

Из этого экземпляра вы можете получить доступ к display переменная. Тогда возникает вопрос, имеет ли оно уже правильное значение или вам нужно сначала выполнить какой-то код для правильной инициализации значения.

И, пожалуйста, используйте только имена классов, начинающиеся с верхнего регистра в Java, и попробуйте использовать имена существительные в качестве имен классов.

Другие вопросы по тегам