似乎无法恢复工作

时间:2013-05-05 03:48:55

标签: java swing jpanel

因此,对于我目前正在学习的课程,我需要创建一个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;
    }
}

1 个答案:

答案 0 :(得分:2)

如果我理解正确的话......你基本上需要在特定事件中用帐户面板替换主面板!

我已经编写了示例代码(请根据您的项目进行修改)

在这段代码中..我创建了4个面板 组件面板:保存所有组件 主面板:包含带有“主面板”文本的标签,其边框涂成红色 帐户面板:包含带有“帐户面板”文本的标签,其边框涂成绿色 选项面板:空面板及其边框涂成蓝色

两个按钮: 帐户按钮:哪个应该用帐户面板替换主面板 主按钮:哪个应该用主面板替换帐户面板

使用GridBagLayout,您需要做的就是将主面板和帐户面板放在同一位置,即gridx = 0和gridy = 0。首先应显示主面板。在事件“帐户按钮”上,将主面板的可见性设置为false,并将“帐户面板”设置为true。对于事件“主按钮”,反之亦然。 GridBagLayout是非常棒的动态布局,它通过其自由来管理空间距而没有任何失真。

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);
    }
}