简体   繁体   中英

Can't seem to get .remove to work

So for a class that I am currently taking I need to create an ATM System. So, I decided to have 2 panels. A main panel, where all of the processes take place, and an options panel, where the options are listed for the user. The problem, as mentioned above, is that I can't seem to get the main panel to be removed so I can actually replace it with the panel for, say the create account screen. In fact, all that happens is that the terminal window shows. Completely blank. As far as I have checked, the buttons event is firing and it even gets past the remove function.

In any event, I can't seem to figure out what the problem is, perhaps it is because the button being pressed is also being removed with the panel. Here's the related code.

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

And this is the Account class that the program uses.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM