Eu estou junto com um grupo de aluno do IFES, desenvolvendo um sistema de Locadora de Carros.
Estamos com uma duvida, pois estamos neste momento padronizando nossas janelas.
Portanto queremos que na janela que o usuario do sistema for utilizar, após o mesmo fazer o login, será aberto na mesma janela, um quadro com as opções do menu.
Quando o usuario selecionar uma opção, aparecerá abaixo uma listagem referente a opção que o usuario selecionou. Um dos menbros do meu grupo disse que pode ser feito usando o JDesktopPane e o JInternalPane, onde o internalPane são janelas internas que sao colocadas dentro do Desktop pane fazendo que tudo seja aberto em uma unica janela principal.
Mais encontramos um problema: durante os testes encontrei um problema: voce abre uma janela interna, depois fecha. Quando voce tenta abrir essa mesma janela de novo ela nao abre.
Preciso de ajudar, para entregar as interfaces em um padrao.
@author Rodrigo
*/
public class Menu extends JFrame implements ActionListener {
//cria barra de menu
private JMenuBar jmPrincipal = new JMenuBar();
//cria menu “cadastro” na barra de menu
private JMenu jmCadastro = new JMenu(“Cadastros”);
//cria item “cliente” dentro do menu "cadastro"
private JMenuItem jmCadCliente = new JMenuItem(“Cliente”);
private JMenuItem jmCadFornecedor = new JMenuItem(“Fornecedor”);
//cria objeto jdPane, do tipo JDesktopPane. Ele vai dentro d JFrame
public JDesktopPane jdPane = new JDesktopPane();
Tela telaCadCliente, telaCadFornecedor, telaCadProduto;
//metodo construtor da aplicacao
public Menu() {
//“pegue o conteudo do painel” - adiciona o jDesktopPane ao JFrame (janela principal
getContentPane().add(jdPane);
//adiciona o menu cadastro a barra de menus (jmPrincipal)
jmPrincipal.add(jmCadastro);
//adiciona o item cliente ao menu cadastro
jmCadastro.add(jmCadCliente);
//adiciona o item fornecedor ao menu cadastro
jmCadastro.add(jmCadFornecedor);
//"ajusta" a barra de menu dentro da janela principal
setJMenuBar(jmPrincipal);
//adiciona actionlistener ao item "cliente" do menu,
//para que os eventos sejam tratados
jmCadCliente.addActionListener(this);
//adiciona o actionlistener ao item "fornecedor do menu
jmCadFornecedor.addActionListener(this);
setSize(800, 600);
setVisible(true);
}
//metodo main instancia o objeto menu A inicializacao fica com o construtor da classe
public static void main(String args[]) {
Menu menu = new Menu();
}
//tratamento dos eventos de menu
public void actionPerformed(ActionEvent evt) {
//se o evento capturado for uma chamada vinda do item cliente do menu...
if (evt.getSource() == jmCadCliente) {
//se nao for null, a tela ja esta visivel, tendo apenas que ser "levada pra frente"
if (telaCadCliente == null) //instancia a tela de cadastro de clientes
{
telaCadCliente = new Tela("Cadastro de Cliente", this);
}
//independente da tela estar visavel ou nao, a tela e movida para frente
jdPane.moveToFront(telaCadCliente);
}
// mesmo anterior, porem, ocorre quando o evento vem do item fornecedor do menu...
if (evt.getSource() == jmCadFornecedor) {
if (telaCadFornecedor == null) {
telaCadFornecedor = new Tela("Cadastro de Fornecedor", this);
}
jdPane.moveToFront(telaCadFornecedor);
}
}
}
[/code]
Abaixo o codigo da tela:
[code]/*
To change this template, choose Tools | Templates
and open the template in the editor.
*/
package BOUNDARY;
import javax.swing.JInternalFrame;
/**
*
@author Rodrigo
*/
public class Tela extends JInternalFrame {
//classe pai dos objetos que serao instanciadas por essa classe
private Menu telaPrincipal;
//metodo construtor da tela
public Tela(String titulo, Menu telaPrincipal) {
//reescreve o metodo construtor da classe pai, ajustando o titulo da janela (neste caso)
super(titulo,true,true,true,true);
[code]
//tratamento dos eventos de menu
public void actionPerformed(ActionEvent evt) {
//se o evento capturado for uma chamada vinda do item cliente do menu...
if (evt.getSource() == jmCadCliente) {
//se nao for null, a tela ja esta visivel, tendo apenas que ser "levada pra frente"
telaCadCliente = new Tela("Cadastro de Cliente");
jdPane.add(telaCadCliente);
telaCadCliente.setVisible(true);
}
// mesmo anterior, porem, ocorre quando o evento vem do item fornecedor do menu...
if (evt.getSource() == jmCadFornecedor) {
telaCadFornecedor = new Tela("Cadastro de Fornecedor");
jdPane.add(telaCadFornecedor);
telaCadFornecedor.setVisible(true);
}
}[/code]
E sua classe Tela ficaria assim.:
[code]public class Tela extends JInternalFrame {
//metodo construtor da tela
public Tela(String titulo) {
//reescreve o metodo construtor da classe pai, ajustando o titulo da janela (neste caso)
super(titulo,true,true,true,true);
setSize(782,530);
setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
}
}[/code]
O grande detalhe, é que você deverá dividir as telas, criando classes separadas para cada uma. Ex: TelaCadastroCliente.java e TelaCadastroFornecedor.java
eu consegui fazer aqui, só que quando eu abro as 2 janelas, a de Cadastro de Cliente e de Cadastro de Fornecedores, e depois peço para abrir novamente a janela de Cadastro de Cliente, ele abre outra, então fiz isso ai:
if (telaCadCliente == null){
telaCadCliente = new Tela("Cadastro de Cliente");
jdPane.add(telaCadCliente);
telaCadCliente.setVisible(true);
}
jdPane.moveToFront(telaCadCliente);
Com isso ai, ele move para cima, mais na hora que tento abrir novamente, ela nao abre.
Assim vc voltou para a questão inicial. Ela não abre pois quando você fecha a janela, a referencia da mesma continua.
Não vejo porque bloquear o usuário de abrir 2 ou 3 janelas do mesmo tipo! Porém, se fosse fazer isso, controlaria o JMenuItem para o mesmo ficar desabilitado.
[code] //se o evento capturado for uma chamada vinda do item cliente do menu…
if (evt.getSource() == jmCadCliente) {
//se nao for null, a tela ja esta visivel, tendo apenas que ser "levada pra frente"
if (telaCadCliente == null) //instancia a tela de cadastro de clientes
{
telaCadCliente = new Tela(“Cadastro de Cliente”, this);
telaCadCliente.setDefaultCloseOperation(HIDE_ON_CLOSE);
}
else {
telaCadCliente.setVisible(true);
}
//independente da tela estar visavel ou nao, a tela e movida para frente
jdPane.moveToFront(telaCadCliente);
}
// mesmo anterior, porem, ocorre quando o evento vem do item fornecedor do menu...
if (evt.getSource() == jmCadFornecedor) {
if (telaCadFornecedor == null) {
telaCadFornecedor = new Tela("Cadastro de Fornecedor", this);
telaCadFornecedor.setDefaultCloseOperation(HIDE_ON_CLOSE);
}
else {
telaCadFornecedor.setVisible(true);
}
jdPane.moveToFront(telaCadFornecedor);
}[/code]