Witam,
Mam stworzone jedno okno i dwa panele, jak w javie z pierwszego panelu mogę przełączyć się na drugi?
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ć?
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();
}
}
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).
W metodzie actionPerformed listenera podpiętego do przycisku.
Ostatni raz odpowiadam na komentarz. Nie działa, bo źle napisałeś kod.
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?
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?
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);
}
});
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...
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.
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
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();
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.
Musisz zmodyfikować konstruktor klasy MyPanel i "odebrać" tę referencję.
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
Musisz zachować tą referencje w jakimś polu klasy
Znaczy co przypisać do innego obiektu klasy Main?
Dodać składową typu Main
w klasie MyPanel i podstawić przekazaną w konstruktorze wartość.
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?