Gherbi Hicham Gherbi Hicham - 4 months ago 18
Java Question

JMenuBar doesn't show when switching Cards in a Cardlayout

I'm working on a Java desktop Application that uses multiple

Jpanel
s as
cards
in a
CardLayout
, the problem is that when I switch between the cards the
JmenuBar
disappears totally or just parts of it.I have a
mainFrame
which holds all the Jpanels and the JmenuBar, the other Jpanels have some texts and
JButton
s and
JLabel
s Here's how I'm implementing this :
This is the Frame that holds everything mainFrame.java

public class mainFrame extends JFrame {

JPanel cards ;

menubar menu= new menubar();

mainPanel card1 = new mainPanel();

Ajout card2= new Ajout();

//ViewAjoutEnf card3= new ViewAjoutEnf();


public mainFrame(){

setResizable(true);
setExtendedState(JFrame.MAXIMIZED_BOTH);
this.add(menu);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cards = new JPanel(new CardLayout());

cards.add(card1, "Card 1");
cards.add(card2, "Card 2");
// cards.add(card3, "Card 3");

getContentPane().add(cards);

}


This is the JmenuBar class menubar.Java:

public class menubar extends JMenuBar{

JMenu menuouvrir = new JMenu("ملف");

JMenuItem ajoutbase = new JMenuItem("فتح");

JMenuItem quiter = new JMenuItem("خروج ");

JMenuItem motpass = new JMenuItem("تبديل كلمة السر");

JMenu menuajout = new JMenu("ادخال ");

JMenuItem ajoutprodui = new JMenuItem("ادخال منتوج");

JMenuItem listproduit = new JMenuItem("لائحة المنتوجات");

JMenu menusortie = new JMenu("اخراج");

JMenuItem sortiproduit = new JMenuItem("اخراج منتوج");

JMenu retour = new JMenu("عودة ");


JMenu menuapropos = new JMenu("?");



public menubar (){
this.setBounds(0, 0, 1370, 30);
this.add(Box.createHorizontalGlue());
this.setFont(new Font("sans-serif", Font.PLAIN, 12));


menuouvrir.add(ajoutbase);
menuouvrir.add(motpass);
menuouvrir.addSeparator();
menuouvrir.add(quiter);


menuajout.add(ajoutprodui);
menuajout.add(listproduit);

menusortie.add(sortiproduit);

this.add(menuapropos);
this.add(retour);
this.add(menusortie);
this.add(menuajout);
this.add(menuouvrir);

this.setVisible(true);
}


and these are the Two Jpanels i have:
mainPanel.Java

public class mainPanel extends JPanel {

JButton but = new JButton("dsdffd");

public mainPanel(){

this.setLayout(null);
this.add(but);
but.setBounds(70,500,70,70);
this.setBackground(Color.white);
this.setVisible(true);

}


}

and Ajou.Java:

public class Ajout extends JPanel{
JButton but = new JButton("dsdffd");

public Ajout(){


this.setLayout(null);

this.add(but);
but.setBounds(70,500,70,70);
this.setBackground(Color.white);
this.setVisible(true);

}

}

Answer

Don't extend JMenuBar. There is no reason to do this. You create an instance of JMenuBar and and add JMenu instances to the menu bar.

Don't use a null layout. A JMenuBar has its own layout manager.

I don't see where you add the menu bar to the frame using the setJMenBar(...) method.

Read the section from the Swing tutorial on How to Use Menus for more information and working examples. The examples will also show you how to better structure your code.

Also, don't keep extending panels just to add a single component to the panel. You can add multiple components to any panel. And make sure your panels use a layout manager.