У меня есть другой подход к вашей проблеме:
- Вы хотите, чтобы не позволить пользователю нажать на ту же кнопку в некоторой группе кнопок дважды подряд.
- Вы до сих пор пытались проверить, какая кнопка была нажата последним, а затем предупредить пользователя, если одна и та же кнопка была нажата в строке.
- Возможно, лучшим решением является создание конструкции, которая просто не позволяет пользователю нажимать одну и ту же кнопку дважды подряд.
- Вы можете создать объект ButtonGroup, который выборочно отключает последнюю нажатую кнопку и включает все остальные кнопки.
- Вы должны были бы дать этому классу метод
add(AbstractButton btn)
, чтобы вы могли добавить все кнопки, которые вы хотите вести к нему. Затем кнопка будет добавлена в ArrayList.
- Вы бы дали ему единственный ActionListener, который прослушивает все кнопки. Всякий раз, когда был применен метод actionPerformed, он позволяет всех кнопок, а затем выборочно отключает последнюю нажатую кнопку.
Например рассмотреть мой класс ниже:
public class NoRepeatButtonGroup implements ActionListener {
private List<AbstractButton> btnList = new ArrayList<>();
public void add(AbstractButton btn) {
btnList.add(btn);
btn.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent evt) {
for (AbstractButton btn : btnList) {
btn.setEnabled(true);
}
((AbstractButton) evt.getSource()).setEnabled(false);
}
public void reset() {
for (AbstractButton btn : btnList) {
btn.setEnabled(true);
}
}
}
Если создать один объект этого в своем классе, который создает кнопки, и добавить каждую кнопку на объект этого класса, ваш код автоматически отключит последнюю нажатую кнопку и снова включит ее, как только будет нажата другая кнопка.
Вы можете использовать его так:
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
NoRepeatButtonGroup noRepeatButtonGroup = new NoRepeatButtonGroup();
JButton yesButton = new JButton(new YesAction());
noRepeatButtonGroup.add(yesButton);
buttonPanel.add(yesButton);
JButton noButton = new JButton(new NoAction());
noRepeatButtonGroup.add(noButton);
buttonPanel.add(noButton);
JButton maybeButton = new JButton(new MaybeAction());
noRepeatButtonGroup.add(maybeButton);
buttonPanel.add(maybeButton);
Например, вот доказательство концепции минимального работоспособный пример:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
public class NoneInARowBtns {
private static void createAndShowGui() {
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
NoRepeatButtonGroup noRepeatButtonGroup = new NoRepeatButtonGroup();
int buttonCount = 5;
for (int i = 0; i < buttonCount; i++) {
JButton btn = new JButton(new ButtonAction(i + 1));
noRepeatButtonGroup.add(btn);
buttonPanel.add(btn);
}
JOptionPane.showMessageDialog(null, buttonPanel);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
@SuppressWarnings("serial")
class ButtonAction extends AbstractAction {
public ButtonAction(int i) {
super("Button " + i);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand() + " Pressed");
}
}
class NoRepeatButtonGroup implements ActionListener {
private List<AbstractButton> btnList = new ArrayList<>();
public void add(AbstractButton btn) {
btnList.add(btn);
btn.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent evt) {
for (AbstractButton btn : btnList) {
btn.setEnabled(true);
}
((AbstractButton) evt.getSource()).setEnabled(false);
}
public void reset() {
for (AbstractButton btn : btnList) {
btn.setEnabled(true);
}
}
}
При выполнении выше программы, и когда нажата вторая кнопка, вы увидите, что она отключена:
Затем, когда кнопка третьей была нажата, второй повторно включен, а третий один отключен:
и ЭТЦ для 4 кнопки ....
два щелчка данной кнопки * всегда * идут один за другим. Чего вы пытаетесь достичь? –
Хорошо, у меня около 4 JButtons в моем графическом интерфейсе, для выполнения разных команд. Я хочу создать случай, когда, если один из этих четырех нажал последовательно, появится ошибка. – user3263215
Что делают эти кнопки? Разделяют ли они один и тот же ActionListener? –