2013-06-16 2 views
0

Эй все, что я могу изменить текст 1 одной кнопки легко с «окончательным», но мне нужно, чтобы создать множество кнопок для системы бронирования полета, и когда кнопки больше, окончательный не работает ...Изменение JButton Текст или цвет без окончательного?

JButton btnBookFlight; 

eco = new EconomyClass(); 
eco.setSeats(5); 
for(int i=0;i<20;i++){ 
    btnBookFlight = new JButton("Book" +i); 
    btnBookFlight.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      btnBookFlight.setBackground(Color.RED); 
      btnBookFlight.setOpaque(true); 
      btnBookFlight.setText("Clicked"); 
     } 
    }); 
    btnBookFlight.setBounds(77, 351, 100, 23); 
    contentPane.add(btnBookFlight); 
} 

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

ответ

4

Используйте источник ActionEvent в ActionListener

btnBookFlight.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent event) { 

     JButton button = (JButton)event.getSource(); 
     button.setBackground(Color.RED); 
     ... 
    } 
}); 

btnBookFlight должен быть final для внутреннего класса (ActionListener) для доступа к нему.

От JLS 8.1.3

Любых местные переменного, формальный параметр или параметр исключения используется, но не объявленные во внутреннем классе должен быть объявлен окончательным.

Если это не разрешено, то JButton можно получить доступ с помощью компонента источника из ActionEvent самих по себе, используя getSource.

Однако, что сказали, самое простое решение было бы переместить JButton декларации в рамках цикла for и сделать его final:

for (int i = 0; i < 20; i++) { 
    final JButton btnBookFlight = new JButton("Book" + i); 
    btnBookFlight.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      btnBookFlight.setBackground(Color.RED); 
      ... 
     } 
    }); 
} 
+0

+1 Для иллюстрации, как динамически найти источник события. –

+0

Спасибо, что сработало хорошо =) – Anarkie

+0

Я буду всегда использовать этот путь с этого момента, но вы также можете объяснить логику? – Anarkie

1

Просто не использовать анонимные классы для слушателя действий и final ограничение исчезнет.

Что я имею в виду использование:

class MyActionListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
    JButton src = (JButton)e.getSource(); 
    // do what you want 

    } 
} 
+0

в этом случае, избегая анонимного класса, вы должны проверить, является ли 'instanceof JButton' – nachokk

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