2016-10-11 5 views
0

У меня есть класс gui, который имеет три разных JButtons, связанных с одним ActionListener.Java Action Listener и JButtons

В классе ActionListener мне требуется взаимодействие между этими тремя JButtons таким образом, чтобы программа могла «запомнить», какую кнопку нажали ранее.

Например:

  1. Если button1 щелкают -> помните,
  2. Затем, когда button2 получает щелкнул в следующем: сделать действие относительно BUTTON1 быть нажата.

Другими словами, если кнопка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 
    } 
    } 
} 
+0

Что означает «нажимается дальше»? Разве разрешено ли ему пока не проверять его электронную почту? –

ответ

2

Из моего понимания того, что вы ищете TODO ...

Так один из способов достижения этой цели является создание переменной экземпляра, логическое, так будет установлен верно, то кнопка была ранее щелкнули, а затем вы можете проверить внутри своего метода, если этот флаг установлен как истинный. Недостатком этого подхода было бы то, что флаг всегда будет прав, как только он будет нажат один раз. Вам нужно будет реализовать способ сброса этого флага.

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 && !hasButtonOneBeenPressed){ 
    System.out.println("This is Jug 0"); 
    // wont be able to print the following 
    } else if(Integer.parseInt(e.getActionCommand()) == 1 && hasButtonOneBeenPressed){ 
     System.out.println("This is Jug 1 AFTER jug 0"); 
    } else { 
     //do something else 
    } 
} 
+0

Я искал более элегантный подход, чем это, как, может быть, свойство, встроенное в слушателей действий.Однако я все равно использовал этот подход, потому что он выполняет свою работу, и другие ответы здесь были в том же духе. – hmz

1

Вы дали поведение ActionListener - это метод actionPerformed, но вы еще дать ему государственные - поля, которые позволяют ему вспомнить, где это и что это сделано , Булево поле или два, вероятно, все, что вам нужно здесь. Либо это, либо поле JButton, в которое вы помещаете последнюю нажатую кнопку - все зависит от того, что вы хотите сделать с этой информацией.

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

0

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

PS: Это использует java 8 lambdas для ActionListeners.

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; 
} 
+0

Как бы вы указали что-то вроде b1.addActionListener ((e) на конкретный метод, например onButton1Pressed()); – hmz

+0

Эта строка кода делает это: b1.addActionListener ((e) -> onButton1Pressed()); – Beowolve