1

因此,对于我目前正在学习的课程,我需要创建一个 ATM 系统。所以,我决定有2个面板。一个主面板,所有过程都在其中发生,一个选项面板,其中为用户列出了选项。如上所述,问题是我似乎无法删除主面板,因此我实际上可以用面板替换它,例如创建帐户屏幕。事实上,所发生的只是终端窗口显示。完全空白。据我检查,按钮事件正在触发,它甚至超过了删除功能。

无论如何,我似乎无法弄清楚问题是什么,也许是因为被按下的按钮也被面板删除了。这是相关的代码。

public class AccountSystem extends JFrame implements ActionListener
{
    public static Account currentuser = new Account(); //This is so that the methods know which account is currently logged in so they can perform operations on it.
    public static int count=0;
    public static Account acc[] = new Account[1000];
    public static String parts[] = new String[3];
    private JButton login, logout, createacc, deposit1, deposit2, withdraw1, withdraw2, transfer1, transfer2, nevermind;
    private JPanel options, mainarea, titlecard;
    private JTextField username, password, transfer, depositarea, withdrawarea, retypearea;
    private JLabel userprompt, depositprompt, withdrawpromt, balancedisp, passwordprompt, mainmessage, title;
    private String newuser, newpass, newpassconfirm;
    BorderLayout borderlayout;
    GridLayout gridlayout;
    public AccountSystem()
    {
        borderlayout = new BorderLayout();
        borderlayout.setHgap(5);
        borderlayout.setVgap(5);
        //Establishing our buttons here.
        JButton login = new JButton("Login");
        login.addActionListener(this);
        JButton createacc = new JButton("New Account");
        createacc.addActionListener(this);

        //Establishing our panels here.
        JPanel options = new JPanel();
        JPanel mainarea = new JPanel();
        JPanel titlecard = new JPanel();
        //Establishing our JLabel here.
        JLabel userprompt = new JLabel("Username: ");
        JLabel passwordprompt = new JLabel("Password: ");
        JLabel title = new JLabel(" LOGIN ");
        //Establishing our textfields here.
        JTextField username = new JTextField(20);
        JTextField password = new JTextField(20);
        JTextField transfer = new JTextField(20);
        JTextField withdrawarea = new JTextField(20);
        //Building the GUI here.
        titlecard.setSize(500,50);
        titlecard.setLocation (0,0);
        mainarea.setSize(300,450);
        mainarea.setLocation(0,50);
        options.setSize(150,450);
        options.setLocation(300,50);
        titlecard.add(title);
        mainarea.add(userprompt);
        mainarea.add(username);
        mainarea.add(passwordprompt);
        mainarea.add(password);
        mainarea.add(login);
        mainarea.add(createacc);
        getContentPane().setLayout(null);
        getContentPane().add(titlecard);
        getContentPane().add(mainarea);
        getContentPane().add(options);
    }
}

public void actionPerformed (ActionEvent e) 
{
    if ((e.getActionCommand()).equals("Login"))
    {
        login();
    }
    else if ((e.getActionCommand()).equals("New Account"))
    {
        accountmaker();
    }
    else if ((e.getActionCommand()).equals("Deposit Funds"))
    {
        deposit();
    }
    else if ((e.getActionCommand()).equals("Withdraw Funds"))
    {
        withdraw();
    }
    else if ((e.getActionCommand()).equals("Withdraw"))
    {
        withdrawprocedure();
    }
    else if ((e.getActionCommand()).equals("Create Account"))
    {
        accountprocedure();
    }
}

public void accountmaker() //This is the screen where the user creates the account they want to. Of course, something needed to be done to differentiate this screen and the login screen.
{
    currentuser = null; //This is so that the program doesn't get somehow confused when dealing with multiple uses of the program.
    getContentPane().remove(mainarea);
    title.setText("Create New Account");
    mainarea = new JPanel();
    JLabel userprompt = new JLabel ("Username: ");
    JLabel passwordprompt = new JLabel("Password: ");
    JLabel retype = new JLabel ("Retype: "); //This is what makes it different from the login screen
    createacc = new JButton ("Create Account");
    createacc.addActionListener(this);
    JButton nevermind = new JButton("Cancel");
    nevermind.addActionListener(this);
    JTextField username = new JTextField(20);
    JTextField password = new JTextField(20);
    retypearea = new JTextField(20);
    mainarea.setSize(300,500);
    mainarea.setLocation(0,0);
    mainarea.add(userprompt);
    mainarea.add(username);
    mainarea.add(passwordprompt);
    mainarea.add(password);
    mainarea.add(retype);
    mainarea.add(retypearea);
    getContentPane().add(mainarea);
    getContentPane().invalidate();
    getContentPane().validate();
    getContentPane().repaint();
}

这是程序使用的 Account 类。

public class Account
{
    private String username;
    private String password;
    private double balance=0;
    public void deposit (double deposit)
    {
        balance += deposit;
    }
    public void withdraw (double withdraw)
    {
        balance -= withdraw;
    }
    public void setBalance (double newbalance)
    {
        balance = newbalance;
    }
    public void setUsername (String newusername)
    {
        username = newusername;
    }
    public void setPassword (String newpassword)
    {
        password = newpassword;
    }
    public String getUsername ()
    {
        return username;
    }
    public double getbalance ()
    {
        return balance;
    }
    public String getpassword()
    {
        return password;
    }
}
4

1 回答 1

2

If I understand correctly.. you basically need to replace the main panel with account panel on certain event!

I have written example code (please modify it according to your project)

In this code.. I have created 4 panels namely Component Panel: To hold all components Main Panel: contains the label with text "Main Panel" and its border is painted RED Account Panel: contains the label with text "Account Panel" and its border is painted GREEN Option Panel: empty panel with its border is painted BLUE

Two buttons: Account Button: Which should replace Main Panel with Account Panel Main Button: Which should replace Account Panel with Main Panel

Using GridBagLayout, all you need to do is to place Main Panel and Account Panel at the same location i.e. gridx = 0 and gridy = 0 for both. At first Main Panel shall be displayed. On event "Account Button" set Main Panel's visibility false and Account Panels' true. For event "Main Button" do the vica versa. GridBagLayout is fantastic dynamic layout which manages the empty spacing by itslef without any distortion.

public class SwingSolution extends JFrame implements ActionListener
{
    private JPanel componentPanel = null;   
    private JPanel mainPanel = null;    
    private JLabel mainLabel = null;    
    private JPanel optionPanel = null;  
    private JPanel accountPanel = null; 
    private JLabel accountLabel = null; 
    private JButton replaceToAccountPanel = null;   
    private JButton replaceToMainPanel = null;

    private final static String MAIN_TO_ACCOUNT = "MainToAccount";
    private final static String ACCOUNT_TO_MAIN = "AccountToMain";

    public JPanel getComponentPanel()
    {
       if(null == componentPanel)
       {
           componentPanel = new JPanel();
           GridBagLayout gridBagLayout = new GridBagLayout();
           componentPanel.setLayout(gridBagLayout);

           GridBagConstraints constraint = new GridBagConstraints();
           constraint.insets = new Insets(10, 10, 10, 10);

           mainPanel = new JPanel();           
           constraint.gridx = 0;
           constraint.gridy = 0;
           mainPanel.setMinimumSize(new Dimension(100, 50));
           mainPanel.setPreferredSize(new Dimension(100, 50));
           mainPanel.setMaximumSize(new Dimension(100, 50));
           mainPanel.setBorder(
                   BorderFactory.createLineBorder(Color.RED));

           mainLabel = new JLabel("Main Panel");
           mainPanel.add(mainLabel);
           componentPanel.add(mainPanel, constraint);

           accountPanel = new JPanel();        
           constraint.gridx = 0;
           constraint.gridy = 0;
           accountPanel.setMinimumSize(new Dimension(100, 50));
           accountPanel.setPreferredSize(new Dimension(100, 50));
           accountPanel.setMaximumSize(new Dimension(100, 50));
           accountPanel.setBorder(
                   BorderFactory.createLineBorder(Color.GREEN));

           accountLabel = new JLabel("Account Panel");
           accountPanel.add(accountLabel);

           componentPanel.add(accountPanel, constraint);

           optionPanel = new JPanel();         
           constraint.gridx = 0;
           constraint.gridy = 1;
           optionPanel.setMinimumSize(new Dimension(100, 50));
           optionPanel.setPreferredSize(new Dimension(100, 50));
           optionPanel.setMaximumSize(new Dimension(100, 50));
           optionPanel.setBorder(
                   BorderFactory.createLineBorder(Color.BLUE));
           componentPanel.add(optionPanel, constraint);

           replaceToAccountPanel = new JButton("Account Button");
           replaceToAccountPanel.setName(MAIN_TO_ACCOUNT);
           constraint.gridx = 0;
           constraint.gridy = 2;
           replaceToAccountPanel.setSize(new Dimension(800, 30));
           replaceToAccountPanel.addActionListener(this);
           componentPanel.add(replaceToAccountPanel, constraint);

           replaceToMainPanel = new JButton("Main Button");
           replaceToMainPanel.setName(ACCOUNT_TO_MAIN);
           constraint.gridx = 1;
           constraint.gridy = 2;
           replaceToMainPanel.setMinimumSize(new Dimension(800, 30));
           replaceToMainPanel.addActionListener(this);
           componentPanel.add(replaceToMainPanel, constraint);
       }       
       return componentPanel;
    }

    public void actionPerformed (ActionEvent evt) 
    {
        JButton buttonClicked = (JButton) evt.getSource();
        if(buttonClicked != null)
        {
            if(buttonClicked.getName().equals(MAIN_TO_ACCOUNT))
            {
                mainPanel.setVisible(false);
                accountPanel.setVisible(true);
            }
            else if(buttonClicked.getName().equals(ACCOUNT_TO_MAIN))
            {
                mainPanel.setVisible(true);
                accountPanel.setVisible(false);
            }
        }       
    }

    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        SwingSolution main = new SwingSolution();

        frame.setTitle("Simple example");
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);

        frame.setContentPane(main.getComponentPanel());

        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}
于 2013-05-05T05:57:41.070 回答