Java многократное действие кнопки - PullRequest
2 голосов
/ 28 декабря 2011

Мне нужно разработать приложение Java с графическим интерфейсом, который представляет собой банкомат.Для этого я должен прочитать номер счета и PIN-код с «клавиатуры» (9 кнопок).Я должен прочитать каждое действие каждой нажатой кнопки (слушатель действия возвращает значение кнопки) и объединить его номер в строку, которая при нажатии кнопки «ОК» должна возвращать int (Integer.parseInt()).Моя проблема в том, как я могу "подождать \ остановить \ заморозить" мою программу, пока не введу цифры и не нажму "ОК"?

Извините, если этот вопрос немного сбивает с толку

Спасибоза вашу помощь;)

PS У меня есть класс для каждого участника банкомата.Например: клавиатура, экран, банкомат ... и т. Д.

PSS Если вы хотите увидеть какой-нибудь код, скажите;)

Ответы [ 5 ]

6 голосов
/ 28 декабря 2011

Компонент, который содержит компоненты клавиатуры и кнопку «ОК», должен регистрироваться как ActionListener для всех них. Чтобы различать исходные компоненты, используйте метод getSource() из EventObject. Как только вы выяснили, какой компонент сгенерировал событие, либо добавьте номер к набору, либо подтвердите введенный PIN-код.


Следующий фрагмент кода пытается проверить длину введенного PIN-кода:

Пример -

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.text.MaskFormatter;

final class ATMDemo extends JFrame implements ActionListener{
    private static final long serialVersionUID = -8099290319139531183L;
    private final JFormattedTextField textField;
    private final JPanel layerOne;
    private final JPanel layerTwo;
    private final JPanel layerThree;
    private final JPanel layerFour;
    private final JPanel layerFive;
    private final JPanel layerSix;
    private final JButton one;
    private final JButton two;
    private final JButton three;
    private final JButton four;
    private final JButton five;
    private final JButton six;
    private final JButton seven;
    private final JButton eight;
    private final JButton nine;
    private final JButton zero;
    private final JButton okButton;
    private final JButton clearButton;

    private ATMDemo() throws ParseException{
        super("ATM Demo");
        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        layerOne = new JPanel();
        layerTwo = new JPanel();
        layerThree = new JPanel();
        layerFour = new JPanel();
        layerFive = new JPanel();
        layerSix = new JPanel();

        // Add layer one
        textField = new JFormattedTextField(new MaskFormatter("*********"));
        textField.setEditable(false);
        textField.setColumns(7);
        layerOne.add(textField);

        // Add layer two
        one = new JButton(String.valueOf(1));
        two = new JButton(String.valueOf(2));
        three = new JButton(String.valueOf(3));
        layerTwo.add(one);
        layerTwo.add(two);
        layerTwo.add(three);

        // Add layer three
        four = new JButton(String.valueOf(4));
        five = new JButton(String.valueOf(5));
        six = new JButton(String.valueOf(6));
        layerThree.add(four);
        layerThree.add(five);
        layerThree.add(six);

        // Add layer four
        seven = new JButton(String.valueOf(7));
        eight = new JButton(String.valueOf(8));
        nine = new JButton(String.valueOf(9));
        layerFour.add(seven);
        layerFour.add(eight);
        layerFour.add(nine);

        // Add layer five
        zero = new JButton(String.valueOf(0));
        layerFive.add(zero);

        // Add layer six
        okButton = new JButton("OK");
        clearButton = new JButton("Clear");
        layerSix.add(okButton);
        layerSix.add(clearButton);
    }

    @Override
    public final void actionPerformed(final ActionEvent e) {
        final JButton source = (JButton)e.getSource();
        if(source.equals(okButton)){
            if(textField.getValue() != null && textField.getValue().toString().length() != 9){
                JOptionPane.showMessageDialog(this, "Invalid PIN length - must be 9 digits long.", "Error", JOptionPane.ERROR_MESSAGE);
            }
            else{
                JOptionPane.showMessageDialog(this, "Valid PIN length.", "Valid", JOptionPane.INFORMATION_MESSAGE);
            }
            clearButton.doClick();
        }
        else if(source.equals(clearButton)){
            textField.setValue(null);
        }
        else{
            final StringBuilder sb = new StringBuilder();
            if(textField.getValue() != null){
                for(char c: textField.getValue().toString().toCharArray()){
                    sb.append(c);
                }
            }

            if(sb.length() != 9){
                sb.append(source.getText());
                textField.setValue(sb);
            }
        }
    }

    static final ATMDemo newInstance() throws ParseException{
        final ATMDemo demo = new ATMDemo();
        demo.one.addActionListener(demo);
        demo.two.addActionListener(demo);
        demo.three.addActionListener(demo);
        demo.four.addActionListener(demo);
        demo.five.addActionListener(demo);
        demo.six.addActionListener(demo);
        demo.seven.addActionListener(demo);
        demo.eight.addActionListener(demo);
        demo.nine.addActionListener(demo);
        demo.zero.addActionListener(demo);
        demo.okButton.addActionListener(demo);
        demo.clearButton.addActionListener(demo);
        demo.add(demo.layerOne);
        demo.add(demo.layerTwo);
        demo.add(demo.layerThree);
        demo.add(demo.layerFour);
        demo.add(demo.layerFive);
        demo.add(demo.layerSix);
        demo.setSize(225, 250);
        demo.setLocationRelativeTo(null);
        return demo;
    }

    public static final void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                try {
                    ATMDemo.newInstance().setVisible(true);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

enter image description here

а) Неверная длина ПИН-кода

enter image description here

b) Действительная длина PIN-кода

enter image description here

3 голосов
/ 28 декабря 2011
  1. Создать JFrame.
  2. Создать переменную экземпляра с именем pinString.Инициализируйте его как "".
  3. Создайте 'JPanel'.
  4. Определите класс ActionListener для ваших кнопок.В конструкторе поместите текст, который добавит кнопка ActionListener, если будет нажата ее кнопка.
  5. Создайте 9 кнопок.Добавьте ActionListener к каждому.Для JButton 1, заставьте ActionListener добавить «1».Для JButton 2, добавьте «2».Etc .....
  6. Добавьте кнопки в JPanel.
  7. Создайте еще один JButton, кнопку OK.
  8. Имейте своего слушателя действия Integer.parseInt() pinString и проверьтепроанализируйте значение с помощью реального PIN-кода и сделайте все, что хотите, если они совпадают или не совпадают.
  9. Добавьте кнопку на панель.
  10. Установите панель содержимого фрейма в качествепанель.
  11. Показать / упаковать кадр.Это должно работать.
2 голосов
/ 28 декабря 2011

Возможно, вы ищете что-то вроде модального диалога. Е.Г.

String pinString = JOptionPane.showInputDialog(parent, "PIN");

Это «заморозит» основной графический интерфейс, пока не будет закрыт.

Проверьте возвращаемое значение. Если это null, пользователь отменил диалог.

2 голосов
/ 28 декабря 2011

Это помогло бы посмотреть на другой код;Java-калькулятор учебники много.В принципе, вы можете отключить кнопку ОК (setEnabled(false)) и добавить 4 глобальные строки в общую строку: setEnabled(pinCode.length() == 4).

2 голосов
/ 28 декабря 2011

Вы не хотите "заморозить" вашу программу. Вместо этого вы хотите закодировать его так, чтобы слушатель, который реагирует на нажатие кнопки OK, выполнял свои действия только в том случае, если цифровые кнопки были нажаты ранее. Это потребует, чтобы вы дали классу переменную, в которой хранятся результаты последних нажатий кнопок ххх (для этой или даже простой строки может работать массив или список), а затем в прослушивателе вашей кнопки «ОК» есть блок if, который проверяет эта переменная, и если все в порядке, выполняет свою магию.

Например, вы могли бы иметь String с именем pinInput и иметь его = "" или пустую String (или лучше StringBuilder - но это не совсем необходимо для вашей простой программы). В каждом слушателе номерной кнопки вы объединяете строку, представляющую число, нажатое на строку pinInput. В прослушивателе кнопки OK вы проверяете, превышает ли длина pinInput длину минимально требуемых символов, и если да, возьмите последние x символов из строки и проверьте, соответствуют ли они PIN-коду.

Edit:
Вы заявляете:

Класс ATM будет «основным» в программе и будет вызывать метод readInt () класса Keypad. это должно быть здесь, чтобы я получил номер, который ввел пользователь.

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

Независимо от того, как вы смотрите на это, вам нужно будет использовать прослушиватели, чтобы ваша программа реагировала на события («управляемая событиями»). Вот как работает Java Swing GUI.

Редактировать 2
Например, вот код, в котором JFrame содержит JPanel, на котором есть JButtons, и JFrame отвечает, только если кнопки на JPanel нажимаются в определенном порядке - A, затем B, затем OK:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class AnExample {
   private static void createAndShowGui() {
      AnExample mainPanel = new AnExample();

      JFrame frame = new AnExMain();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class AnExMain extends JFrame {
   private JTextField field = new JTextField(
         "Press A, then B, then OK, in that order", 20);
   private Control control = new Control(this);

   public AnExMain() {
      add(field, BorderLayout.PAGE_START);
      add(new InnerPanel(control), BorderLayout.CENTER);
   }

   public void fieldSetText(String text) {
      field.setText(text);
   }
}

class Control {
   private AnExMain anExMain;
   private String data = "";

   public Control(AnExMain anExMain) {
      this.anExMain = anExMain;
   }

   public void btnPressed(String actionCommand) {
      anExMain.fieldSetText("");
      if (actionCommand.equals("OK")) {
         if (data.equals("AB")) {
            anExMain.fieldSetText("Buttons pressed in proper order!");
         }
         data = "";
      } else {
         data += actionCommand;
         if (data.length() > 2) {
            data = data.substring(data.length() - 2);
         }
      }      
   }

}

class InnerPanel extends JPanel {

   public InnerPanel(final Control control) {
      JButton btnA = new JButton("A");
      JButton btnB = new JButton("B");
      JButton btnOK = new JButton("OK");

      add(btnA);
      add(btnB);
      add(btnOK);

      ActionListener listener = new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            control.btnPressed(e.getActionCommand());
         }
      };
      btnA.addActionListener(listener);
      btnB.addActionListener(listener);
      btnOK.addActionListener(listener);
   }
}
...