Question

So I want to have everything removed from my JFrame when a string equals a certain value, but when I call removeAll(); followed by revalidate(); and repaint();, it doesn't change anything.

I have tried calling getContentPane.removeAll(); as directed here, but that did not do anything.

My code is as follows:

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

public class MTGSAMPServerReference extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;
    private static JList list1;
    private static JButton select1;
    public static String selectionMenu = "Main";

    public MTGSAMPServerReference() {
        this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
            Object[]mainMenu = {"Vehicles", "Bikes/Bicycles", "Boats", "Houses", "Businesses", "Objects", "Jobs", "Ranks", "Licenses", "VIP", "FAQ's"};
                Object[]VehiclesValueMenu = {"Lower Class", "Upper Class", "VIP"};
        if ("Main".equals(selectionMenu)) {
            JPanel controls = new JPanel(new BorderLayout(5,5));
            list1 = new JList<Object>(mainMenu);
            list1.setVisibleRowCount(10);
            select1 = new JButton("Select");
            select1.addActionListener(this);
            controls.add(new JScrollPane(list1));
            controls.add(select1, BorderLayout.PAGE_END);
            controls.setBorder(new EmptyBorder(25,25,0,0));
            add(controls);
            revalidate();
            repaint();
        }
        if ("VehiclesValue".equals(selectionMenu)) {
            removeAll();
            revalidate();
            repaint();
        }

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if ("Main".equals(selectionMenu)) {
            if (e.getActionCommand().equals("Select")) {
                int indexMain = list1.getSelectedIndex();
                System.out.println("Index Selected: " + indexMain);
                String valueMain = (String) list1.getSelectedValue();
                System.out.println("Value Selected: " + valueMain);
                if ("Vehicles".equals(valueMain)) {
                    selectionMenu = "VehiclesValue";
                    System.out.println("Menu selected: " + selectionMenu);
                    revalidate();
                    repaint();
                }
            }
        }
    }

    public void createAndShowGUI() {
        JFrame f = new MTGSAMPServerReference();
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //f.add(new drawOnPanel());
        f.setSize(1200, 800);
        f.setLocationRelativeTo(null);
        list1.setSize(250, 250);
        list1.setLocation(0, 0);
        select1.setSize(75, 25);
        select1.setLocation(251, 276);
        MTGSAMPServerReference.this.repaint();
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            MTGSAMPServerReference gui = new MTGSAMPServerReference();
            gui.createAndShowGUI();
            }
        });
    }
}

I have done my research, but can't figure out what it is that I am doing wrong.

And if I try changing my JFrame f to a Global Variable instead of a Local Variable, it doesn't display anything to begin with.

And yes, I know I am mixing Commmand Line with GUI, but that is only for debugging purposes. When I am finished, I will simply remove everything Command Line related.

Anyways, any ideas on my problem?

And thanks in advance!

Was it helpful?

Solution 2

I see several problems with that code:

  • MTGSAMPServerReference is called two times, one in the main, and another by createAndShowGUI().

  • MTGSAMPServerReference extends JFrame, but createAndShowGUI() contains a local variable JFrame f too. Esentially you are assigning this to a local variable f, which serves no purpose.

  • To initialize the GUI you execute the constructor and createAndShowGUI(), after that all the code that can be executed is due to events. In your case in the actionPerformed() method. If you want to remove the components inside the frame, you have to do the proper code there (or at some point called from there).

  • As stated by your link, to remove all components you have to execute removeAll() on the contentPane of the JFrame, obtained with getContentPane().

  • I don't know what you intend to do with those comparations if("Main".equals(selectionMenu)). Again that is initialization code, it's ran once. There you build all the GUI. The variable selectionMenu may change in the future, but that doesn't retroactively execute that code. If you want to do anything using the new value of selectionMenu, do it on the actionListener.

Here's a working modification of your code.

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

public class MTGSAMPServerReference extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;
    private static JList list1;
    private static JButton select1;
    public static String selectionMenu = "Main"; //accomplishes nothing

    public static void main(String[] args) 
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            MTGSAMPServerReference gui = new MTGSAMPServerReference();
            gui.createAndShowGUI();
            }
        });
    }

    public void createAndShowGUI() {
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //f.add(new drawOnPanel());
        setSize(1200, 800);
        setLocationRelativeTo(null);
        list1.setSize(250, 250);
        list1.setLocation(0, 0);
        select1.setSize(75, 25);
        select1.setLocation(251, 276);
        setVisible(true);
    }


    public MTGSAMPServerReference() {
        this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
            Object[]mainMenu = {"Vehicles", "Bikes/Bicycles", "Boats", "Houses", "Businesses", "Objects", "Jobs", "Ranks", "Licenses", "VIP", "FAQ's"};
                Object[]VehiclesValueMenu = {"Lower Class", "Upper Class", "VIP"};
            JPanel controls = new JPanel(new BorderLayout(5,5));
            list1 = new JList<Object>(mainMenu);
            list1.setVisibleRowCount(10);
            select1 = new JButton("Select");
            select1.addActionListener(this);
            controls.add(new JScrollPane(list1));
            controls.add(select1, BorderLayout.PAGE_END);
            controls.setBorder(new EmptyBorder(25,25,0,0));
            add(controls);
            //revalidate(); //uneeded at this point the JFrame is not yet visible, thus nothing to repaint
            //repaint();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Select")) {
            int indexMain = list1.getSelectedIndex();
            System.out.println("Index Selected: " + indexMain);
            String valueMain = (String) list1.getSelectedValue();
            System.out.println("Value Selected: " + valueMain);
            if ("Vehicles".equals(valueMain)) {
                System.out.println("Menu selected: " + selectionMenu);
                getContentPane().removeAll(); //equivalent to this.getContentPane().removeAll();
                revalidate();
                repaint();
            }
        }
    }  
} 

Also I've erased the modifications of the variable selectionMenu it doesn't really do anything now.

As stated by others, you probably want to use another Layout at some point. Which one depends on what else you want on the JFrame.

Cheers.

OTHER TIPS

This is an example using a CardLayout which does away with the static variables and provide access to some of the inner values via setters and getters, for demonstration

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;

public class MTGSAMPServerReference extends JFrame implements ActionListener {

    private JList list1;
    private JButton select1;
    private String selectionMenu;
    private JPanel mainMenuPane;
    private JPanel vehicleMenuPane;

    public MTGSAMPServerReference(String selectionMenu) {
        this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
        Object[] mainMenu = {"Vehicles", "Bikes/Bicycles", "Boats", "Houses", "Businesses", "Objects", "Jobs", "Ranks", "Licenses", "VIP", "FAQ's"};
        Object[] VehiclesValueMenu = {"Lower Class", "Upper Class", "VIP"};

        mainMenuPane = new JPanel(new BorderLayout(5, 5));
        list1 = new JList<Object>(mainMenu);
        list1.setVisibleRowCount(10);
        select1 = new JButton("Select");
        select1.addActionListener(this);
        mainMenuPane.add(new JScrollPane(list1));
        mainMenuPane.add(select1, BorderLayout.PAGE_END);
        mainMenuPane.setBorder(new EmptyBorder(25, 25, 0, 0));

        vehicleMenuPane = new JPanel();
        vehicleMenuPane.add(new JLabel("Vehicle"));

        CardLayout cl = new CardLayout();
        setLayout(cl);
        add("main", mainMenuPane);
        add("vehicle", vehicleMenuPane);

        cl.show(getContentPane(), "main");

        setSelectionMenu(selectionMenu);

    }

    public String getSelectionMenu() {
        return selectionMenu;
    }

    public void setSelectionMenu(String value) {
        if (selectionMenu == null ? value != null : !selectionMenu.equals(value)) {
            selectionMenu = value;
            updateMenu();
        }
    }

    protected void updateMenu() {
        CardLayout cl = (CardLayout) getContentPane().getLayout();
        if ("Main".equals(selectionMenu)) {
            cl.show(getContentPane(), "main");
        } else if ("VehiclesValue".equals(selectionMenu)) {
            cl.show(getContentPane(), "vehicle");
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if ("Main".equals(selectionMenu)) {
            if (e.getActionCommand().equals("Select")) {
                int indexMain = list1.getSelectedIndex();
                System.out.println("Index Selected: " + indexMain);
                String valueMain = (String) list1.getSelectedValue();
                System.out.println("Value Selected: " + valueMain);
                if ("Vehicles".equals(valueMain)) {
                    setSelectionMenu("VehiclesValue");
                    System.out.println("Menu selected: " + selectionMenu);
                }
            }
        } else {
            setSelectionMenu("Main");
        }
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MTGSAMPServerReference gui = new MTGSAMPServerReference("Main");
                gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                gui.pack();
                gui.setLocationRelativeTo(null);
                gui.setVisible(true);
            }
        });
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top