0

嘿,我可以用“final”轻松更改 1 个单个按钮的文本,但我需要为航班预订系统创建很多按钮,当按钮更多时,final 不起作用......

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

2 回答 2

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

任何使用但未在内部类中声明的局部变量、形参或异常参数都必须声明为 final。

如果不允许这样做,则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);
            ...
        }
    });
}
于 2013-06-16T21:16:33.340 回答
1

只需避免为您的动作侦听器使用匿名类,final约束就会消失。

我的意思是使用:

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

  }
}
于 2013-06-16T21:16:48.060 回答