0

1 つのボタンのテキストを "final" で簡単に変更できますが、フライト予約システム用にたくさんのボタンを作成する必要があり、ボタンがそれ以上になると、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);
      ...
    }
});

btnBookFlightfinal内部クラス ( ActionListener) がアクセスできるようにする必要があります。

JLS 8.1.3以降

使用されているが内部クラスで宣言されていないローカル変数、仮パラメーター、または例外パラメーターは、final として宣言する必要があります。

これが許可されていない場合は、getSourceを使用して 自体JButtonのソース コンポーネントを使用して にアクセスできます。ActionEvent

ただし、そうは言っても、最も簡単な解決策は、宣言をループJButtonのスコープ内に移動して作成することです。forfinal

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 に答える