Jump to content
chuckyegg2

Como fechar o JFrame atual após clicar num botão que abre outro JFrame

Recommended Posts

chuckyegg2

Olá a todos,

Estou a programar algo que abre um JFrame inicial contendo um painel. Nesse painel eu programei alguma animação que opera nos botões. Assim que eu clico num botão, abre um segundo JFrame que contém componentes swing que vão servir para formulário.

O que eu pretendo é que quando clico nesse botão, o JFrame inicial feche e apenas o segundo JFrame (do formulário) fique visivel.

Vou tentar disponibilizar a estrutura base principal do código que tenho, para não ser muito pesado colocar tudo aqui.

public class DBLauncher extends JFrame
{
    //Constructor
    public DBLauncher() throws IOException
    {
        super("Database Launcher v1.0");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(706, 768);
        setLocation(350, 50);
        setResizable(false); 

        DBPanel panel = new DBPanel();

        Container container = getContentPane(); 
        container.setLayout(new BorderLayout()); //Use BorderLayout
        container.add(panel, BorderLayout.CENTER); //Insert e center panel on BorderLayout
    }

    private class DBPanel extends JPanel implements MouseListener, MouseMotionListener
    {
        //Constants...
        //Variables...

        //Constructor
        private DBPanel() throws IOException
        {
            //Panel constants...
            //Panel variables...
            ...
            ...

            this.setOpaque(false);
            this.setFocusable(true);
            this.addMouseListener(this);
            this.addMouseMotionListener(this);

            Thread thread = new Thread(() -> animate());

            thread.start();
        }

        public void delay(int milliseconds)
        {
            try
            {
                Thread.sleep(milliseconds);
            } 
            catch (InterruptedException e)
            {
            }
        } 

        @Override
        protected void paintComponent(Graphics g) 
        {
            super.paintComponent(g);

            Graphics2D g2 = (Graphics2D) g;

            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(new Color(100, 100, 100, 230)); //Define panel's transparent background using Color(r, g, b, a) where the "a" value = alpha channel
            g2.fillRect(0, 0, getWidth(), getHeight());

            for (CustomShapeButton mainShapeButton : shapeButtons)
            {
                mainShapeButton.paintComponent(g2);
            }

            for (CustomShapeButton mainShapeWireFrame : shapeWireFrames)
            {
                mainShapeWireFrame.paintComponent(g2);
            }
        }

        @Override
        public void mouseClicked(MouseEvent me) 
        {
             for (int i = 0; i < shapeButtons.size(); i++)
             {
                Shape shape = shapeButtons.get(i);     

                if (shape.contains(me.getPoint())) 
                {
                    switch (i) 
                    {
                        case 0:
                        ...
                        ...
                        ...

                        case 11:
                        {
                            musicButtonPressed = false;
                            tvButtonPressed = false;
                            gamesButtonPressed = true;
                            booksButtonPressed = false;
                            techButtonPressed = false;

                            try 
                            {   
                                CardInsert ci = new CardInsert();

                                ci.setVisible(true);

                                //É aqui que estou a criar a nova instância do segundo JFrame que aparece no ecrã (formulário).
                                //É também aqui que deveria fechar a instância do JFrame inicial onde estão os botões, certo? Não estou conseguindo aceder à instância aqui para fazer dispose() ou setVisible(false), por exemplo.
                            } 
                            catch (InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException | ClassNotFoundException ex) 
                            {
                                Logger.getLogger(DBPanel.class.getName()).log(Level.SEVERE, null, ex);
                            }

                            System.out.println("Clicked on shape number " + i + " that represents the cards button!");

                            break;    
                        }
                    }
                }
            }
        }

        public synchronized void animate() 
        {       
            while (true)
            {   
                if (musicButtonPressed == true)
                {
                    animateShapeButtonMusic(); 
                    ...
                    ...
                    delay(35);
                    repaint();
                }   
            }
        }

        //Animate methods
        ...
        ...

        //Método main
        public static void main(String args[]) throws IOException 
        {   
            //Aqui estou a criar uma instância da classe inicial DBLauncher (JFrame inicial)
            DBLauncher dbl = new DBLauncher();

            //Aqui digo que essa instância tem que estar visivel, por defeito, sempre que executo o programa pela primeira vez
            dbl.setVisible(true);   
        }
    }
}

Já tentei instanciar algo não estático dentro do método main, mas reparei que dá aquele erro comum "Cannot reference static methods from non-static....". Já estava à espera do erro pois o método main é estático. Foi em desespero. Como posso resolver esta simples questão de fechar o JFrame inicial e mostrar outro, após clicar num botão dele? Como devem imaginar, no segundo JFrame vou querer fazer o mesmo: fechar ele próprio quando clicar no botão Menu Principal e voltar a abrir o JFrame inicial...

Obrigado a todos desde já.

J Amorim

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.