2013-04-23 3 views
2

У меня есть следующий код, который создает массив JButton при нажатии кнопки. Ope[] публично объявляется в классе. У меня проблема, что я получил нулевой указатель. То есть он не печатает 2-й в цикле, т.е. не входит во внутреннюю итерацию. Скажите, пожалуйста, как обращаться с слушателями для массива. Заранее спасибо.добавление слушателей в массив JButton;

for(int i=0,y=30; i<counter;i++,y+=15) 
{ 

     open[i]=new JButton("Open"); 
     open[i].setBounds(380, y, 70, 15); 
     open[i].addActionListener(this); 
     panelDisplay.add (open[i]); 

     System.out.println(""+i); 
} 

Регулируя в функции actionPerformed событие следующим образом:

for(int j=0; j<open.length; j++) 
{ 
    System.out.println("1st in a loop"+j); 

    if(ae.getSource() != null) 
    { 
     if(ae.getSource() == open[j]) 
     { 
      System.out.println("2nd in a loop" +j); 
      int id; 
      String stringid; 
      System.out.println("open of"+j+"is clicked"); 

      stringid = ""+table.getValueAt(j, 0); 
      id = Integer.parseInt(stringid); 
      fetchData(id); 
      //ae.getSource().equals(null); 
     } 
    } 

} 
+0

Не используйте 'SetBounds()'. Используйте диспетчер компоновки для компоновки кнопок. Опубликуйте свой SSCCE, который демонстрирует проблему. – camickr

ответ

0

JButton наследует "SetName" Способ от компонента. Так что, если вы установите имя на кнопке при инициализации

 open[i]=new JButton("Open"); 
     open[i].setBounds(380, y, 70, 15); 
     open[i].setName("Button"+i); 
     open[i].addActionListener(this); 
     panelDisplay.add (open[i]); 

     System.out.println(""+i); 

вы можете найти кнопку Wich была нажата в eventhandling

int buttonNumber = Integer.parseInt(ae.getSource().getName().replace("Button","")) 
    //... do eventhandling for Button["buttonNumber"] 
+1

Лучше использовать getName.equals («Button» + i) – jogabonito

+0

-1, нам не нужен метод setName() для чего-то подобного. Это дополнительная работа, которая не нужна. Если этот код работает, исходный код должен работать. Хотя никогда не рекомендуется использовать логику if/else или looping типа, чтобы определить, какой объект сгенерировал событие, если вы используете эту логику, тогда вы должны проверить фактический объект или, возможно, «команду действия» объекта, а не имя объекта. – camickr

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