JDialog com setModal desabilita botoes! Como corrigir isso? [RESOLVIDO]

3 respostas
ferracin

Boa tarde galera do GUJ, estou precisando de uma ajuda, estou desenvolvendo uma aplicação em swing e me deparei com um problema.

Tenho duas UI chamadas (JFRAME)EquipamentosUI e outra (JDIALOG)Login UI.
Estas duas User Interface são chamadas através de duas classes controller.
O sistema primeiro o controller Equipamentos que chama a UI Equipamentos e depois chama a controller Login que chama LoginUI, o problema acontece quando seto o Modal da LoginUi para true, ele desabilita os botões, porque acontece isso, alguem poderia me dar uma luz?
Pode ser até uma besteira minha, mas como estou estudando ainda, agradeço qualquer ajuda.

Seguem as classes

EQUIPAMENTOS UI
package br.com.equipamentos.ui;

import java.awt.event.ActionListener;

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

import br.com.equipamentos.controller.LoginController;

public class EquipamentosUI extends JFrame {

	private static final long serialVersionUID = 1L;

	public JDesktopPane desktop;
	public JMenuBar barraMenu;
	public JMenu menuMaquina, menuManutencao, menuUsuario, menuAjuda;
	public JMenuItem miUsuCadastro, miUsuEdita, miUsuExclui, miSair;

	public EquipamentosUI() {
		barraMenu = criarBarraMenu();
		desktop = new JDesktopPane();

		inicializar();
	}

	private void inicializar() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setExtendedState(MAXIMIZED_BOTH);
		this.setTitle("Controle de Manutenção e Equipamentos Gráficos");

		this.setContentPane(desktop);
		this.setJMenuBar(barraMenu);

		this.setVisible(true);

	}

	private JMenuBar criarBarraMenu() {
		barraMenu = new JMenuBar();

		menuMaquina = new JMenu("Equipamentos");
		menuManutencao = new JMenu("Fornecedores e Mecânicos");
		menuUsuario = new JMenu("Usuários");
		menuAjuda = new JMenu("Ajuda");

		miUsuCadastro = new JMenuItem("Cadastro");
		miUsuEdita = new JMenuItem("Edita");
		miUsuExclui = new JMenuItem("Exclui");
		menuUsuario.add(miUsuCadastro);
		menuUsuario.add(miUsuEdita);
		menuUsuario.add(miUsuExclui);

		barraMenu.add(menuMaquina);
		barraMenu.add(menuManutencao);
		barraMenu.add(menuUsuario);
		barraMenu.add(menuAjuda);
		barraMenu.add(miSair = new JMenuItem("Sair"));

		return barraMenu;
	}

	public void adicionarOuvinte(ActionListener ouvinte) {
		
		this.miSair.addActionListener(ouvinte);
		this.miUsuCadastro.addActionListener(ouvinte);
		
	}
	
	public JFrame getJframe(){
		return this;
	}
	
	
}
LOGIN UI
package br.com.equipamentos.ui;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import br.com.equipamentos.dao.UsuarioDAO;

public class LoginUi extends JDialog {

	private static final long serialVersionUID = 1L;

	public JPanel painelLogin;
	public JComboBox cbUsuarios;
	public JPasswordField pfSenha;
	public JButton btnOk, btnSair;
	
	public LoginUi() {
		painelLogin = new JPanel(new GridLayout(3, 2, 5, 5));
		painelLogin.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
		cbUsuarios = new JComboBox(listaUsuarios());
		
		painelLogin.add(new JLabel("Usuario: "));
		painelLogin.add(cbUsuarios);
		painelLogin.add(new JLabel("Senha: "));
		painelLogin.add(pfSenha = new JPasswordField(10));
		painelLogin.add(btnOk = new JButton("Ok"));
		painelLogin.add(btnSair = new JButton("Sair"));
		
		this.run();

	}

	private void run() {
		int largura = 300;
		int altura = 200;
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		int posX = (dim.width / 2) - (largura / 2);
		int posY = (dim.height / 2) - (altura / 2);
		
		this.setTitle("Login");
		this.setSize(300, 200);
		
		this.setLocation(posX,posY);
				
		this.add(painelLogin);
		
		this.pack();
		this.setModal(true);
		this.setVisible(true);
		
	}

	public String[] listaUsuarios() {
		return new UsuarioDAO().listaNomes();
	}

	public void adicionarOuvinte(ActionListener ouvinte) {
		this.btnOk.addActionListener(ouvinte);
		this.btnSair.addActionListener(ouvinte);
		
	}

}
EQUIP CONTROLLER
package br.com.equipamentos.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

import br.com.equipamentos.ui.EquipamentosUI;

public class EquipamentosController {

	EquipamentosUI equipUi = null;
	LoginController login = null;

	public void run() {
		equipUi = new EquipamentosUI();
		equipUi.adicionarOuvinte(new OuvinteEquipamentos());
		
		login = new LoginController();

	}

	class OuvinteEquipamentos implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			Object fonte = e.getSource();

			if (e.getSource() instanceof JMenuItem) {

				if (fonte == equipUi.miSair) {

					int opcao = JOptionPane.showConfirmDialog(null,
							"Deseja sair do sistema", "Sair do sistema",
							JOptionPane.YES_NO_OPTION);
					if (opcao == 0)
						System.out.println("Valor=" + opcao);
					System.exit(0);

				} else if (fonte == equipUi.miUsuCadastro) {
					login = new LoginController();
				}

			}

		}

	}
}
LOGIN CONTROLLER
package br.com.equipamentos.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import br.com.equipamentos.ui.LoginUi;

public class LoginController {
	
	LoginUi loginUi = null;
	
	public LoginController() {
		loginUi = new LoginUi();
		loginUi.adicionarOuvinte(new OuvinteLogin());
	}
	
	class OuvinteLogin implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			
			if(e.getActionCommand() == "Ok") {
				loginUi.dispose();
			} else {
				System.exit(0);
			}
			
		}
		
	}

}

3 Respostas

visola

Na documentação diz que o método setModal não deve ser usado. Ao invés dele deve ser usado o método setModalityType. Tenta com esse método e veja se o problema persiste.

ViniGodoy

Não chame o setVisible(true) no construtor das suas janelas.
Especialmente das modais.

Lembre-se que o código de uma janela modal trava no setVisible, até que a janela seja fechada.

Por isso, o comando não sai do construtor e, por consequencia, jamais chama o método adicionarOuvinte.

ferracin

Já tinha tentado também com setModalityType,e ficou na mesma, mas segui a dica de nosso amigo ViniGodoy e coloquei o setVisible(true) no Controller da Janela Login e deu certo, muito obrigado e GUJ como sempre.ajudando.

Criado 1 de março de 2011
Ultima resposta 1 de mar. de 2011
Respostas 3
Participantes 3