Janela do Menu principal muito pequena

5 respostas
G
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
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");

	}
	
}

5 Respostas

L

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!

E

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.

L

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.

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);
    }
E
  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();
    }

}
G

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

Criado 11 de julho de 2013
Ultima resposta 11 de jul. de 2013
Respostas 5
Participantes 3