Reputation: 83
Hi I just wrote a code for a Swing using Menu bar. But the problem arises in running. I type:
javac Menu.java
java Menu
It gives no errors but the GUI does not get displayed. Here's my source code for reference:
import javax.swing.*;
class Menu extends JFrame
{
JMenuBar mb;
JMenu m1,m2,m3;
JMenuItem mn1,mn2,mn3;
JCheckBoxMenuItem chk1,chk2,chk3;
JRadioButtonMenuItem rd1,rd2,rd3;
JSeparator sp1,sp2,sp3;
Menu()
{
setTitle("MenuBar Demo");
mb = new JMenuBar();
m1 = new JMenu("File");
m2 = new JMenu("Edit");
m3 = new JMenu("View");
mn1 = new JMenuItem("New");
mn2 = new JMenuItem("Open");
mn3 = new JMenuItem("Close");
chk1 = new JCheckBoxMenuItem("Cut");
chk2 = new JCheckBoxMenuItem("Copy");
chk3 = new JCheckBoxMenuItem("Paste");
rd1 = new JRadioButtonMenuItem("Find");
rd2 = new JRadioButtonMenuItem("Find Next");
rd3 = new JRadioButtonMenuItem("Replace");
sp1 = new JSeparator();
sp2 = new JSeparator();
sp3 = new JSeparator();
m1.add(mn1);
m1.add(mn2);
m1.add(sp1);
m1.add(mn3);
m2.add(chk1);
m2.add(chk2);
m2.add(sp2);
m2.add(chk3);
m3.add(rd1);
m3.add(rd2);
m3.add(sp3);
m3.add(rd3);
mb.add(m1);
mb.add(m1);
mb.add(m2);
mb.add(m3);
getContentPane().add(mb);
mb.setSize(300, 300);
mb.setVisible(true);
}
public static void main(String[] args)
{
new Menu();
}
}
Why does the GUI not appear?
Upvotes: 2
Views: 113
Reputation: 40416
By Default JFrame visibility is false
you forgot to show frame this.setVisible(true);
So end of constructor add
mb.setSize(300, 300);
mb.setVisible(true);
this.setVisible(true);<<<Add here
CODE:
import javax.swing.*;
class Menu extends JFrame {
JMenuBar mb;
JMenu m1, m2, m3;
JMenuItem mn1, mn2, mn3;
JCheckBoxMenuItem chk1, chk2, chk3;
JRadioButtonMenuItem rd1, rd2, rd3;
JSeparator sp1, sp2, sp3;
Menu() {
setTitle("MenuBar Demo");
mb = new JMenuBar();
m1 = new JMenu("File");
m2 = new JMenu("Edit");
m3 = new JMenu("View");
mn1 = new JMenuItem("New");
mn2 = new JMenuItem("Open");
mn3 = new JMenuItem("Close");
chk1 = new JCheckBoxMenuItem("Cut");
chk2 = new JCheckBoxMenuItem("Copy");
chk3 = new JCheckBoxMenuItem("Paste");
rd1 = new JRadioButtonMenuItem("Find");
rd2 = new JRadioButtonMenuItem("Find Next");
rd3 = new JRadioButtonMenuItem("Replace");
sp1 = new JSeparator();
sp2 = new JSeparator();
sp3 = new JSeparator();
m1.add(mn1);
m1.add(mn2);
m1.add(sp1);
m1.add(mn3);
m2.add(chk1);
m2.add(chk2);
m2.add(sp2);
m2.add(chk3);
m3.add(rd1);
m3.add(rd2);
m3.add(sp3);
m3.add(rd3);
mb.add(m1);
mb.add(m1);
mb.add(m2);
mb.add(m3);
getContentPane().add(mb);
mb.setSize(300, 300);
mb.setVisible(true);
this.setVisible(true);
}
public static void main(String[] args) {
new Menu();
}
}
Upvotes: 3
Reputation: 168825
At the end of the constructor, call this.setVisible(true);
setVisible(true)
on components, instead add them to a container that will be made visible. The menu bar does not seem to be added to anything. Add it using setJMenuBar(JMenuBar)
pack()
the GUI.These changes will produce a small GUI on-screen.
// ...
//getContentPane().add(mb);
setJMenuBar(mb);
//mb.setSize(300, 300);
//mb.setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
setVisible(true);
Upvotes: 4
Reputation: 38132
Use something like:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Menu app = new Menu();
app.setVisible(true);
}
});
}
I suggest to rename your class, as this an application/ frame not a Menu.
Upvotes: 4