更改JButton文本或颜色没有最终?

时间:2013-06-16 21:14:26

标签: java swing actionlistener 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);
} 

如果你可以建议我克服这个问题,我会很高兴。我想在点击时更改按钮颜色或文字,或者鼠标悬停时可能还有其他一些很酷的效果,但现在只有文字或颜色会够=)。谢谢你的时间!

2 个答案:

答案 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)才能访问它。

来自JLS 8.1.3

  

使用但未在内部类中声明的任何局部变量,形式参数或异常参数必须声明为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

  }
}