簡體   English   中英

如何在內部類中引用“ display”變量,以在JLabel的外部類中使用

[英]How do I reference the “display” variable from my inner class, to use in the outer class in my JLabel

我想在第四個JPanel中輸入文本,每當我按下Enter鍵時,就用文本更新第一個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();
  }

}

要訪問類的變量,您需要創建它的實例,該實例保存該變量的具體值。 另一方面, addSong.display嘗試在沒有具體實例的情況下訪問變量。 僅靜態變量允許這樣做。

幾行后,您已經在創建addSong的實例input = new addSong();

在此實例中,您可以訪問display變量。 然后的問題是,是否已經具有正確的值,或者是否需要先執行一些代碼才能正確初始化該值。

並且請僅使用Java中以大寫字母開頭的類名,並嘗試使用名詞作為類名。

歡迎來到SO。 具有動作偵聽器,您可以刪除關鍵偵聽器。
請注意評論:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM