嘿所有我可以轻松地用“最终”改变单个按钮的文本但是我需要为航班预订系统创建许多按钮,当按钮更多时,最终不起作用......
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);
}
如果你可以建议我克服这个问题,我会很高兴。我想在点击时更改按钮颜色或文字,或者鼠标悬停时可能还有其他一些很酷的效果,但现在只有文字或颜色会够=)。谢谢你的时间!
答案 0 :(得分: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
)才能访问它。
使用但未在内部类中声明的任何局部变量,形式参数或异常参数必须声明为final。
如果不允许这样做,则可以使用getSource使用JButton
本身的源组件访问ActionEvent
。
然而,这就是说,最简单的解决方案是将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);
...
}
});
}
答案 1 :(得分:1)
请避免为动作侦听器使用匿名类,final
约束将消失。
我的意思是使用:
class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton src = (JButton)e.getSource();
// do what you want
}
}