2014-02-02 3 views
1

Есть ли способ узнать, был ли последовательно нажат JButton? Рассмотрим мой код.Нажатие кнопки JButton последовательно

public void actionPerformed(ActionEvent arg0) { 
    String bucky[] = new String[2]; 
    String firstclick = null, secondclick = null; 
    clicks++; 
    if (clicks == 1) { 
     bucky[0] = firstclick; 
    } else if(clicks == 2) { 
     bucky[1] = secondclick; 
     if (bucky[0] == bucky[1]) { 
      //This JButton was clicked twice in a row. 
     } 
    } 

Этот код проверяет весь номер раз мой JButton была нажата и отображает сообщение «Эта кнопка была нажата два раза подряд». Я хочу сравнить два клика с этой кнопки и посмотреть, идут ли они один за другим, а не подсчитывать количество кликов. Или есть встроенная функция, которая делает это?

+2

два щелчка данной кнопки * всегда * идут один за другим. Чего вы пытаетесь достичь? –

+0

Хорошо, у меня около 4 JButtons в моем графическом интерфейсе, для выполнения разных команд. Я хочу создать случай, когда, если один из этих четырех нажал последовательно, появится ошибка. – user3263215

+0

Что делают эти кнопки? Разделяют ли они один и тот же ActionListener? –

ответ

0

У меня есть другой подход к вашей проблеме:

  • Вы хотите, чтобы не позволить пользователю нажать на ту же кнопку в некоторой группе кнопок дважды подряд.
  • Вы до сих пор пытались проверить, какая кнопка была нажата последним, а затем предупредить пользователя, если одна и та же кнопка была нажата в строке.
  • Возможно, лучшим решением является создание конструкции, которая просто не позволяет пользователю нажимать одну и ту же кнопку дважды подряд.
  • Вы можете создать объект 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); 
     } 
    } 
} 

При выполнении выше программы, и когда нажата вторая кнопка, вы увидите, что она отключена:

2nd button pressed

Затем, когда кнопка третьей была нажата, второй повторно включен, а третий один отключен:

enter image description here

и ЭТЦ для 4 кнопки ....

enter image description here

0

Глобальная переменная Аррау логических значений, один для каждой кнопки, истинны на первом щелчок, установить ложные или вторую, sjould сделать это

2

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

private JButton lastButtonClicked; 

... 

someButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     if (lastButtonClicked == e.getSource()) { 
      displayError(); 
     } 
     else { 
      lastButtonClicked = (JButton) e.getSource(); 
      doSomething(); 
     } 
    } 
}); 

Конечно, вам придется делать то же самое со всеми другими кнопками.

+0

избили меня 1+ –

+0

Можно ли предположить, что переменная lastButtonClicked; это одно и то же имя, данное моему JButton, или это значит что-то еще? – user3263215

+0

@ пользователь3263215: сообщите пожалуйста ваш вопрос. lastButtonClicked будет иметь значение null, и ему не будет присвоено значение кнопки до тех пор, пока не будет нажата кнопка. –

Смежные вопросы