如何在点击'enter pin ok'按钮后才能看到txPanel?

时间:2012-03-13 07:36:39

标签: java swing applet jbutton actionlistener

public class ATMgui extends JFrame implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public static final int WIDTH = 500;
    public static final int HEIGHT = 200;
    private ATMbizlogic theBLU;// short for the Business Logic Unit
    public JLabel totalBalanceLabel;
    public JTextField withdrawTextField;
    public JTextField depositTextField;
    public JTextField pinTextField;

    /**
     * Creates a new instance of ATMgui
     */
    public ATMgui() {
        setTitle("ATM Transactions");
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        Container contentPane = getContentPane();
        contentPane.setBackground(Color.BLACK);
        contentPane.setLayout(new BorderLayout());


        // Do the panel for the rest stop
        JLabel start = new JLabel("Welcome To Your Account", JLabel.CENTER);
        Font curFont = start.getFont();
        start.setFont(new Font(curFont.getFontName(), curFont.getStyle(), 25));
        start.setForeground(Color.BLUE);
        start.setOpaque(true);
        start.setBackground(Color.BLACK);


        pinTextField = new JTextField();
        JLabel pinLabel = new JLabel("Enter your PIN below:", JLabel.CENTER);
        pinLabel.setForeground(Color.RED);
        pinLabel.setOpaque(true);
        pinLabel.setBackground(Color.WHITE);



        JButton pinButton = new JButton("Enter Pin OK");
        pinButton.addActionListener(this);
        pinButton.setBackground(Color.red);

        JPanel pinPanel = new JPanel();
        pinPanel.setLayout(new GridLayout(3, 1, 100, 0));

        pinPanel.add(pinLabel);
        pinPanel.add(pinTextField);
        pinPanel.add(pinButton);

        contentPane.add(pinPanel, BorderLayout.WEST);


        JPanel headingPanel = new JPanel();
        headingPanel.setLayout(new GridLayout());
        headingPanel.add(start);

        contentPane.add(headingPanel, BorderLayout.NORTH);


        // Do the panel for the amount & type of transactions
        withdrawTextField = new JTextField();
        JLabel withdrawLabel = new JLabel("Withdraw (0.00)", JLabel.CENTER);
        withdrawLabel.setForeground(Color.RED);
        withdrawLabel.setOpaque(true);
        withdrawLabel.setBackground(Color.WHITE);



        depositTextField = new JTextField();
        JLabel depositLabel = new JLabel("Deposit (0.00)", JLabel.CENTER);
        depositLabel.setForeground(Color.RED);
        depositLabel.setOpaque(true);
        depositLabel.setBackground(Color.WHITE);



        JButton txButton = new JButton("Transactions OK");
        txButton.addActionListener(this);
        txButton.setBackground(Color.red);




        JPanel txPanel = new JPanel();
        txPanel.setLayout(new GridLayout(5, 1, 30, 0));

        txPanel.add(withdrawLabel);
        txPanel.add(withdrawTextField);
        txPanel.add(depositLabel);
        txPanel.add(depositTextField);
        txPanel.add(txButton);

        contentPane.add(txPanel, BorderLayout.EAST);
        txPanel.setVisible(true);


        totalBalanceLabel = new JLabel("Your balance after transactions: ", JLabel.CENTER);
        totalBalanceLabel.setForeground(Color.BLUE);
        totalBalanceLabel.setOpaque(true);
        totalBalanceLabel.setBackground(Color.BLACK);


        contentPane.add(totalBalanceLabel, BorderLayout.SOUTH);


        theBLU = new ATMbizlogic();
    }

    public void actionPerformed(ActionEvent e) {
        String actionCommand = e.getActionCommand();

        // Container contentPane = getContentPane();

        if (actionCommand.equals("Transactions OK")) {
            try {
                double deposit = Double.parseDouble(depositTextField.getText().trim());
                double withdraw = Double.parseDouble(withdrawTextField.getText().trim());
                theBLU.computeBalance(withdraw, deposit);
                totalBalanceLabel.setText("Your balance after transactions: " + theBLU.getBalance());

            } catch (ATMexception ex) {
                totalBalanceLabel.setText("Error: " + ex.getMessage());
            } catch (Exception ex) {
                totalBalanceLabel.setText("Error in deposit or withdraw amount: " + ex.getMessage());
            }
        } else if (actionCommand.equals("Enter Pin OK")) {

            try {

                double pin = Double.parseDouble(pinTextField.getText().trim());
                theBLU.checkPin(pin);

                totalBalanceLabel.setText("Your balance after transactions: " + theBLU.getBalance());



            } catch (ATMexception ex) {
                totalBalanceLabel.setText("Error: " + ex.getMessage());
            } catch (Exception ex) {
                totalBalanceLabel.setText("Error in pin: " + ex.getMessage());

            }
        } else {
            System.out.println("Error in button interface.");
        }
    }

    public static void main(String[] args) {
        ATMgui gui = new ATMgui();
        gui.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:2)

我认为这不是为按钮实现ActionListeners的正确方法。

public void actionPerformed(ActionEvent e) 
    {   
       String actionCommand = e.getActionCommand();

      // Container contentPane = getContentPane();
        if (actionCommand.equals("Transactions OK"))
        else ...
    }

使用actionPerformed方法中的if-else stamements,每次按下任何按钮时,程序都会被强制检查要调用的侦听器,这样,您的代码就不容易编辑和重用。 此外,GUI容器就像一个事件的接收者,然后你应该避免

pinButton.addActionListener(this);

尝试为每个按钮实现自己的内部类,如下所示:

JButton pinButton = new JButton("Enter Pin OK");
        pinButton.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent ae){
                    //enter here your action
                                     txPanel.setVisible(true);
                }
            });

通过这种方式,您不需要为您的类实现ActionListener接口,因为您正在为pinButton实现接口的内部功能。检查SO的this old question。 此外,您应该避免在类构造函数中实现所有GUI元素,最好在单独的方法中实现GUI,例如createAndShowGui(),并在构造函数中调用它,以尊重Java Swing conventions和在不同的线程中运行Swing组件,称为Event Dispatch Thread,与应用程序的主线程不同。阅读this question

然后在txPanel.setVisible(false);方法中加入createAndShowGui()

请记住,Swing组件不是线程安全的。

答案 1 :(得分:1)

由于您粘贴的代码不起作用,我已经为您制作了一个小程序,看一看,看看您可以做些什么更改以便将其合并到您的案例中:

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

public class PanelTest extends JFrame
{
    private JPanel eastPanel;

    public PanelTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        Container container = getContentPane();

        eastPanel = new JPanel();
        eastPanel.setBackground(Color.DARK_GRAY);

        JPanel westPanel = new JPanel();
        westPanel.setBackground(Color.YELLOW);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.BLUE);

        container.add(eastPanel, BorderLayout.LINE_START);
        container.add(centerPanel, BorderLayout.CENTER);
        container.add(westPanel, BorderLayout.LINE_END);
        eastPanel.setVisible(false);

        JButton showButton = new JButton("Click Me to Display EAST JPanel");
        showButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                eastPanel.setVisible(true);
            }
        });

        JButton hideButton = new JButton("Click Me to Hide EAST JPanel");
        hideButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                eastPanel.setVisible(false);
            }
        });

        container.add(hideButton, BorderLayout.PAGE_START);
        container.add(showButton, BorderLayout.PAGE_END);

        setSize(300, 300);
        setVisible(true);
    }

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

从以后开始,永远不要将NORTHEASTWESTSOUTH用于BorderLayout。它们已分别替换为PAGE_STARTLINE_STARTLINE_ENDPAGE_END

BorderLayout对象有五个区域。这些区域由BorderLayout常量指定:

  • PAGE_START
  • PAGE_END
  • LINE_START
  • LINE_END
  • CENTER

版本说明: 在JDK 1.4版之前,各个区域的首选名称是不同的,从罗盘的点(例如,顶部区域的BorderLayout.NORTH)到我们在示例中使用的常量的更多版本。我们的示例使用的常量是首选,因为它们是标准的,并使程序能够适应具有不同方向的语言。

我修改了checkPin(...)类的ATMLogin方法以返回boolean而不是void,因此在actionPerformed(...)方法中ATMgui 1}} class,如果这个东西返回true,那么只是将所需的JPanel设置为可见,否则什么都不做。

请检查代码并查看您可以采取哪些更改,以使其适用于您的目的。

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

public class ATMgui extends JFrame implements ActionListener 
{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public static final int WIDTH = 500;
    public static final int HEIGHT = 200;
    private ATMbizlogic theBLU;// short for the Business Logic Unit
    private JPanel txPanel;
    public JLabel totalBalanceLabel;
    public JTextField withdrawTextField;
    public JTextField depositTextField;
    public JTextField pinTextField;

    /**
     * Creates a new instance of ATMgui
     */
    public ATMgui() 
    {
        setTitle("ATM Transactions");
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        Container contentPane = getContentPane();
        contentPane.setBackground(Color.BLACK);
        contentPane.setLayout(new BorderLayout());


        // Do the panel for the rest stop
        JLabel start = new JLabel("Welcome To Your Account", JLabel.CENTER);
        Font curFont = start.getFont();
        start.setFont(new Font(curFont.getFontName(), curFont.getStyle(), 25));
        start.setForeground(Color.BLUE);
        start.setOpaque(true);
        start.setBackground(Color.BLACK);


        pinTextField = new JTextField();
        JLabel pinLabel = new JLabel("Enter your PIN below:", JLabel.CENTER);
        pinLabel.setForeground(Color.RED);
        pinLabel.setOpaque(true);
        pinLabel.setBackground(Color.WHITE);



        JButton pinButton = new JButton("Enter Pin OK");
        pinButton.addActionListener(this);
        pinButton.setBackground(Color.red);

        JPanel pinPanel = new JPanel();
        pinPanel.setLayout(new GridLayout(3, 1, 100, 0));

        pinPanel.add(pinLabel);
        pinPanel.add(pinTextField);
        pinPanel.add(pinButton);

        contentPane.add(pinPanel, BorderLayout.WEST);


        JPanel headingPanel = new JPanel();
        headingPanel.setLayout(new GridLayout());
        headingPanel.add(start);

        contentPane.add(headingPanel, BorderLayout.NORTH);


        // Do the panel for the amount & type of transactions
        withdrawTextField = new JTextField();
        JLabel withdrawLabel = new JLabel("Withdraw (0.00)", JLabel.CENTER);
        withdrawLabel.setForeground(Color.RED);
        withdrawLabel.setOpaque(true);
        withdrawLabel.setBackground(Color.WHITE);



        depositTextField = new JTextField();
        JLabel depositLabel = new JLabel("Deposit (0.00)", JLabel.CENTER);
        depositLabel.setForeground(Color.RED);
        depositLabel.setOpaque(true);
        depositLabel.setBackground(Color.WHITE);



        JButton txButton = new JButton("Transactions OK");
        txButton.addActionListener(this);
        txButton.setBackground(Color.red);




        txPanel = new JPanel();
        txPanel.setLayout(new GridLayout(5, 1, 30, 0));

        txPanel.add(withdrawLabel);
        txPanel.add(withdrawTextField);
        txPanel.add(depositLabel);
        txPanel.add(depositTextField);
        txPanel.add(txButton);

        contentPane.add(txPanel, BorderLayout.EAST);
        txPanel.setVisible(false);


        totalBalanceLabel = new JLabel("Your balance after transactions: ", JLabel.CENTER);
        totalBalanceLabel.setForeground(Color.BLUE);
        totalBalanceLabel.setOpaque(true);
        totalBalanceLabel.setBackground(Color.BLACK);


        contentPane.add(totalBalanceLabel, BorderLayout.SOUTH);


        theBLU = new ATMbizlogic();
    }

    public void actionPerformed(ActionEvent e) 
    {
        String actionCommand = e.getActionCommand();

        // Container contentPane = getContentPane();

        if (actionCommand.equals("Transactions OK")) 
        {
            try 
            {
                double deposit = Double.parseDouble(depositTextField.getText().trim());
                double withdraw = Double.parseDouble(withdrawTextField.getText().trim());
                theBLU.computeBalance(withdraw, deposit);
                totalBalanceLabel.setText("Your balance after transactions: " + theBLU.getBalance());

            } 
            /*catch (ATMexception ex) 
            {
                totalBalanceLabel.setText("Error: " + ex.getMessage());
            }*/ 
            catch (Exception ex) 
            {
                totalBalanceLabel.setText("Error in deposit or withdraw amount: " + ex.getMessage());
            }
        } 
        else if (actionCommand.equals("Enter Pin OK")) 
        {

            try 
            {               
                double pin = Double.parseDouble(pinTextField.getText().trim());
                if(theBLU.checkPin(pin))
                    txPanel.setVisible(true);
                totalBalanceLabel.setText("Your balance after transactions: " + theBLU.getBalance());               
            } 
            /*catch (ATMexception ex) 
            {
                totalBalanceLabel.setText("Error: " + ex.getMessage());
            }*/ 
            catch (Exception ex) 
            {
                totalBalanceLabel.setText("Error in pin: " + ex.getMessage());
                ex.printStackTrace();
            }
        } 
        else 
        {
            System.out.println("Error in button interface.");
        }
    }

    public static void main(String[] args) 
    {
        ATMgui gui = new ATMgui();
        gui.setVisible(true);
    }
}

class ATMbizlogic 
{

    private double totalBalance;
    private boolean rightPinEntered;

    /**
     * Creates a new instance of ATMbizlogic
     */
    public ATMbizlogic() 
    {
        totalBalance = 0.0;
        rightPinEntered =  true;
    }

    public void computeBalance(double withdraw, double deposit)
    //throws ATMexception 
    {
        if(withdraw <=0)
        {
            System.out.println("Negative withdraw not allowed");
            //throw new ATMexception("Negative withdraw not allowed");
        }   

        if(deposit <=0)
        {
            System.out.println("Negative deposit not allowed");
            //throw new ATMexception("Negative deposit not allowed");
        }   

         double balance = deposit - withdraw;

        totalBalance = totalBalance + balance;
    }

    public boolean checkPin(double pin)
    //throws ATMexception 
    {
        if(pin <=0)
        {
            System.out.println("Negative pin not allowed");
            rightPinEntered = false;
            //throw new ATMexception("Negative pin not allowed");
        }   
        /*else if(rightPinEntered == false)
        {
            System.out.println("Can not take another pin");
            rightPinEntered = false;
            //throw new ATMexception("Can not take another pin");
        }*/ 
        else if(pin<1111 || pin>9999)
        {
            System.out.println("Enter a valid pin");
            rightPinEntered = false;
            //throw new ATMexception("Enter a valid pin");
        }
        else
        {       
            rightPinEntered = true;
        }

        return rightPinEntered;
    }

    public double getBalance()
    {
        return totalBalance;
    }
}