Java 多按钮 Action

标签 java swing user-interface jbutton

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

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

感谢您的帮助;)

P.S 我为 ATM 机的每个部分都有一个类(class)。 EG:键盘、屏幕、ATM..等

P.S.S 如果您想查看一些代码,请告诉;)

最佳答案

包含键盘组件和“确定”按钮的组件应将自身注册为所有组件的 ActionListener。为了区分源组件,请使用 EventObjectgetSource() 方法。一旦您确定哪个组件生成了事件,请将号码添加到集合中,或者验证输入的 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

a) PIN 长度无效

enter image description here

b) 有效 PIN 长度

enter image description here

关于Java 多按钮 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650347/

相关文章:

java - 创建一个最初为空但允许用户动态添加行的 Java 表模型

java - JTextArea 不会在 MigLayout 中垂直更改大小

java - JLabel.setText() 仅为循环中的最后一个元素设置文本

java - 获取 JFileChooser 中所选文件的大小和名称?

java - 类的默认值

java - 使用 LinkedBlockingQueue 并刷新到 mysql

java - JTable 的单元格渲染器 - 彩色行

java - 如何在字体更改时强制 JTree 中的 HTML JLabel 调整大小

ios - scrollView 的 ContentInset

java - IBM-Watson 异步请求失败