Pessoal,
Quando executo o meu aplicativo, enquanto a conexão e a estrutura do banco de dados é verificada eu fico mostrando uma Splash Screen.
Depois que este processo de inicialização é efetuado eu chamo um método para obter o código e a senha do usuário.
O problema é que quando a Splash Screen é exibida não aparece o aplicativo na barra de tarefas. Ou seja, só consigo ir para o aplicativo através do CTRL-TAB. Este problema também ocorre quando se está na tela de login.
Sei que o problema está na classe que está sendo extendida, no caso é a JDialog.
Já tentei mudar a tela de login de JDialog para JFrame, mas ao fazer isto ele não fica na tela esperando informar o usuário e a senha, ele fecha a tela automaticamente. Enquanto está como JDialog eu consigo fazer um SETMODAL(TRUE), e isso faz com que ele fique aguardando a resposta.
Tentei pegar alguns exemplos aqui no fórum, mas nenhum deles resolveu o meu problema.
Abaixo estou colocando os fontes para melhor entendimento:
Esta é a classe principal, de onde a Splash Screen (cujo nome é “Splash”) está sendo chamada:
package loterias;
/* import contrib.ch.randelshofer.quaqua.util.Images; */
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.event.*;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.jvnet.substance.*;
import org.jvnet.substance.watermark.*;
/**
* Classe principal do sistema MAINCLASS.
*/
public class Main {
/**
* @param args Argumentos da linha de comando
*/
public static void main(String[] args) {
CFGManager cfgInstance = CFGManager.getInstance();
SubstanceLookAndFeel.setCurrentTheme(cfgInstance.getValueString("LOOK_AND_FEEL"));
SubstanceLookAndFeel.setCurrentWatermark(new SubstancePlanktonWatermark());
try {
UIManager.setLookAndFeel(cfgInstance.getValueString("CLASS_LOOK_AND_FEEL"));
} catch (UnsupportedLookAndFeelException ulafe) {
Utilidades utilInstance = Utilidades.getInstance();
String stackMensagem = utilInstance.montaMensagemErro(ulafe.toString(),ulafe.getStackTrace());
utilInstance.exibeMensagem("Erro","Não foi possível setar o 'LookAndFeel' como '" + cfgInstance.getValueString("LOOK_AND_FEEL") + "'.",stackMensagem,utilInstance.MSGERROR);
} catch (ClassNotFoundException cnfe) {
Utilidades utilInstance = Utilidades.getInstance();
String stackMensagem = utilInstance.montaMensagemErro(cnfe.toString(),cnfe.getStackTrace());
utilInstance.exibeMensagem("Erro","Classe LookAndFeel '" + cfgInstance.getValueString("CLASS_LOOK_AND_FEEL") + "' não foi encontrada.",stackMensagem,utilInstance.MSGERROR);
} catch (InstantiationException ie) {
Utilidades utilInstance = Utilidades.getInstance();
String stackMensagem = utilInstance.montaMensagemErro(ie.toString(),ie.getStackTrace());
utilInstance.exibeMensagem("Erro","Falha ao instanciar a classe LookAndFeel '"+ cfgInstance.getValueString("CLASS_LOOK_AND_FEEL") + "'",stackMensagem,utilInstance.MSGERROR);
} catch (IllegalAccessException iae) {
Utilidades utilInstance = Utilidades.getInstance();
String stackMensagem = utilInstance.montaMensagemErro(iae.toString(),iae.getStackTrace());
utilInstance.exibeMensagem("Erro","Acesso negado a classe LookAndFeel '" + cfgInstance.getValueString("CLASS_LOOK_AND_FEEL") + "'",stackMensagem,utilInstance.MSGERROR);
}
SubstanceLookAndFeel.hideMenuSearchPanels();
Splash splashInstance = Splash.getInstance("image/logo.gif");
splashInstance.addManualProgressBar(0, 18); // 18 = Número de passos a serem efetuados na inicialização
splashInstance.setProgressBarString("Inicializando o sistema ...");
splashInstance.showSplash();
/*
for (int i = 0; i < 20000; i++) {
System.out.println(i);
}
*/
InicializaSistema initInstance = InicializaSistema.getInstance();
initInstance.Inicializa();
splashInstance.hideSplash();
CadUsuarios usuLogin = new CadUsuarios();
if (usuLogin.loginSistema()) {
MPrincipal menuPrinc = MPrincipal.getInstance();
menuPrinc.initApplication();
} else {
System.exit(0);
}
}
}
Esta é a classe Splash:
package loterias;
import java.awt.Toolkit;
import java.awt.event.*;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;
public class Splash extends JWindow {
private JLabel bitmapLabel;
private Timer timeoutTimer = null;
private Timer progressTimer = null;
private int timeout = 0;
private int progressBarSmoothness = 100;
private JProgressBar bar = null;
private static Splash instancia;
private URL bitmapURL = null;
/**
* Constrói uma nova tela de abertura com uma imagem. Para exibir esta tela de entrada,
* use <code>showSplash()</code>.
*
* @param filename O caminho do arquivo de imagem a ser exibida.
*/
private Splash(URL filename) {
this.bitmapURL = filename;
this.init();
}
/**
* Constrói uma nova tela de abertura com uma imagem. Para exibir esta tela de entrada,
* use <code>showSplash()</code>.
*
* @param filename Nome da imagem a ser exibida.
*/
private Splash(String filename) {
File bitmapFile = new File(filename);
try {
this.bitmapURL = bitmapFile.toURL();
} catch(MalformedURLException ignore) {
}
this.init();
}
/**
* Retornar a instância da classe Utilidades.
* @param filename Nome do arquivo de imagem a ser exibido na tela de abertura.
*/
protected Splash getInstance(URL filename) {
if (instancia == null) {
instancia = new Splash(filename);
}
return instancia;
}
/**
* Retornar a instância da classe Splash.
* @param filename Nome do arquivo de imagem a ser exibido na tela de abertura.
*/
protected static Splash getInstance(String filename) {
if (instancia == null) {
instancia = new Splash(filename);
}
return instancia;
}
/**
* Retornar a instância da classe Splash.
*/
protected static Splash getInstance() {
return instancia;
}
/**
* Inicializa a tela de abertura a partir de uma JWindow e adiciona um JLabel contendo uma imagem.
* Atualiza a posição da janela para o centro da tela.
*/
private void init() {
this.bitmapLabel = new JLabel();
ImageIcon bitmapImage = new ImageIcon(Toolkit.getDefaultToolkit().createImage(this.bitmapURL));
int height = bitmapImage.getIconHeight();
int width = bitmapImage.getIconWidth();
bitmapLabel.setIcon(bitmapImage);
bitmapLabel.setSize(width, height);
bitmapLabel.setLocation(0, 0);
this.getContentPane().setLayout(null);
this.getContentPane().add(bitmapLabel, null);
this.setSize(width, height);
this.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - height) / 2);
}
/**
* Exibe a tela de abertura. A mesma será centralizada na tela. O contador de tempo (Timer)
* será iniciado quando este método for chamado, e não quando ele for instanciado.
*/
protected void showSplash() {
if(timeoutTimer != null) {
timeoutTimer.start();
}
if(progressTimer != null) {
progressTimer.start();
}
this.setVisible(true);
}
/**
* Esconde a tela de abertura e pára a execução do contador de tempo (Timer).
*/
protected void hideSplash() {
this.setVisible(false);
if(timeoutTimer != null) {
timeoutTimer.stop();
timeoutTimer = null;
}
if(progressTimer != null) {
progressTimer.stop();
progressTimer = null;
}
}
/**
* Prepara a tela de abertura para ser fechada após a passagem de um certo tempo.
* A tela de abertura poderá ser escondida ao final do contador de tempo (Timer) <b>e</b> em
* um clique, ou o que ocorrer primeiro.
*
* @param timeout Tempo, em milisegundos, em que a tela de abertura ficará sendo exibida.
*/
protected void hideOnTimeout(int timeout) {
this.timeout = timeout;
timeoutTimer = new Timer(timeout, new ActionListener() {
public void actionPerformed(ActionEvent e) {
hideSplash();
}
});
timeoutTimer.setRepeats(false);
}
/**
* Prepara a tela de abertura para ser fechada após um clique.
* A tela de abertura poderá ser escondida ao final do contador de tempo (Timer) <b>e</b> em
* um clique, ou o que ocorrer primeiro.
*/
protected void hideOnClick() {
this.addMouseListener(new MouseAdapter() {
/**
* Esconde a tela de abertura quando ocorrer um clique do mouse.
*
* @see java.awt.event.MouseListener#mouseClicked(MouseEvent)
*/
public void mouseClicked(MouseEvent e) {
hideSplash();
}
});
}
/**
* Adicionar uma barra de progressão na tela de abertura. Se uma outra tiver sido adicionada antes
* a mesma será substituída pela primeira. A barra de progressão ficará abaixo da imagem.
* Você ainda não tem os valores mínimos e máximos. Eles serão aplicados nos métodos posteriores.
*/
private void addProgressBar() {
if(bar != null) {
this.remove(bar);
this.setSize(this.getWidth(), this.getHeight() - 13);
}
progressTimer = null;
bar = new JProgressBar();
bar.setSize(this.getWidth(), 13);
bar.setForeground(new java.awt.Color(0, 0, 0));
bar.setLocation(0, this.getHeight());
this.setSize(this.getWidth(), this.getHeight() + 13);
this.getContentPane().add(bar, null);
}
/**
* Adiciona uma barra de progressão na tela de abertura, que será atualizada automaticamente.
* A barra de progressão será configurada quando o progresso completar o tempo do contador (Timer)
* setado por <code>hideOnTimeout(int)</code>.
* Apenas uma barra de progressão pode ser adicionada nada tela de abertura ao mesmo tempo.
* Adicionando uma segunda barra de progressão você estará sobrepondo a primeira.
* @see #hideOnTimeout(int)
*/
protected void addAutoProgressBar() {
this.addManualProgressBar(0, progressBarSmoothness);
progressTimer = new Timer(timeout / progressBarSmoothness, new ActionListener() {
public void actionPerformed(ActionEvent e) {
setProgressBarValue(getProgressBarValue() + 1);
}
});
}
/**
* Adiciona uma indeterminada JProgressBar na tela de abertura que será atualizada quando
* esta tela for exibida.
* Somente uma barra de progressão pode ser adicionada ao mesmo tempo.
* Adicionando uma segunda barra de progressão você estará sobrepondo a primeira.
*/
protected void addAutoProgressBarIndeterminate() {
this.addProgressBar();
bar.setIndeterminate(true);
}
/**
* Adiciona uma JProgressBar na tela de abertura que poderá ser atualizada manualmente.
* Somente uma barra de progressão pode ser adicionada ao mesmo tempo.
* Adicionando uma segunda barra de progressão você estará sobrepondo a primeira.
*
* @param min Valor mínimo da barra de progressão.
* @param max Valor máximo da barra de progressão.
* @see #setProgressBarValue(int)
* @see #getProgressBarValue()
*/
protected void addManualProgressBar(int min, int max) {
this.addProgressBar();
bar.setMinimum(min);
bar.setMaximum(max);
}
/**
* Atualizar o valor da barra de progressão na tela com um novo valor.
* @param value Novo valor da barra de progressão.
*/
protected void setProgressBarValue(int value) {
if(bar != null) {
bar.setValue(value);
} else {
throw new IllegalStateException("Add a progress bar before trying to change it.");
}
}
/**
* Obtém o valor corrente da barra de progressão.
* @return Valor corrente da barra de progressão.
*/
protected int getProgressBarValue() {
if(bar != null) {
return bar.getValue();
} else {
throw new IllegalStateException("Add a progress bar before trying to access it.");
}
}
/**
* Atualiza a mensagem de texto a ser exibida na barra de progressão.
* Se a mensagem for nula será exibido o percentual.
* @param text Texto a ser exibido na barra de progressão.
*/
protected void setProgressBarString(String text) {
if(bar != null) {
CFGManager cfgInstance = CFGManager.getInstance();
bar.setFont(new java.awt.Font(cfgInstance.getValueString("BAR_FONT_NAME"),
0,
cfgInstance.getValueInteger("BAR_FONT_SIZE")));
bar.setForeground(new java.awt.Color(cfgInstance.getValueInteger("BAR_FONT_COLOR_R"),
cfgInstance.getValueInteger("BAR_FONT_COLOR_G"),
cfgInstance.getValueInteger("BAR_FONT_COLOR_B")));
if(text != null) {
bar.setStringPainted(!text.equals(""));
}
bar.setString(text);
} else {
throw new IllegalStateException("Add a progress bar before trying to change it.");
}
}
/**
* Exibe o percentual do progresso na barra de progressão.
*/
protected void addProgressBarPercent() {
if(bar != null) {
bar.setString(null);
bar.setStringPainted(true);
} else {
throw new IllegalStateException("Add a progress bar before trying to change it.");
}
}
}
Esta é o método onde é feito o login (o “dTela” é um JDialog):
protected Boolean loginSistema() {
opEscolha = false;
JButton btOk = utilInstance.configuraJButton("OK",'O',new javax.swing.ImageIcon("image/ok.gif"),dTela);
JButton btCancelar = utilInstance.configuraJButton("Cancelar",'C',new javax.swing.ImageIcon("image/cancelar.gif"),dTela);
JLabel lbcdUsuario = utilInstance.configuraJLabel("Usuário:");
Dimension lbcdUsuarioSize = lbcdUsuario.getPreferredSize();
JLabel lbtxSenha = utilInstance.configuraJLabel("Senha:");
Dimension lbtxSenhaSize = lbtxSenha.getPreferredSize();
tfcdUsuario = utilInstance.configuraJTextField(null,10,dTela);
pftxSenha = utilInstance.configuraJPasswordField(null,10,dTela);
dTela.setModal(true);
dTela.getContentPane().setLayout(null);
dTela.setTitle("Loterias - Login");
dTela.getContentPane().add(btOk,null);
dTela.getContentPane().add(btCancelar,null);
dTela.getContentPane().add(lbcdUsuario,null);
dTela.getContentPane().add(lbtxSenha,null);
dTela.getContentPane().add(tfcdUsuario,null);
dTela.getContentPane().add(pftxSenha,null);
dTela.setSize(360, 180);
dTela.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - dTela.getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - dTela.getSize().height) / 2);
lbcdUsuario.setBounds((dTela.getSize().width / 2) - (lbcdUsuarioSize.getSize().width + 50),
(dTela.getSize().height / 2) + (lbcdUsuarioSize.getSize().height - 80),
lbcdUsuarioSize.getSize().width,
lbcdUsuarioSize.getSize().height);
tfcdUsuario.setBounds(lbcdUsuario.getX() + lbcdUsuario.getSize().width + 10 ,
(dTela.getSize().height / 2) + (tfcdUsuario.getSize().height - 87),
tfcdUsuario.getSize().width,
tfcdUsuario.getSize().height);
lbtxSenha.setBounds((dTela.getSize().width / 2) - (lbtxSenhaSize.getSize().width + 50),
lbcdUsuario.getY() + lbcdUsuario.getSize().height + 10,
lbtxSenhaSize.getSize().width,
lbtxSenhaSize.getSize().height);
pftxSenha.setBounds(lbtxSenha.getX() + lbtxSenha.getSize().width + 10,
lbcdUsuario.getY() + lbcdUsuario.getSize().height + 10,
tfcdUsuario.getSize().width,
tfcdUsuario.getSize().height);
btOk.setBounds((dTela.getSize().width / 2) - (btOk.getSize().width + 10),
(dTela.getSize().height / 2) + (btOk.getSize().height - 15),
btOk.getSize().width,
btOk.getSize().height);
btOk.addActionListener(new btOkActionListener());
btCancelar.setBounds((dTela.getSize().width / 2) + 10,
(dTela.getSize().height / 2) + (btCancelar.getSize().height - 15),
btCancelar.getSize().width,
btCancelar.getSize().height);
btCancelar.addActionListener(new btCancelarActionListener());
dTela.setVisible(true);
return opEscolha;
}
Alguém poderia me indicar o que preciso mudar ou então qual a classe que devo utilizar para funcionar do jeito esperado?
[/b][/code]