2014-01-15 2 views
-1

Как только нажата кнопка, я получаю NullPointerException, где я ожидал, что значение в ArrayList будет напечатано на экране. Например, если я нажму кнопку, указывающую на «A», на экране появится «A», если я нажму кнопку «B», на экране будет напечатан «B».Я хочу, чтобы значения в ArrayList показывались после нажатия кнопки

public class Media extends JPanel { 

    //Declares our media player component 
    private JPanel video_pnl, control_pnl; 
    private JButton play_btn; 
    private JLabel loc_lbl; 
    private int increment; 
    ArrayList<String> file_location; 

    public Media(ArrayList<String> file_location) { 
     this.file_location = file_location; 
     increment = 0; 
     while (increment < file_location.size()) { 
      video_pnl = new JPanel(); 
      video_pnl.setLayout(new BoxLayout(video_pnl, BoxLayout.Y_AXIS)); 
      loc_lbl = new JLabel(); 
      loc_lbl.setText(file_location.get(increment)); 
      play_btn = new JButton("Play"); 
      control_pnl = new JPanel(); 
      control_pnl.setLayout(new FlowLayout(FlowLayout.CENTER)); 
      play_btn.setActionCommand("play"); 
      video_pnl.add(loc_lbl); 
      control_pnl.add(play_btn); 
      video_pnl.add(control_pnl, BorderLayout.SOUTH); 

      Handler handler = new Handler(); 
      play_btn.addActionListener(handler); 

      video_pnl.revalidate(); 
      add(video_pnl); 
      increment++; 
     } 
    } 

    private class Handler implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getActionCommand().equals("play")) { 
       play(); 
      } 
    //   if (e.getSource() == play_btn){ 
    //    play(); 
    //   } 
     } 
    } 

    public void play() { 
     for (int i = 0; i < file_location.size(); i++) { 
      System.out.println(file_location.get(i)); 
     } 
    } 

    public static void main(String[] args) { 
     //Declare and initialize local variables 
     ArrayList<String> file_location = new ArrayList<>(); 
     file_location.add("A"); 
     file_location.add("B"); 
     file_location.add("C"); 
     file_location.add("D"); 
     file_location.add("E"); 

     //creates instances of the VlcPlayer object, pass the mediaPath and invokes the method "run" 
     Media mediaplayer = new Media(file_location); 
     JFrame ourframe = new JFrame(); 
     ourframe.setContentPane(mediaplayer); 
     ourframe.setLayout(new GridLayout(5, 1)); 
     ourframe.setSize(300, 560); 
     ourframe.setVisible(true); 
     ourframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+2

Ну, где * исключение выбрасывается? Отправьте полную статистику стека и укажите соответствующие строки в вашем коде. (Вероятно, мы можем догадаться, но, пожалуйста, дайте полную информацию, чтобы упростить жизнь каждого человека - читайте http://tinyurl.com/so-list) –

ответ

2

Добавить:

this.file_location = file_location; 

в конструкторе (в этой строке: государственные средства массовой информации (ArrayList file_location) {)

+0

эй, спасибо за исправление, но когда я нажимаю кнопку воспроизведения, все буквы на дисплеях arraylist, но я хочу, чтобы одна буква указывала на кнопку, которая будет отображаться. спасибо за коррекцию d, хотя – MastaOpec

+0

Затем вам нужно изменить эту часть: 'for (int i = 0; i M21B8

0

В конструкторе, вы обратитесь к аргументу file_location построить ваши панели , но вы никогда не храните массив в своей переменной класса. Так как он инициализирован null по умолчанию, вы получаете NPE, когда ссылаетесь на него в методе play().

Инициализируйте своего члена класса в своем конструкторе значением аргумента (this.file_location = file_location), это исправит вашу проблему.

На стороне примечания я предлагаю вам использовать имена аргументов, которые еще не используются для членов класса. Это становится легче при чтении кода, чтобы заметить, если вы ссылаетесь на аргумент или член, и будет предотвращать проблему, которую вы только что наблюдали.

+0

эй, благодарю за исправление, но когда я нажимаю кнопку воспроизведения, все буквы в массиве отображаются, но я хочу, чтобы одна буква указывала на кнопку, которую нужно отобразить. спасибо за коррекцию d, хотя теперь - MastaOpec – MastaOpec

+0

Когда вы вызываете метод 'play()', вы не указываете, какой элемент должен отображаться. Цикл 'for', который вы закодировали, будет проходить через _all_ элементов в массиве и распечатать их все. Вы должны хранить где-то нажатую кнопку. – Laf

Смежные вопросы