Przełączanie między panelami

0

Witam,
Mam stworzone jedno okno i dwa panele, jak w javie z pierwszego panelu mogę przełączyć się na drugi?

0

Bardzo nieprecyzyjny opis problemu. Te dwa panele są widoczne, co w takiej sytuacji znaczy słowo przełączyć? Widać tylko jeden z nich, a chcesz pokazać ten drugi a pierwszy ukryć?

0

Tak wygląda klasa okna

public class Main extends JFrame {
    Main(){
        setSize(600, 480);
        setResizable(false);
        setTitle("Java Gamae");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        add(new MainPanel());        // ten jest widoczny
        //add(new OptionPanel());   // na ten chcę przełączyc
    }

    public static void main(String[] args) {
	Main window = new Main();
        window.show();
    }
}
0

Jeśli masz rozkład BorderLayout, (a tak sugeruje zamieszczony kod), to

add(new OptionPanel());
validate();
repaint();

Przy okazji, metoda show() jest deprecated, zamień na setVisible(true).

0

W metodzie actionPerformed listenera podpiętego do przycisku.

0

Ostatni raz odpowiadam na komentarz. Nie działa, bo źle napisałeś kod.

0

Kod klasy okna w w niej mam widoczny panel z klasy MyPanel

public class Main extends JFrame {
    Main(){
        setTitle("Java Gamae");
        setSize(600, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);

        add(new OptionsPanel());
        add(new MyPanel());

        setVisible(true);
    }

    public static void main(String[] args) {
	Main window = new Main();
        window.setVisible(true);
    }
}

Klasy MyPanel z której widok chcę przełączyć na Jpanel z klasy OptionsPanel

class MyPanel extends JPanel implements MouseListener, MouseMotionListener, KeyListener {
...

    public MyPanel() {
        addMouseListener(this);
        addMouseMotionListener(this);
        addKeyListener(this);
        initComponentM();
    }

    public void initComponentM(){
...
        XButton op = new XButton("Options");
        op.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                add(new OptionPanel());
                validate();
                repaint();
                setVisible(true);

            }
        });
        op.setComponentPosition(200, 100);
        op.setComponentSize(200, 50);
        op.setFontSize(15);
        listComponentM.add(op);
...
    }

Co jest źle że nie nie zmienia mi widoki na panel z klasy OptionsPanel?

0

Da się w ogóle z JPanelu zmienić panel na drugi czy trzeba odwoływać się od klasy która dziedziczy z JFrame i z niej zmieniać panel na drugi?

0
public class Main extends JFrame {
    MyPanel menuPanel = new MyPanel();
    Main(){
        setTitle("Java Gamae");
        setSize(600, 480);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
 
        //add(new OptionsPanel());
        add(menuPanel);
 
        setVisible(true);
    }
 
    public static void main(String[] args) {
    Main window = new Main();
        window.setVisible(true);
    }
}
....
        XButton op = new XButton("Options");
        op.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                remove(menuPanel); //tego brakowało, zapomniałem poprzednio
                add(new OptionPanel());
                validate();
                repaint();
                //setVisible(true);
 
            }
        });
0

Chyba nie rozumiesz o co mi chodzi. Nie mogę stworzyć przycisku w tej klasie co dziedziczy z JFrame. Mam napisane własne kontrolki które rysują się na
panelu MyPanel i tylko w tym panelu działają i mogą być tworzone. W klasie Main nie mogę tworzyć żadnych przycisków i w tym jest problem.
Ewentualni muszę wywołać jakąś funkcję w MyPanel i odwołująca sie do klasy Main i zmienić panel na drugi. A tak powyższy sposób nie działa...

0

O czym Ty piszesz? Ja przepisałem Twój kod i dodałem dwa wiersze: remove() i zapamiętanie referencji do panelu MyPanel. Przyciski są tworzone wg Twojego sposobu.

0

To niby jak jam usunąć

remove(menuPanel);

stworzony w klasie Main, z klasy MyPanel ?? Bo z tego co napisałeś to tak mam zrobic.

dodanie znacznika <code class="java"> - furious programming

0

Sorry, czytałem Twój kod nieuważnie. Musiałbyś przekazać do klasy MyPanel (w konstruktorze) referencję do klasy Main - niech się ona nazywa mainFrame, a w obsłudze przycisku

mainFrame.remove(menuPanel);
mainFrame.add(new OptionPanel());
mainFrame.validate();
mainFrame.repaint();
0

Nie bardzo rozumiem jak mam przekazać to referencję do do do klasy MyPanel.
Próbuję w taki sposób w konstruktorze klasy main

   Main(){
...
        menuPanel = new MyPanel(this);
        add(menuPanel);
        setVisible(true);
...
    }

ale tak nie działa.

0

Musisz zmodyfikować konstruktor klasy MyPanel i "odebrać" tę referencję.

0

Konstruktor klasy wygląda tak

MyPanel(Main menuPanel){
...
mainFrame.remove(menuPanel);
mainFrame.add(new OptionPanel());
mainFrame.validate();
mainFrame.repaint();
...
}

i wywala taki błąd
Error:(36, 18) java: variable menuPanel might not have been initialized

1

Musisz zachować tą referencje w jakimś polu klasy

0

Znaczy co przypisać do innego obiektu klasy Main?

0

Dodać składową typu Main w klasie MyPanel i podstawić przekazaną w konstruktorze wartość.

0

Dobra wstawia mi drugi panel, ale obsługa klawiatury nie działa a jak zminimalizuje okno i ponownie otworze to działa dlaczego tak się dzieje?

1 użytkowników online, w tym zalogowanych: 0, gości: 1