2008-11-11 2 views
0

Мне было интересно, есть ли способ реализовать прослушиватель действий для Jbutton без имени. Например, у меня есть следующий цикл for, который создает кнопку для каждой буквы алфавита.Java actionListener для безымянного JButton?

for (int i = 65; i < 91; i++){ 
    alphabetPanel.add(new JButton("<html><center>" + (char)i)); 
} 

Есть ли способ, что я могу добавить слушатель действия для каждого из этих кнопок, не получая избавиться от моего цикла и жесткого кодирование каждого JButton, а затем создает слушатель действия для каждого из них?

Спасибо заранее,

Томек

ответ

4

Ваш вопрос немного расплывчато. было бы тривиально, чтобы изменить цикл, чтобы добавить слушателя внутри цикла:

ActionListener listener = something; 

for (int i = 65; i < 91; i++){ 
    JButton button = new JButton("<html><center>" + (char)i); 
    button.addActionListener(listener); 
    alphabetPanel.add(button); 
} 

, если вы не можете изменить цикл можно перебора всех детей в панели, и добавить слушателей любого из детей, являются jbuttons.

также почему вы используете html для центровки текста? разве это не избыток? не jbutton уже центральный текст?
вы можете использовать setHorizontalAlignement (SwingConstants.CENTER), чтобы сделать это тоже.

+0

для по какой-то причине я думал, что работающий прослушиватель работает так, что после его создания он каким-то образом останавливается там в коде до тех пор, пока не будет выполнено действие, но я думаю, что это побеждает всю его цель. Я изменил его, и он работал точно так, как я этого хотел. Благодаря! P.S. html был чрезмерным – Tomek 2008-11-12 00:10:28

2

В чем проблема?

for (int i = 65; i < 91; i++){ 
    JButton button = new JButton("<html><center>" + (char)i)); 
    button.addActionListener(new ButtonListener()); 
    alphabetPanel.add(button); 
} 

...

class ButtonListener implements ActionListener { 
    ButtonListener() { 
    } 
    public void actionPerformed(ActionEvent e) { 
     //TODO: 
    } 
} 

Кроме того, если текст этой кнопки не идентифицирует кнопку, вы можете установить имя кнопки с буквой алфавита.

button.setName((char)i)); // or button.setName(i); 
0

Можно добавить ActionListener анонимным компонентов, как показано ниже:

new JButton().addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       // TODO your action    
      }   
     }); 

Однако в вашем случае, когда вы пытаетесь добавить анонимную JButton к панели, такой подход не будет работать, потому что тип возвращаемого метода addActionListener (который является недействительным) будет принято вместо того, чтобы конструктор JButton, как показано ниже:

for (int i = 65; i < 91; i++){ 
      alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){ 
        @Override 
        public void actionPerformed(ActionEvent arg0) { 
         // TODO your action    
        }   
       })); 
     } 

Приведенный выше код жалуется на недопустимый аргумент Fo r panel.add().

Итак, в вашем случае вам нужно будет создать именованный экземпляр JButton.

Надеюсь, это уточнит.

С наилучшими пожеланиями, Суреш

1

По имени, вы, кажется, означает хранение экземпляра кнопки в локальной переменной вашего непосредственного метода. Попытка избежать этого, скорее всего, сделает ваш код более трудным для чтения. Но ответ на ваш вопрос:

Наиболее очевидным способом является использование старой, но вновь популярной идиомы с двойной привязкой.

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{ 
    addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      ... 
     } 
    }); 
}}); 

Обратите внимание, что в этом случае, поскольку я не является окончательным, он не будет использоваться из анонимного внутреннего класса. Либо присвойте его другой (конечной) переменной, либо переформулируйте цикл.

Другой маршрут - пройти через действие. (Обычно я предлагаю избегать действий, как они этого нужна просто бедняка Hashtable ButtonModel «хорошо», хотя..)

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) { 
    public void actionPerformed(ActionEvent event) { 
     ... 
    } 
})); 

Тогда, конечно, есть специализированная библиотека способ:

Form alphabetForm = new Form(alphabetPanel); 
for (char c='A'; c <= 'Z'; ++c) { 
    alphabetForm.button("<html><center>" + c, new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      ... 
     } 
    }); 
} 
Смежные вопросы