0

I am trying to remove a JPanel not hide it but i can't find anything that works.

This is the code in the panel that needs to remove itself when a button is pressed:

    play.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Frame frame = new Frame(); //referencing to my JFrame class (this class is a JPanel)
            //need to remove this panel on this line
            frame.ThreeD(); // adds a new panel
        }
    });

UPDATED

This is the full code:

package ThreeD;

import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.UIManager;

import Run.Frame;

public class Launcher extends JPanel{   
    private JButton play, options, help, mainMenu;
    private Rectangle rplay, roptions, rhelp, rmainMenu;

    private int buttonWidthLocation, buttonWidth, buttonHeight;
    private int width = 1280;

    public Launcher() {
        this.setLayout(null);

        drawButtons();
    }

    private void drawButtons() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch(Exception e) {
            e.printStackTrace();
        }

        play = new JButton("Play");
        options = new JButton("Options");
        help = new JButton("Help");
        mainMenu = new JButton("Main Menu");

        buttonWidthLocation = (width / 2) - (buttonWidth / 2);
        buttonWidth = 80;
        buttonHeight = 40;

        rplay = new Rectangle(buttonWidthLocation, 150, buttonWidth, buttonHeight);
        roptions = new Rectangle(buttonWidthLocation, 300, buttonWidth, buttonHeight);
        rhelp = new Rectangle(buttonWidthLocation, 450, buttonWidth, buttonHeight);
        rmainMenu = new Rectangle(buttonWidthLocation, 600, buttonWidth, buttonHeight);

        play.setBounds(rplay);
        options.setBounds(roptions);
        help.setBounds(rhelp);
        mainMenu.setBounds(rmainMenu);

        add(play);
        add(options);
        add(help);
        add(mainMenu);

        play.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Frame frame = new Frame();
                //need to remove this panel here
                frame.ThreeD();
            }
        });
        options.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("options");
            }
        });
        help.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("help");
            }
        });
        mainMenu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("mainMenu");
            }
        });
    }
}

And this is my Frame class:

package Run;

import javax.swing.*;

import ThreeD.Display;
import ThreeD.Launcher;
import TowerDefence.Window;


import java.awt.*;
import java.awt.image.BufferedImage;

public class Frame extends JFrame{

    public static String title = "Game";        

    /*public static int GetScreenWorkingWidth() {
        return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width;
    }*/

    /*public static int GetScreenWorkingHeight() {
        return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().height;
    }*/

    //public static Dimension size = new Dimension(GetScreenWorkingWidth(), GetScreenWorkingHeight());
    public static Dimension size = new Dimension(1280, 774);


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

        System.out.println("Width of the Frame Size is "+size.width+" pixels");
        System.out.println("Height of the Frame Size is "+size.height+" pixels");
    }

    public Frame() {
        setTitle(title);
        setSize(size);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ThreeDLauncher();
    }

    public void ThreeDLauncher() {      
        Launcher launcher = new Launcher();
        add(launcher);

        setVisible(true);       
    }

    public void TowerDefence() {
        setLayout(new GridLayout(1, 1, 0, 0));

        Window window = new Window(this);
        add(window);

        setVisible(true);
    }

    public void ThreeD() {
        BufferedImage cursor = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
        Cursor blank = Toolkit.getDefaultToolkit().createCustomCursor(cursor, new Point(0, 0), "blank");

        getContentPane().setCursor(blank);

        Display display = new Display();
        add(display);

        setVisible(true);

        display.start();
    }

}
core16
  • 113
  • 2
  • 17
  • `Frame frame = new Frame(); //referencing to my JFrame` No it is not (either a `JFrame` **or** a reference to the original frame). – Andrew Thompson May 20 '12 at 09:14
  • 2
    For better help sooner, post an [SSCCE](http://sscce.org/). – Andrew Thompson May 20 '12 at 09:15
  • It is a reference to the original JFrame because this class is a JPanel and i have another class for my JFrame, so i need to use that to call certain methods in it. – core16 May 20 '12 at 09:20
  • Wow. That makes a kind of sense that is 'non'. For better help sooner, post an [SSCCE](http://sscce.org/). – Andrew Thompson May 20 '12 at 09:22
  • That code is very messed up. Every time I click a button, I see a new frame over the top of the old. I take it that is not your intent. BTW - are you ignoring me about using a `CardLayout`? Want to check before I spend too much time on this. – Andrew Thompson May 20 '12 at 09:29
  • In the Frame class those are methods that right now i have set up to open a JPanel when called, now i am making a window to call the correct method and remove the current JPanel. (I want only one JPanel open at a time). And I havent used i CardLayout before i'm not sure how to use them? – core16 May 20 '12 at 09:33
  • Oh, my bad on thinking I'd already mentioned the `CardLayout` to you. See [this example](http://stackoverflow.com/questions/5665156/calling-awt-frame-methods-from-subclass/5786005#5786005). – Andrew Thompson May 20 '12 at 09:36

2 Answers2

3

Basically - you are creating new instance of Frame in line:

Frame frame = new Frame(); //referencing to my JFrame class (this class is a JPanel)

New instance of Frame is not visible, and you're try to remove your Launcher from not visible new Frame. But this is wrong - you should remove Launcher from Frame that you created previously in main function (that is: parent of Launcher component).

Here goes an example:

public class TestFrame extends JFrame {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestFrame frame = new TestFrame();
                frame.getContentPane().add(new MyPanel(frame));
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });

    }
}

And MyPanel class:

public class MyPanel extends JPanel {
    public MyPanel(final TestFrame frame) {
        JButton b = new JButton("Play");
        add(b);
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Container pane = frame.getContentPane();
                pane.remove(MyPanel.this);
                JPanel otherPanel = new JPanel();
                otherPanel.add(new JLabel("OtherPanel"));
                pane.add(otherPanel);
                pane.revalidate();
            }
        });
    }
}

In your example you should add a reference to Frame in your Launcher constructor:

public Launcher(Frame frame) {
    this.frame = frame;
    ...

Init Launcher:

public void ThreeDLauncher() {     
    Launcher launcher = new Launcher(this);

and use:

    play.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //need to remove this panel here
            frame.getContentPane().remove(Launcher.this);
            frame.ThreeD();
        }
    });
Xeon
  • 5,949
  • 5
  • 31
  • 52
1

Say your panel is myPanel you can remove it from the main frame by:

frame.getContentPane().remove(myPanel);
GETah
  • 20,922
  • 7
  • 61
  • 103