2017-07-02 11 views
0

私は4番目のJPanelにテキストを入力したいのですが、最初のJPanelをテキストで更新するたびに。私はリターンキー用のキーリストを追加し、内部クラスAddSongで関数を実行し、その関数はテキストのarraylistをとり、文字列を返します。その文字列を最初の四分円でJPanelに表示したいが、それはうまくいかない。今は、最初のJPanelを削除していて、更新していないと思います。私はプログラミングに慣れていないので、これが私の最初の主要イベントとの出会いであるので、私は非常に混乱しています。私のJLabelの外部クラスで使用するために、私の内部クラスの "display"変数を参照するには

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

エラーが表示されている行を表示してください。 (そして、私たちに行番号を与えるだけでは、エラーの原因となっている行を教えてもらえません) – ajb

+0

"songList = new JLabel(addSong。 display、SwingConstants.CENTER);音楽プレーヤークラスの音楽プレーヤー関数内 –

答えて

0

ようこそ。アクションリスナーを持つと、キーリスナーを削除できます。
コメントにご注意ください:

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

ありがとう、これは私の問題を解決しました! –

0

あなたがその変数のための具体的な値を保持し、そのインスタンスを作成する必要があり、クラスの変数にアクセスするには:ここで

コードです。一方、addSong.displayは、同一のインスタンスを持たない変数にアクセスしようとします。これは静的変数に対してのみ許可されています。

すでに数行後のaddSongというインスタンスを作成しています。 input = new addSong();

この場合、display変数にアクセスできます。問題は、すでに正しい値がある場合、または値を適切に初期化するためにいくつかのコードを最初に実行する必要がある場合です。

Javaでは大文字で始まるクラス名のみを使用し、クラス名として名詞を使用してください。

+0

これは正しい値を持っていません。どうすれば値を正しく初期化できますか? –

+0

この表示が必要なのは本当にわかりません'変数を使用します。' actionPerformed'のテキストを計算し、 'JLabel'' songList'に置くだけで十分です。 –

関連する問題