A więc muszę napisać grę, o której już kiedyś wspominałem i teraz mam problem ze swingiem. Jestem bardzo początkujący w Swingu i nie wiem jak powinno się używać tych komponentów.
Mam JFrame Okno i do niego chcę wrzucić dwa panele: jeden z Buttonami a drugi z planszą. Kombinowałem już na różne sposoby i mam takie problemy:

Plansza się nie wyświetla od razu, tylko dopiero po naciśnięciu Buttona.
Po naciśnięciu Buttona wszystkie Buttony znikają i pojawiają się dopiero po najechaniu kursorem na jakiś.
Mam taki kod, trochę chaotyczny, bo zmieniam co chwilę i kombinuję jak zrobić żeby to działało:

public class Plansza extends JPanel, wrzuce tylko kod do rysowania, bo reszta jest raczej nieważna:

    public void paintComponent(Graphics g)
    {
       super.paintComponent(g);
       Graphics2D graph = (Graphics2D) g;
       graph.setColor(new Color(10, 10, 10));
       graph.fillRect(0, 0, 32*cols+2, 32*rows+2);
       graph.setColor(new Color(10, 100, 100));
       pola[0].DrawSequence(graph, 0, this);
       
    }

Plansza zawiera tablicę różnych Pól, pola mają swoje funkcje do rysowania.

pola[0].DrawSequence(graph, 0, this)- nie mogę używać instrukcji sterujących, dlatego każde pole rysuje siebie, a później wywołuje funkcje do rysowania na następnym polu itd.

Na końcu każdej funkcji, która modyfikuje planszę wywołuję repaint() i działa to poprawnie.

I teraz klasa Okno która sprawia problemy:

public class Okno extends JFrame
{

    private Toolkit toolkit;
    private Plansza pl;
    public Okno(Plansza p)
    {
        //-------poczatkowe inicjalizacje--------------
        Graphics g=getGraphics();
        setTitle("Sokoban");
        setSize(1000, 700);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //wyswietlenie okna na srodku ekranu
        toolkit = getToolkit();
        Dimension screen = toolkit.getScreenSize();
        setLocation(screen.width/2 - getWidth()/2,screen.height/2 - getHeight()/2);
        

        JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setBounds(0,0,1000,700);
       // setLocationRelativeTo(null);

        //-----------------------------dodawanie guzikow-------------------------------
       //-------------gora---------------------------
        JButton gora = new JButton("Góra");
        gora.setBounds(750, 400, 80, 50);
        gora.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event) {
              System.out.print("wGore"); // gora
            pl.wGore();
            
         }
        });
        //---------------------dol-----------------------------
        JButton dol = new JButton("Dół");
        dol.setBounds(750, 450, 80, 50);
        dol.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event) {
            pl.wDol();
             validate();
            }
        });
        JButton lewo = new JButton("Lewo");
        lewo.setBounds(670, 450, 80, 50);
        lewo.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event) {
            pl.wLewo();
             validate();
            }
        });
        JButton prawo = new JButton("Prawo");
        prawo.setBounds(830, 450, 80, 50);
        prawo.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event) {
             pl.wPrawo();
             validate();
            }
        });

        pl=p;
        pl.setBounds(0,0,600,600);
        pl.setVisible(true);
        //add(pl);
        
        panel.add(gora);
        panel.add(dol);
        panel.add(lewo);
        panel.add(prawo);
        
        add(panel);
        panel.setVisible(true);
        validate();
        panel.validate();
        setVisible(true);
    }

Chciałem zrobić coś takiego że do Frame dodaję dwa panele: planszę i panel z guzikami, które wywołują jakieś funkcje na planszy. Ale nie wychodzi mi, bo albo jest pusty Frame, albo są tylko guziki, albo tylko plansza, albo guziki znikają jak teraz i plansza nie wyświetla się od razu.
Co zrobić aby plansza od razu się wyświetliła i co zrobić żeby buttony nie znikały?

Kombinowałem z rożnymi rozmiarami panelu, położeniem itp. i nic nie pomaga. Próbowałem repaint(), validate() ale też nie działa.

Plansza będzie miała zmienny rozmiar, jak zrobić żeby Frame się dostosował do rozmiaru planszy tak aby zmieściła się cała plansza z guzikami po prawej stronie i został jakiś stały margines, np 50 pixeli z każdej strony?