Criar JMenuBar Padrão

Saudações colegas do GUJ.

Estou com um probleminha. Estou implementando um programa que possui várias telas, porém quero que todas tenham a mesma barra de menus aparecendo. Veio em minha cabeça a idéia mirabolante (Oo) de criar uma classe que herda de JMenuBar.

Até aí blz, instanciei uma variavel desta classe na minha janela principal. Mas não está aparecendo o menu. Venho recorrer à vocês.

Segue abaixo meu código:

[code]package visualizacao;

import javax.swing.JFrame;

@SuppressWarnings(“serial”)
public class FormPrincipal extends JFrame implements Formulario {
public BarraMenu barraMenu;

public FormPrincipal() {
	inicializar();
}

public void inicializar() {
	instanciar();
	posicionar();
	agrupar();
	configurar();
}

public void instanciar() {
	barraMenu = new BarraMenu();
}

public void posicionar() {
	this.setSize(580, 350);
	this.setLocationRelativeTo(null);
	this.setResizable(false);
	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void agrupar() {
	this.setLayout(null);
	this.setJMenuBar(barraMenu); /* <-- Setando Menu*/
}

public void configurar() {
	this.setTitle("DaN LTDA - Cobrança - " +
			(new java.text.SimpleDateFormat("dd/MM/yyyy")).format(new java.util.Date()));
}

}[/code]

[code]package visualizacao;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;

@SuppressWarnings(“serial”)
public class BarraMenu extends JMenuBar {
private JMenuBar menuBar;
// CADASTRO
public JMenu menuCadastro;
// TITULO
public JMenu menuTitulo;
public JMenuItem jmiIncluirTitulo;
public JMenuItem jmiAlterarTitulo;
public JMenuItem jmiConsultarTitulo;
public JMenuItem jmiExcluirTitulo;
// CLIENTE
public JMenu menuCliente;
public JMenuItem jmiIncluirCliente;
public JMenuItem jmiAlterarCliente;
public JMenuItem jmiConsultarCliente;
public JMenuItem jmiExcluirCliente;
// BAIXA DE TÍTULOS
public JMenu menuBaixa;
public JMenuItem jmiBaixa;
// RELATÓRIO
public JMenu menuRelatorio;
public JMenuItem jmiClientesDebito;
public JMenuItem jmiBalInadimplencia;
public JMenuItem jmiGerarAviso;
// SAIR
private JSeparator separador;
public JMenuItem jmiSair;
// SOBRE
public JMenu menuAjuda;
public JMenuItem jmiSobre;

public BarraMenu() {
	inicializar();
}

public void inicializar() {
	instanciar();
	agrupar();
	configurar();
}

public void instanciar() {
	// CADASTRO
	menuBar = new JMenuBar();
	menuCadastro = new JMenu();
	// TITULO
	menuTitulo = new JMenu();
	jmiIncluirTitulo = new JMenuItem();
	jmiAlterarTitulo = new JMenuItem();
	jmiConsultarTitulo = new JMenuItem();
	jmiExcluirTitulo = new JMenuItem();
	// CLIENTE
	menuCliente = new JMenu();
	jmiIncluirCliente = new JMenuItem();
	jmiAlterarCliente = new JMenuItem();
	jmiConsultarCliente = new JMenuItem();
	jmiExcluirCliente = new JMenuItem();
	// BAIXA DE TÍTULOS
	menuBaixa = new JMenu();
	jmiBaixa = new JMenuItem();
	// RELATÓRIO
	menuRelatorio = new JMenu();
	jmiClientesDebito = new JMenuItem();
	jmiBalInadimplencia = new JMenuItem();
	jmiGerarAviso = new JMenuItem();
	// SAIR
	separador = new JSeparator();
	jmiSair = new JMenuItem();
	// AJUDA
	menuAjuda = new JMenu();
	jmiSobre = new JMenuItem();
}

public void agrupar() { //add componentes no JMenuBar
	menuBar.add(agruparMenuCadastro());
	menuBar.add(agruparMenuBaixa());
	menuBar.add(agruparMenuRelatorio());
	menuBar.add(agruparMenuAjuda());
}

/*
 * editado para não ficar muito grande
 * métodos acima descritos já foram implementados 
 */

public void configurar() {
	//setar o texto dos componentes
}

public JMenuBar getMenuBar() {
	return this;
}

}
[/code]

Existe possibilidade de eu fazer isso?

Grato à todos!

Amigo, há uma divergência entre o menu que é a classe que você herdou de JMenuBar e o menu que essa classe configura.
Quando você configura na classe BarraMenu o seu JMenuBar (método instanciar()), o está fazendo para um objeto privado chamado “menuBar” (linha 10).
Aí quando você adiciona o JMenuBar no seu formulário, está adicionando uma instância da classe BarraMenu que não é o menu configurado, pois o menu configurado dela só pode ser acessado com o método “getMenuBar()”.
Então você tem duas alternativas.
1 - Adiciona o menu que está configurado no seu JFrame, assim:

public void agrupar() { this.setLayout(null); this.setJMenuBar(barraMenu.getMenuBar()); /* <-- Setando Menu*/ }Desse jeito não ficaria bom, pois a intenção de utilizar herança não seria cumprida. Na verdade ficaria uma salada. :slight_smile:

2 - Configura as características do JMenuBar na própria classe BarraMenu, pois ela “é” um JMenuBar (conforme herança). Nesse caso ao invés de colocar as coisas como “menuBar.algumaCoisa”, você utiliza “this.algumaCoisa”. Exemplo:

public void agrupar() { //add componentes no JMenuBar this.add(agruparMenuCadastro()); this.add(agruparMenuBaixa()); this.add(agruparMenuRelatorio()); this.add(agruparMenuAjuda()); }Aí o código lá na classe FormPrincipal iria funcionar do jeito que já está:

public void agrupar() { this.setLayout(null); this.setJMenuBar(barraMenu); /* <-- Setando Menu*/ }
Beleza?

Abraços,

Marcos Antonio Campos Jordão’’

Tranquilo raci0nal!

Valeu mesmo a ajuda…

Abração!

Dan, beleza??

Essa sua “idéia mirabolante” pode gerar resultado, sim, desde que seja implementada corretamente!

Você pode fazer assim…

Crie uma classe que seja a sua View. Será uma View Geral, saca?
Nessa View, você terá uma barra de menus, que terá as opções que você quer em todos os formulários.

Se você quer que uma outra View tenha esse menu, é só ela estender da View Geral!

Por exemplo:

A View Geral:

public abstract class ViewGeral extends JFrame {  // Abstract porquê? Porque ela será só o modelo, não precisamos instanciá-la.


   protected JMenuBar myMenuBar;   // Protected porquê? Porque poderá ser usado pelas filhas dessa classe.
   private JMenu         cadastrosMenu, relatoriosMenu;
   private JMenuItem   cadastrarFuncionarioMenuItem, gerarRelatoriosMenuItem;

   public ViewGeral() {

      this.myMenuBar = new JMenu();

      // Faz todas as instâncias referentes ao menu aqui.
   }
 
   protected abstract void initComponents();
   
}

Daí, suponhamos que temos um formulário de cadastro, que você quer que tenha esse menu:

public class ViewCadastros extends ViewGeral {

   private JLabel nomeLabel;
   private JTextField nomeTextBox;
   private JButton cadastrarButton;

   public ViewCadastros() {

      super();   // Opa! Porquê a palavra reservada "super"? Para instanciar os componentes da mãe!
      this.initComponents();
   }

   @Override
   protected void initComponents() {
      
      //Instancia seus componentes aqui.
   }
}

Pronto! Agora, qualquer classe que estender de uma ViewGeral poderá ter o menu que você quer!

É isso mesmo que você queria?

Espero ter ajudado!

[]s

Beleza Nicolas?

Gostei da implementação da janela.

Neste final de semana resolvi implementar os meus formulários quase que desse jeito que você explicou. Só que, ao invés de eu utilizar essa herança, eu criava um formulário principal, herdando de JFrame e implementando a barra de menus e criava outros formulários que herdavam de JPanel. Cada formulário tem seu controle, e o controle dos “painéis”, recebiam no construtor uma instancia de um frame, que por sua vez, tinha o seu contentPane() atualizado. (método setContentPane(Container c)).

Como havia dito anteriormente, gostei do exemplo, e vou implementar também.

Agradeço a ajuda!

Abraços!