JButton ActionListeners разные переменные в каждом цикле - PullRequest
0 голосов
/ 07 декабря 2018

Я делаю простой калькулятор, используя JFrame и JButtons.До того, как я сделал каждую кнопку с 0 по 9 со своими собственными слушателями действий, теперь я понял, что это супер неэффективно, и я должен использовать цикл для создания каждой кнопки и назначения ActionListeners.Таким образом, единственное, что должно происходить в каждом ActionListener - это добавлять любой номер кнопки в JTextField, называемый nums.Вот что у меня сейчас есть.

for(int i = 0; i <=9; i++) {
        count = i;
        btns.get(i).addActionListener(new ActionListener(){ //makes action listeners for each button
            public void actionPerformed(ActionEvent e){ 

                    nums.setText(nums.getText()+ count);//IMPORTANT CODE

            }       
        });
      }

Итак, как вы можете видеть, я использовал переменную с ужасным именем count.count устанавливается на i в каждой итерации перед использованием важного кода.Я должен сделать это, потому что AL является его собственным классом и не может получить доступ к i.Однако count является открытым и статическим, поэтому AL могут использовать count.

Моя проблема в том, что все кнопки печатают 9. Это логично, потому что происходит то, что AL в каждой кнопке используют переменную count, когда цикл завершится, count будет 9, что означает каждыйAL по существу будет содержать nums.setText(nums.getText()+ 9);.Вместо этого мне нужно, чтобы кнопка 1 была nums.setText(nums.getText()+ 1); 2, чтобы быть 2, ETC.

Я попытался вызвать текст каждой кнопки, однако, поскольку вам нужно использовать индекс в методе get ArrayList, вам нужна переменная, если вы используете count, возникает та же проблема;после завершения цикла for счетчик равен 9, поэтому все кнопки печатают текст кнопки 9.

Любая и вся помощь приветствуется, заранее спасибо, -Max

PS Простов случае, если вы не понимаете, почему я получаю текст, а затем добавляю счетчик, это потому, что для того, чтобы набрать число 12. вам нужно набрать 1, а затем соединить 2 с тем, что в et 12. getText получает1, и добавление счетчика объединяет 2, чтобы получить 12.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

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

private ActionListener numberBtnListener = new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
        JButton b = (JButton) e.getSource();
        nums.setText(nums.getText() + b.getText());
    }       
}

Тогда просто используйте тот же слушательэкземпляр для каждой кнопки:

for(JButton b : btns) {
    b.addActionListener(numberBtnListener);
}

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

 b.putClientProperty("digit", i);  

, затем используйте

nums.setText(nums.getText() + b.getClientProperty("digit"));
0 голосов
/ 07 декабря 2018

В общем, вы захотите избегать использования статических полей, поскольку при этом вы потеряете все преимущества объектно-ориентированного программирования.Есть определенные места для использования статических полей, но это не одно из них.В вашей ситуации вы не можете напрямую использовать индекс цикла i, поскольку он не является конечной локальной переменной, и неокончательные локальные переменные нельзя использовать в анонимных внутренних классах.Таким образом, существует простое решение:

Сделайте подсчет конечной локальной переменной, и вы сможете использовать ее в своем анонимном внутреннем классе:

for(int i = 0; i <= 9; i++) {
    final int finalCount = i;
    btns.get(i).addActionListener(new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 

            nums.setText(nums.getText() + finalCount);

        }       
    });
}
...