Как закрыть реальный JFrame после нажатия кнопки, которая открывает другой JFrame - PullRequest
0 голосов
/ 07 февраля 2020

Я программирую что-то, что открывает начальный JFrame. Этот JFrame имеет контейнер, который содержит панель. На этой панели я запрограммировал некоторую простую анимацию, которая работает с несколькими кнопками. Когда я нажимаю кнопку, открывается второй JFrame, содержащий компоненты Swing (комбинированные поля; текстовые поля и т. Д. c), которые будут служить формой.

То, чего я намерен достичь, - это простая вещь: Первоначальный JFrame закрывается, и только второй JFrame остается открытым (видимым).

Я постараюсь показать основную структуру кода, которая у меня уже есть, просто для простоты:

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

}

В отчаянии я даже пытался создать экземпляр не-stati c объекта внутри метода main, но на самом деле я ожидал ошибку "Невозможно сослаться на методы stati c от не-stati c ... ", потому что основной метод - stati c. Как вы можете себе представить, я хотел бы сделать то же самое во втором JFrame: закрыть его, когда я нажму кнопку Главного меню, и go вернуться к исходному JFrame ...

Но я также думаю, что может усложнить это. Есть ли для меня простой способ сделать это только с одним JFrame и, таким образом, показать / скрыть несколько панелей внутри уже созданного контейнера?

Спасибо всем, J Amorim

...