Pessoal,
Tenho uma thread que exibe um dialogo de progressão durante um processamento. Este dialogo abre e fecha várias e várias vezes. O problema é que todas as vezes que ele abre, ele aparece na frente de toda e qualquer aplicação que o usuário esteja mexendo.
Exemplo: usuário coloca determinado processamento no sistema, e abre o navegador ou o word. A medida que o dialogo de progressão aparece, ele aparece na frente de todos estes aplicativos. O que impossibilita que o usuário continue fazendo o que estava fazendo, e aí inutiliza o computador durante o processamento.
Segue o código do dialogo:
/**
- Classe que implementa o pattern Observer. Essa classe é destinada a notificar um {link DialogoProgressao} se ele
- deve ser exibido na tela ou não.
*/
class ObserverDialogo extends Observable {
/**
- Método que notifica um Observer que o estado do objeto foi alterado.
*/
public void notifica(boolean isExibe) {
setChanged();
if (isExibe) {
notifyObservers(“exibeDialogo”);
} else {
notifyObservers(“fechaDialogo”);
}
}
}
public class DialogoProgressao extends JDialog implements KeyListener, Observer, Runnable {
private static final long serialVersionUID = 1L;
private JLabelComp msgLinha51;
private JLabelComp msgLinha52;
private JProgressBar progressao;
/**
- Observer para notificar a alteração de estado no {link DialogoProgressao} para que ele seja exibido.
/
private ObserverDialogo observer;
/*- Objeto que armazena a mensagem a ser exibida no Diálogo.
/
private String mensagem;
private JPanelComp painelLabels;
private ThreadExibicao threadExibicao;
/*- Variável criada para verificar em outros pontos do sistema se o diálogo progressão foi notificado para ser exibido
- ou fechado.
*/
private boolean isNotificado;
public DialogoProgressao(Window sistema) throws NumberFormatException, Exception {
super(sistema, ConstantesString.NOME_SISTEMA.toString());
setModal(true);
setFocusableWindowState(false);
/*
* Cria um novo observer para verificar a existência de mensagens a serem exibidas e adiciona o próprio diálogo como
* observador.
*/
if (sistema != null) {
observer = new ObserverDialogo();
observer.addObserver(this);
}
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setLayout(new BorderLayout());
if (Platform.isWindows()) {
setUndecorated(true);
}
msgLinha51 = new JLabelComp();
msgLinha52 = new JLabelComp();
LookAndFeel lookAndFeelAnterior = UIManager.getLookAndFeel();
UIManager.setLookAndFeel(new MetalLookAndFeel());
// copy progress bar defaults
HashMap<Object, Object> progressDefaults = new HashMap<>();
for (Map.Entry<Object, Object> entry : UIManager.getDefaults().entrySet()) {
if (entry.getKey().getClass() == String.class && ((String) entry.getKey()).startsWith(“ProgressBar”)) {
progressDefaults.put(entry.getKey(), entry.getValue());
}
}
// set nimbus
UIManager.setLookAndFeel(lookAndFeelAnterior);
// copy back progress bar defaults
for (Map.Entry<Object, Object> entry : progressDefaults.entrySet()) {
UIManager.getDefaults().put(entry.getKey(), entry.getValue());
}
progressao = new JProgressBar();
progressao.setIndeterminate(true);
painelLabels = new JPanelComp(new BorderLayout());
painelLabels.add(msgLinha51, BorderLayout.NORTH);
painelLabels.add(msgLinha52, BorderLayout.SOUTH);
add(painelLabels, BorderLayout.NORTH);
add(progressao, BorderLayout.SOUTH);
setSize(500, 75);
addKeyListener(this);
setLocationRelativeTo(sistema);
setResizable(false);
}
/**
- Método que monta a janela de diálogo com progressão com o layout específico
- param sistema
- Janela que será utilizada para ser a referência de centralização do diálogo.
- throws Exception
*/
public void montaDialogoProgressao(JFrame sistema) throws Exception {
// Verifica se o sistema é diferente de Linux para setar a borda dentro do dialogo progressão. No Linux a borda
// “corta” parte do texto dentro do lialogo. André Nogueira 26/03/2014
LayoutComp layoutAtivo = LayoutCompManager.getLayoutAtivo();
if (layoutAtivo != null) {
if (Platform.isWindows()) {
getRootPane().setBorder(BorderFactory.createLineBorder(layoutAtivo.getCorBordaTelas(), 4));
}
msgLinha51.setForeground(layoutAtivo.getForeground1());
msgLinha52.setForeground(layoutAtivo.getForeground1());
Color corFundoPainel = layoutAtivo.getBackgroundPainel();
painelLabels.setBackground(corFundoPainel);
progressao.setBackground(corFundoPainel);
getContentPane().setBackground(corFundoPainel);
} setSize(500, 75 + ((isUndecorated() || sistema == null) ? 0 : sistema.getInsets().top)); setLocationRelativeTo(sistema);
}
public JLabelComp getMsgLinha52() {
return msgLinha52;
}
public void setMsgLinha52(JLabelComp msg) {
this.msgLinha52 = msg;
}
public JLabelComp getMsgLinha51() {
return msgLinha51;
}
public void setMsgLinha51(JLabelComp msgLinha51) {
this.msgLinha51 = msgLinha51;
}
Override
public void keyTyped(KeyEvent e) {
}
Override
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == ‘C’) && (e.getModifiers() == 2)) {
try {
Comunicacao.getInstance().writeBlocoAlfaNumerico(3);
} catch (Exception e1) {
Log.getInstance().gravaErro(getClass(), e1);
}
}
}
Override
public void keyReleased(KeyEvent e) {
}
public JProgressBar getProgressao() {
return progressao;
}
public void setProgressao(JProgressBar progressao) {
this.progressao = progressao;
}
Override
public void update(Observable o, Object arg) {
/*
* Ao receber uma mensagem do Observador para exibir o dialogo com progressão é verificado se o próprio já não está
* visível para evitar que se crie várias threads para exibir o DialogoProgressao.
*/
if (“exibeDialogo”.equals(arg) && (!isVisible() || !isDisplayable())) {
if (threadExibicao == null) {
threadExibicao = new ThreadExibicao(this);
}
if (threadExibicao.isInterrupted() || !threadExibicao.isAlive()) {
try {
threadExibicao.start();
} catch (IllegalThreadStateException e) {
threadExibicao = new ThreadExibicao(this);
threadExibicao.start();
}
}
} else if (isVisible() || isDisplayable()) { requestFocus(); } /* * Caso receba uma mensagem para fechar o diálogo, simplesmente o fecha e interrompe a execução da thread. */ if ("fechaDialogo".equals(arg)) { SwingUtilities.invokeLater(new Runnable() {
Override public void run() { if (isVisible() || isDisplayable()) { dispose(); } } }); if (threadExibicao != null) { threadExibicao.interrupt(); /* * Aguarda a thread morrer antes de anula-la. Isso é necessário para evitar que entre uma mensagem e outra algo * seja perdido pelo fato do objeto não ter se anulado ainda. */ try { threadExibicao.join(); } catch (Exception e) { Log.getInstance().gravaErro(getClass(), e); } } threadExibicao = null; }
}
public String getMensagem() {
return mensagem;
}
/**
- Método que seta a mensagem a ser exibida no {link DialogoProgressao}. Nesse método é notificada a alteração de
- estado do observer para que o {link DialogoProgressao} seja exibido ou fechado, caso o parâmetro informado seja
null
.- param mensagem
- Mensagem a ser exibida. Caso seja informado <code>null</code> e o {link DialogoProgressao} esteja
visível, ele será fechado.
*/
public void setMensagem(String mensagem) {
if (mensagem != null) {
this.mensagem = mensagem;
getMsgLinha51().setHorizontalAlignment(JLabelComp.CENTER);
getMsgLinha51().setText(mensagem);
if (observer != null) {
observer.notifica(true);
}
} else {
getMsgLinha51().setHorizontalAlignment(JLabelComp.LEFT);
if (observer != null) {
observer.notifica(false);
}
}
}public void setMensagem(boolean vf, String mensagem) {
if (vf) {
setMensagem(mensagem);
}
}
Override
public void run() {
/*
* Uma thread dessa classe deve apenas exibir o DialogoProgressao. É feito em uma thread separada para não travar o
* processamento do sistema.
*/
SwingUtilities.invokeLater(new Runnable() {
Override public void run() { if (!isVisible()) { setVisible(true); } } });
}
public ObserverDialogo getObserver() {
return observer;
}
public void setObserver(ObserverDialogo observer) {
this.observer = observer;
}
public void notifica(boolean isExibe) {
isNotificado = isExibe;
if (observer != null) {
observer.notifica(isExibe);
} else {
if (isExibe) {
SwingUtilities.invokeLater(new Runnable() {
Override public void run() { if (!isVisible()) { setVisible(true); } } }); } else { SwingUtilities.invokeLater(new Runnable() {
Override public void run() { dispose(); } }); } }
}
public boolean isNotificado() {
return isNotificado;
}
public void setNotificado(boolean isNotificado) {
this.isNotificado = isNotificado;
}
}
class ThreadExibicao extends Thread {
private DialogoProgressao dialogo;
public ThreadExibicao(DialogoProgressao dialogo) {
super(“ExibicaoDialogoProgressao”);
this.dialogo = dialogo;
}
Override
public void run() {
if (!dialogo.isVisible()) {
dialogo.setVisible(true);
}
}
}
A chamada na Thread é feita através dos métodos montaDialogoProgressao e notifica(true) em sequência.
Será que alguém tem ideia do que possa ser?