Java多按钮动作

use*_*437 2 java user-interface swing jbutton

我需要开发一个带有GUI的Java应用程序,它代表一台ATM机器.为此,我必须从"键盘"(9个按钮)中读取帐号和PIN.我必须读取按下的每个按钮的每个动作(动作监听器返回按钮的值),并将其数字连接到一个字符串,当按下"ok"按钮时它应该返回int(Integer.parseInt()).我的问题是如何"等待\停止\冻结"我的程序,直到引入数字并按下"确定"?

如果这个问题有点令人困惑,我很抱歉

谢谢你的帮助 ;)

PS我为ATM机的每个部分都有一个班级.EG:键盘,屏幕,ATM等.

PSS如果你想看一些代码,请告诉;)

mre*_*mre 6

该组件包含键盘组件和"确定"按钮,应该将其自身注册为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();
                }
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

a)PIN长度无效

在此输入图像描述

b)有效的PIN长度

在此输入图像描述