Janela do Menu principal muito pequena

Oi pessoal, tudo bem?
criei uma classe extends JFrame com menu, barra de menu e menuitens (tudo usando swing).
Coloquei setSize(400,400); mas quando executo, a janela aparece pequena (só o tamanho do menu).
como faço para ela aparecer grande? ou pelo menos com o tamanho 400 por 400?
já coloquei o pack();
Atenciosamente,
Geraldo
segue meu codigo

[code]
package pacote;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Menu extends JFrame {

private JMenuBar barraMenu;
private JMenu menuCadastro, menuSobre;
private JMenuItem menuContatos, menuSair;
private JLabel espaco;
private JPanel painel;

public Menu(String titulo) {
	super(titulo); //aqui é a chamada ao contrutor da superclasse, deve ser a primeira instrução do construtor
	this.setSize(400, 400);
	this.setLocation( 300, 200 );
	iniciar();
}

public void iniciar() {
	espaco = new JLabel("           ");
	
	painel = new JPanel(new GridLayout(5, 1));

	painel.add(espaco);
	painel.add(espaco);
	painel.add(espaco);
	painel.add(espaco);
	painel.add(espaco);
	
	barraMenu = new JMenuBar();
	
	menuCadastro = new JMenu("Cadastro");
	menuContatos = new JMenuItem("Contatos");
	menuSair = new JMenuItem("Sair");
	
	menuSobre = new JMenu("Sobre");
	
	menuCadastro.add(menuContatos);
	menuCadastro.add(menuSair);
	
	barraMenu.add(menuCadastro);
	barraMenu.add(menuSobre);
	
	this.setJMenuBar(barraMenu); 
	this.getContentPane().add(painel);
	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	this.pack();
	this.setVisible(true);
}

public static void main(String[] args) {
	Menu meuMenu = new Menu("Principal");

}

}[/code]

Quando você usa o pack() ele “comprime” toda a sua tela o máximo possível…

Primeiro tire o pack()… pack é método de preguiçoso!

Seu problema não é o “pack” (que não é um “método de preguiçoso”. )

seu problema provavelmente é de layouts, deixa eu dar uma olhada.

[quote=entanglement]Seu problema não é o “pack” (que não é um “método de preguiçoso”. )

seu problema provavelmente é de layouts, deixa eu dar uma olhada. [/quote]

O pack() é método de preguiçoso sim pois ele comprime sua tela ao máximo, ou seja, você deixa de lado a opção de setar o tamanho da sua tela ( o que é uma boa prática ) e utiliza um tamanho “automático”.

Agora com relação ao código, cara… está bem estranho a maneira como você fez sua classe, você estaria aberto a usar GridBagLayout?? Eu vou fazer um exemplo aqui pra você e já posto.

E cara seu problema é o pack() sim… o que você está fazendo é:

public Menu(String titulo) {  
        super(titulo);
        this.setSize(400, 400);  //<< está setando o tamanho antes de qualquer coisa.
        this.setLocation( 300, 200 );  
        iniciar();  //<< aqui você usa bem no final o método pack(); que deixa a tela com o mínimo de tamanho possível sem esconder os seus componentes que no caso são os menus.
    } 

Resumindo:

? Ou tire o pack do método iniciar.
? Ou troque a linha do setSize com o método iniciar()

 public teste(String titulo) {  
        super(titulo);
        iniciar();
        this.setSize(400, 400);  
        this.setLocation( 300, 200 );
    }

Outra dica, deixe o setVisible no main…

public static void main(String[] args) {  
        teste meuMenu = new teste("Principal");  
        meuMenu.setVisible(true);
    }  
  1. Use um construtor de telas, como o WindowBuilder, em vez de fazer as coisas no braço. Aprenda com o código que ele faz.
  2. Não use JLabels para “criar espaço” como você fez - isso não funciona bem, porque você não pode sobrepôr componentes de maneira simples.
  3. Não abra a janela diretamente no construtor - o aconselhável é você fazer isso fora.
  4. Use pack se você usar um layout manager e já tiver os componentes já criados direitinho. Se você quer começar com um determinado tamanho (o recomendável é iniciar com o último tamanho que o usuário usou ao fechar o seu sistema), não precisa usar o pack.
    Exemplo:
package guj;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class TesteMenu extends JFrame {
    private JMenuBar barraMenu;
    private JMenu menuCadastro, menuSobre;
    private JMenuItem menuContatos, menuSair;
    private JPanel painel;

    public void iniciar() {
        // Use o gerenciador de layout adequado
        painel = new JPanel();

        barraMenu = new JMenuBar();

        menuCadastro = new JMenu("Cadastro");
        menuContatos = new JMenuItem("Contatos");
        menuSair = new JMenuItem("Sair");

        menuSobre = new JMenu("Sobre");

        menuCadastro.add(menuContatos);
        menuCadastro.add(menuSair);

        barraMenu.add(menuCadastro);
        barraMenu.add(menuSobre);

        this.setJMenuBar(barraMenu);
        this.getContentPane().add(painel);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TesteMenu frame = new TesteMenu();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public TesteMenu() {
        setTitle("Principal");
        setBounds(100, 100, 500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        iniciar();
    }

}

Muito obrigado amigos: lcruz e entanglement pelas respostas.
Vocês explicam muito bem e resolveram meu problema.
Se algum dia eu puder retribuir… estou aí.
Falou,
Geraldo