#java #swing #jbutton #actionlistener #actionevent
#java #swing #jbutton #actionlistener #actionevent
Вопрос:
У меня есть класс gui, в котором три разных JButtons
связаны с одним ActionListener
.
В ActionListener
классе я хочу, чтобы взаимодействие между этими тремя JButtons
способами позволяло программе «запоминать», какая кнопка была нажата ранее.
Например:
- Если нажата кнопка 1 -> запомните это,
- Затем, когда будет нажата кнопка 2, выполните следующее действие: выполните действие относительно нажатия кнопки 1.
Другими словами, если кнопка 1 нажата, теперь внутри предложения if проверьте, нажата ли кнопка 2.
Прямо сейчас getActionCommand()
не позволяет мне использовать вложенные операторы if, потому что он проверяет только текущую нажатую кнопку и не имеет «памяти».
public void actionPerformed(ActionEvent e){
if (Integer.parseInt(e.getActionCommand()) == 0){
System.out.println("This is Jug 0");
// wont be able to print the following
if (Integer.parseInt(e.getActionCommand()) == 1){
System.out.println("This is Jug 1 AFTER jug 0"); //I will never be able to print this
}
}
}
Комментарии:
1. Что означает
gets clicked next
? Разрешено ли ему тем временем не проверять свои электронные письма?
Ответ №1:
Из моего понимания того, что вы ищете…
Таким образом, одним из способов достижения этой цели является создание переменной экземпляра, которая является логическим значением, поэтому будет установлено значение true, если кнопка была нажата ранее, а затем вы можете проверить в своем методе, установлен ли этот флаг true. Недостатком такого подхода было бы то, что флаг всегда будет иметь значение true после того, как он был нажат один раз. Вам нужно будет реализовать способ сброса этого флага.
private boolean hasButtonOneBeenPressed = false; //set this to true when the button has been clicked
public void actionPerformed(ActionEvent e){
if (Integer.parseInt(e.getActionCommand()) == 0 amp;amp; !hasButtonOneBeenPressed){
System.out.println("This is Jug 0");
// wont be able to print the following
} else if(Integer.parseInt(e.getActionCommand()) == 1 amp;amp; hasButtonOneBeenPressed){
System.out.println("This is Jug 1 AFTER jug 0");
} else {
//do something else
}
}
Комментарии:
1. Я искал более элегантный подход, чем этот, например, возможно, свойство, встроенное в прослушиватели действий. Однако в конечном итоге я все равно использовал этот подход, потому что он выполняет свою работу, и другие ответы здесь были в том же духе.
Ответ №2:
Вы задали поведение ActionListener — у него есть метод actionPerformed, но вам еще предстоит задать ему поля состояния, которые позволяют ему запоминать, где он находится и что он сделал. Логическое поле или два, вероятно, все, что вам здесь нужно. Либо это, либо поле JButton, в которое вы помещаете последнюю нажатую кнопку — все зависит от того, что вы хотите сделать с этой информацией.
Например, если вы кодировали игру с памятью, у вас могло бы быть поле JButton, в котором содержится последняя нажатая кнопка. Если поле имеет значение null при выполнении actionPerformed, вы знаете, что пользователь нажимает первую кнопку, и поэтому присваиваете ее полю. Если поле содержит кнопку при нажатии actionPerformed, то вы знаете, что нажата 2-я кнопка. Если он не совпадает с первым, вы сравниваете значки изображений и ведете себя соответствующим образом, а затем устанавливаете для поля JButton значение null.
Ответ №3:
Я просто предполагаю, что вы хотите, чтобы была нажата только последняя кнопка, поэтому вам просто нужна переменная для хранения вашей последней кнопки. Если вам нужна полная история нажатий кнопок, просто используйте массив, в который вы добавляете свои нажатые кнопки.
PS: для ActionListeners используются лямбды java 8.
private void initComponents() {
JButton b1 = new JButton();
JButton b2 = new JButton();
JButton b3 = new JButton();
b1.addActionListener((e)-> onButton1Pressed());
b2.addActionListener((e)-> onButton2Pressed());
b3.addActionListener((e)-> onButton3Pressed());
}
int lastButton = -1;
private void onButton1Pressed() {
switch (lastButton) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
lastButton = 1;
}
private void onButton2Pressed() {
switch (lastButton) {
case 1:
break;
case 2:
break;
case 3:
break;
default:
break;
}
lastButton = 2;
}
Комментарии:
1. Как бы вы указали что-то вроде b1.addActionListener((e) на конкретный метод, такой как onButton1Pressed());
2. Эта строка кода выполняет следующее: b1.addActionListener((e)-> onButton1Pressed());