Java swing:使用Listeners和J * Fields管理整数/双精度

时间:2015-11-14 04:29:59

标签: java swing

EDITED

我可能只是盯着WAYYY的屏幕太长了但我觉得有必要在睡觉之前提交这个问题,因为我的谵妄仍然存在......

我遇到的问题是我正在尝试从JTextField textField获取一个int / double并将其转换为(n)int / double以便稍后在侦听器中使用,从侦听器中检索它之后。 。ListenForText实现KeyListener,特别是KeyTyped,通过toString()获取,并将其存储在String txtFldAmnt中。之后,如果复制到编辑器,我将把Integer.parseInt(txtFldAmnt)的结果存储到fldAmnt(fldAmnt = Integer.pareseInt(txtFldAmnt))LINE 99中。一旦它被转换为int我想要能够操作它然后再次使用它,在LINE 173,在新窗口中显示fldAmnt。老实说,我并不关心它是显示的是int还是String,但我知道JTextField需要一个String。我错过了什么魔法?答案总是受欢迎,但我更喜欢学习的机会。此外,因为我对Java很新,所以非常欢迎关于主题指针,批评以及实现此代码的更好方法:)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class GUI extends JFrame{

/**
 * wtf is the serial version UID = 1L
 */
private static final long serialVersionUID = 1L;
private JButton wdBtn;
private JButton dpBtn;
private JButton xferBtn;
private JButton balBtn;
private JRadioButton chkRadio;
private JRadioButton savRadio;
private JTextField textField;
private static String txtFldAmnt;
private static int fldAmnt = 0;
private static Double chkBal = 0.00;
private static Double savBal = 0.00;


public static void main(String[] args){
    new GUI();
}


public GUI() {

    //default location and size
    this.setSize(300,182);
    this.setLocationRelativeTo(null);
    this.setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("ATM Machine");

    //add buttons
    wdBtn = new JButton("Withdraw");
    dpBtn = new JButton("Deposit");
    xferBtn = new JButton("Transfer");
    balBtn = new JButton("Show Balance");
    chkRadio = new JRadioButton("Checking");
    chkRadio.setSelected(false);
    savRadio = new JRadioButton("Savings");
    savRadio.setSelected(false);
    textField = new JTextField("", 20);
    final JLabel textLabel = new JLabel("Enter amount: ");
    textField.setToolTipText("Enter amount");

    //Listener class to pass button listeners
    ListenForButton lForButton = new ListenForButton();
    wdBtn.addActionListener(lForButton);
    dpBtn.addActionListener(lForButton);
    xferBtn.addActionListener(lForButton);
    balBtn.addActionListener(lForButton);
    chkRadio.addActionListener(lForButton);
    savRadio.addActionListener(lForButton);

    ListenForText textFieldListener = new ListenForText();
    textField.addKeyListener(textFieldListener);

    //Configure layouts
    JPanel PANEL = new JPanel();
    PANEL.setLayout(new FlowLayout(FlowLayout.CENTER));
    JPanel panel1 = new JPanel();
    panel1.setLayout(new GridLayout(2,2, 5, 10));
    JPanel panel2 = new JPanel();
    panel2.setLayout(new GridLayout(1,2,10,10));
    panel2.setLayout(new FlowLayout(FlowLayout.CENTER));
    JPanel panel3 = new JPanel();
    panel3.setLayout(new GridLayout(2,1));

    //add buttons to their panels
    panel1.add(wdBtn);
    panel1.add(dpBtn);
    panel1.add(xferBtn);
    panel1.add(balBtn);
    panel2.add(chkRadio);
    panel2.add(savRadio);
    panel3.add(textLabel);
    panel3.add(textField);

    PANEL.add(panel1);
    PANEL.add(panel2);
    PANEL.add(panel3);

    this.add(PANEL);
    //this.setAlwaysOnTop(true);
    this.setVisible(true);
}
//implement listeners
private class ListenForText implements KeyListener {

    @Override
    public void keyTyped(KeyEvent e) {
        txtFldAmnt = (e.toString());
        fldAmnt = Integer.parseInt(txtFldAmnt);

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

}
private class ListenForButton implements ActionListener {

    public void actionPerformed(ActionEvent e){

        //maybe do case/switch statements
        if (e.getSource() == wdBtn) {
            JFrame newFrame = new JFrame("Withdraw Title");
            newFrame.setResizable(false);
            newFrame.setLocationRelativeTo(null);
            newFrame.setSize(300, 91);

            JPanel panel = new JPanel();
            JLabel newLbl = new JLabel("Withdraw Frame", JLabel.CENTER);

            panel.add(newLbl);
            newFrame.add(panel);
            newFrame.setVisible(true);
        }
        if (e.getSource() == dpBtn) {
            JFrame newFrame = new JFrame("Deposit Title");
            /*
             * Set the newFrame.setSize(300,182); to this comment in the if statement to place
             * the window directly over current window
             */
            newFrame.setResizable(false);
            newFrame.setLocationRelativeTo(null);
            newFrame.setSize(300, 91);

            JPanel panel = new JPanel();
            JLabel newLbl = new JLabel("Deposit Frame", JLabel.CENTER);

            panel.add(newLbl);
            newFrame.add(panel);
            newFrame.setVisible(true);
        }
        if (e.getSource() == xferBtn) {
            JFrame newFrame = new JFrame("Transfer Title");

            newFrame.setResizable(false);
            newFrame.setLocationRelativeTo(null);
            newFrame.setSize(300, 91);

            JPanel panel = new JPanel();
            JLabel newLbl = new JLabel("Transfer Frame", JLabel.CENTER);

            panel.add(newLbl);
            newFrame.add(panel);
            newFrame.setVisible(true);
        }
        if (e.getSource() == balBtn){
            JFrame newFrame = new JFrame("Balance Title");

            newFrame.setResizable(false);
            newFrame.setLocationRelativeTo(null);
            newFrame.setSize(300, 91);

            JPanel panel = new JPanel();
            JTextField newLbl = new JTextField(Integer.toString(fldAmnt));

            panel.add(newLbl);
            newFrame.add(panel);
            newFrame.setVisible(true);

        }
    }
}
}

-cheers

以下编辑

感谢答案,我很抱歉这个可怕的描述...但我找到了一个解决方案,但是我不确定它是否合适。 以上例子:

fldAmnt = Integer.pareseInt(txtFldAmnt)

我刚刚添加了一个.getText()//虽然我重写了整个源代码

fldAmnt = Integer.pareseInt(txtFldAmnt.getText())

这对我的整个计划都有用。

我希望我不必在下面发布我的整个代码,但我还没有确定一个存储我所有代码的好地方。 (建议欢迎:D)

但是这里是:     import javax.swing。;     import java.awt.GridLayout;     import java.awt.event。;     import javax.swing.border。*;

public class ATM extends JFrame{
//buttons needed
JButton wBtn;
JButton dBtn;
JButton xBtn;
JButton bBtn;
//radios needed
JRadioButton cRadio;
JRadioButton sRadio;
//Text field needed
JTextField txt;
JLabel txtLabel;
static int withdraw = 0;
Double amount = 0.00;
Double cBal = 100.00;
Double sBal = 100.00;


double number1, number2, totalCalc;

public static void main(String[] args){

    new Lesson22();

}
public ATM(){
    this.setSize(400, 200);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("My Third Frame");

    wBtn = new JButton("Withdraw");

    dBtn = new JButton("Deposit");
    xBtn = new JButton("Transfer");
    bBtn = new JButton("Show Balance");
    cRadio = new JRadioButton("Checking");
    sRadio = new JRadioButton("Savings");
    txtLabel = new JLabel("Amount: $");
    txt = new JTextField("", 10);

    JPanel thePanel = new JPanel();

    // Create an instance of ListenForEvents to handle events

    ListenForButton lForButton = new ListenForButton();

    wBtn.addActionListener(lForButton);
    dBtn.addActionListener(lForButton);
    xBtn.addActionListener(lForButton);
    bBtn.addActionListener(lForButton);


    // How to add a label --------------------------

    // Creates a group that will contain radio buttons
    // You do this so that when 1 is selected the others
    // are deselected

    ButtonGroup operation = new ButtonGroup();

    // Add radio buttons to the group

    operation.add(cRadio);
    operation.add(sRadio);

    // Create a new panel to hold radio buttons

    JPanel operPanel = new JPanel();
    JPanel btnPanel1 = new JPanel();
    JPanel btnPanel2 = new JPanel();
    btnPanel1.setLayout(new GridLayout(1,2));
    btnPanel2.setLayout(new GridLayout(1,2));

    Border btnBorder = BorderFactory.createEmptyBorder();
    btnPanel1.setBorder(btnBorder);
    btnPanel1.add(wBtn);
    btnPanel1.add(dBtn);
    btnPanel2.setBorder(btnBorder);
    btnPanel2.add(xBtn);
    btnPanel2.add(bBtn);


    Border operBorder = BorderFactory.createBevelBorder(1);

    // Set the border for the panel

    operPanel.setBorder(operBorder);

    // Add the radio buttons to the panel

    operPanel.add(cRadio);
    operPanel.add(sRadio);


    // Selects the add radio button by default
    cRadio.setSelected(true);
    JPanel txtPanel = new JPanel();
    txtPanel.add(txtLabel);
    txtPanel.add(txt);


    thePanel.add(btnPanel1);
    thePanel.add(btnPanel2);
    thePanel.add(operPanel);
    thePanel.add(txtPanel);
    thePanel.setLayout(new GridLayout(4,2));
    this.add(thePanel);

    this.setVisible(true);

    txt.requestFocus();

}

private class ListenForButton implements ActionListener{

    // This method is called when an event occurs

    public void actionPerformed(ActionEvent e){
        /******************************************************
         * THIS IS FOR CHECKING
         *****************************************************/
        // Check if the source of the event was the button
        if(cRadio.isSelected()){
            if(e.getSource() == wBtn){
                try {
                    amount = Double.parseDouble(txt.getText());
                    cBal -= amount;
                }
                catch(NumberFormatException excep){
                    JOptionPane.showMessageDialog(ATM.this, 
                            "Please enter a valid number in multiples of 20", 
                            "ERROR", JOptionPane.ERROR_MESSAGE);
                }
            }
            if(e.getSource() == bBtn){
                JFrame bFrame = new JFrame();
                bFrame.setSize(300, 182);
                bFrame.setLocationRelativeTo(null);
                JPanel panel = new JPanel();
                JLabel cLabel = new JLabel(Double.toString(cBal));
                JLabel CLBL = new JLabel("Checking: ");
                panel.add(CLBL);
                panel.add(cLabel);
                bFrame.add(panel);
                bFrame.setVisible(true);
            }

            if(e.getSource() == dBtn){
                amount = Double.parseDouble(txt.getText());
                cBal += amount;
            }
            if(e.getSource() == xBtn){
                amount = Double.parseDouble(txt.getText());
                if (sBal >= 0 && sBal >= amount){
                    cBal += amount;
                    sBal -= amount;
                }
                else if (sBal < amount) {
                    JOptionPane.showMessageDialog(ATM.this,
                            "INSUFFICENT FUNDS", "ERROR", 
                            JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        /******************************************************
         * THIS IS FOR SAVINGS
         *****************************************************/
        if(sRadio.isSelected()){
            if(e.getSource() == wBtn){
                try {
                    amount = Double.parseDouble(txt.getText());
                    if(sBal >= 0 && sBal >= amount){
                        sBal -= amount;
                    }
                    else if (sBal < amount) {
                        JOptionPane.showMessageDialog(ATM.this,
                                "INSUFFICENT FUNDS", "ERROR", 
                                JOptionPane.ERROR_MESSAGE);
                    }
                }
                catch(NumberFormatException excep){
                    JOptionPane.showMessageDialog(ATM.this, 
                            "Please enter a valid number in multiples of 20", 
                            "ERROR", JOptionPane.ERROR_MESSAGE);
                }
            }
            if(e.getSource() == bBtn){
                JFrame bFrame = new JFrame();
                bFrame.setSize(300, 182);
                bFrame.setLocationRelativeTo(null);
                JPanel panel = new JPanel();
                JLabel sLabel = new JLabel(Double.toString(sBal));
                JLabel SLBL = new JLabel("Savings: ");
                panel.add(SLBL);
                panel.add(sLabel);

                bFrame.add(panel);
                bFrame.setVisible(true);
            }

            if(e.getSource() == dBtn){
                try{
                    amount = Double.parseDouble(txt.getText());
                    sBal += amount;
                }
                catch(NumberFormatException excep){
                    JOptionPane.showMessageDialog(ATM.this, 
                            "Please enter a valid number!", 
                            "ERROR", JOptionPane.ERROR_MESSAGE);
                }
            }
            if(e.getSource() == xBtn){
                amount = Double.parseDouble(txt.getText());
                if (cBal >= 0 && cBal >= amount){
                    sBal += amount;
                    cBal -= amount;
                }
                else if (cBal < amount) {
                    JOptionPane.showMessageDialog(ATM.this,
                            "INSUFFICENT FUNDS", "ERROR", 
                            JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }
}
}

...顺便说一下,任何人都可以解释这个警告信息: 可序列化类ATM未声明类型为long的静态最终serialVersionUID字段

如果不是简单的不打扰。我有空的时候会继续研究它。

这还不完整,但谢谢大家的帮助!

1 个答案:

答案 0 :(得分:3)

KeyListener任何JTextComponent都是个坏主意。

要监控文本组件的更改,请使用DocumentListener过滤文本组件可以处理的内容,使用DocumentFilter。有关详细信息,请参阅Listening for Changes on a DocumentImplementing a Document FilterDocumentFilter Examples

在您的情况下,最好使用JSpinnerJFormattedTextField,因为它们旨在处理(除其他事项外)数字

有关详细信息,请参阅How to Use SpinnersHow to Use Formatted Text Fields