Exibir um form por n segundos

Preciso criar um formulário que exiba uma mensagem por n segundos, mas somente quando for não modal. Porque se for modal a mensagem será exibido e operador deverá pressionar o botão Ok para cancelar. Após atingir o tempo o formulário deverá ser fechado automaticamente.
O código do formulário é esse :

/*

  • frmMensagemPopup.java

/
import java.awt.
;
import java.awt.event.;
import javax.swing.
;

public class frmMensagemPopup extends javax.swing.JDialog {

public frmMensagemPopup(java.awt.Frame parent, boolean modal) {
    super(parent, false);
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    initComponents();
    
}

protected void processWindowEvent(WindowEvent e) {
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
        cancel();
    }
    super.processWindowEvent(e);
}
public void cancel() {
    dispose();
}

public void setLinha1(String valor){
    linha1.setText(valor);
}

public void setLinha2(String valor){
    linha2.setText(valor);
}

public void setLinha3(String valor){
    linha3.setText(valor);
}

public void setLinha4(String valor){
    linha4.setText(valor);
}

private void initComponents() {
    java.awt.GridBagConstraints gridBagConstraints;

    jPanel1 = new javax.swing.JPanel();
    linha1 = new javax.swing.JLabel();
    linha2 = new javax.swing.JLabel();
    linha3 = new javax.swing.JLabel();
    linha4 = new javax.swing.JLabel();
    btnOk = new javax.swing.JButton();

    getContentPane().setLayout(new java.awt.GridBagLayout());

    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    setTitle("Mensagem do TEF");
    jPanel1.setLayout(new java.awt.GridBagLayout());

    jPanel1.setMinimumSize(new java.awt.Dimension(400, 66));
    jPanel1.setPreferredSize(new java.awt.Dimension(400, 66));
    linha1.setFont(new java.awt.Font("Verdana", 1, 10));
    linha1.setForeground(new java.awt.Color(255, 0, 0));
    linha1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    linha1.setText("Linha1");
    linha1.setMaximumSize(new java.awt.Dimension(800, 16));
    linha1.setMinimumSize(new java.awt.Dimension(400, 16));
    linha1.setPreferredSize(new java.awt.Dimension(400, 16));
    linha1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridwidth = 3;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    jPanel1.add(linha1, gridBagConstraints);

    linha2.setFont(new java.awt.Font("Verdana", 0, 10));
    linha2.setText("Linha2");
    linha2.setMaximumSize(new java.awt.Dimension(800, 14));
    linha2.setMinimumSize(new java.awt.Dimension(400, 14));
    linha2.setPreferredSize(new java.awt.Dimension(400, 14));
    linha2.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    jPanel1.add(linha2, gridBagConstraints);

    linha3.setFont(new java.awt.Font("Verdana", 0, 10));
    linha3.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    linha3.setText("Linha3");
    linha3.setMaximumSize(new java.awt.Dimension(800, 14));
    linha3.setMinimumSize(new java.awt.Dimension(400, 14));
    linha3.setPreferredSize(new java.awt.Dimension(400, 14));
    linha3.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    jPanel1.add(linha3, gridBagConstraints);

    linha4.setFont(new java.awt.Font("Verdana", 0, 10));
    linha4.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    linha4.setText("Linha4");
    linha4.setMaximumSize(new java.awt.Dimension(800, 14));
    linha4.setMinimumSize(new java.awt.Dimension(400, 14));
    linha4.setPreferredSize(new java.awt.Dimension(400, 14));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    jPanel1.add(linha4, gridBagConstraints);

    getContentPane().add(jPanel1, new java.awt.GridBagConstraints());

    btnOk.setFont(new java.awt.Font("Verdana", 0, 10));
    btnOk.setText("Ok");
    btnOk.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            btnOkActionPerformed(evt);
        }
    });

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    getContentPane().add(btnOk, gridBagConstraints);

    pack();
}

private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {
    cancel();
    
}

public void setBtnOk(boolean valor){
    btnOk.enable(valor);
}

public static void main(String args[]) {
    new frmMensagemPopup(new javax.swing.JFrame(), false).show();
    new frmMensagemPopup().show();
    
}


private javax.swing.JButton btnOk;
private javax.swing.JPanel jPanel1;
public static javax.swing.JLabel linha1;
public static javax.swing.JLabel linha2;
public static javax.swing.JLabel linha3;
public static javax.swing.JLabel linha4;

}

no programa que chama esta classe utilizo este metodo :

public void MensagemPopup(java.awt.Frame parent,
String linha1,
String linha2,
String linha3,
String linha4,
boolean ShowModal){
if ((!linha1.trim().equals("")) ||
(!linha2.trim().equals("")) ||
(!linha3.trim().equals("")) ||
(!linha4.trim().equals("")) ) {

        final frmMensagemPopup fMensagem = new frmMensagemPopup(parent,ShowModal);
        Dimension dlgSize = fMensagem.getPreferredSize();
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 

        fMensagem.setLocation((screen.width - dlgSize.width) / 2 , (screen.height - dlgSize.height) / 2 );
        fMensagem.setLinha1(linha1);
        fMensagem.setLinha2(linha2);
        fMensagem.setLinha3(linha3);
        fMensagem.setLinha4(linha4);

        if (ShowModal){
            fMensagem.setModal(true);
            fMensagem.setBtnOk(true);
        }else{
            fMensagem.setModal(false);
            fMensagem.setBtnOk(false);
        }
        fMensagem.pack();
        fMensagem.show();

        // cria uma tarefa para fechar o formulario, após
        // após alguns segundos de exibição
        if (!ShowModal){
                int numberOfMillisecondsInTheFuture = Integer.parseInt(getTempoMensagem())*1000;
               
                Date timeToRun = new Date(System.currentTimeMillis()+numberOfMillisecondsInTheFuture);
                Timer timer = new Timer();
                timer.schedule(new TimerTask() {

                        public void run() {
                            // fecha o formulario de mensagem
                            fMensagem.cancel();
                        }
                }, timeToRun);
            }
    }
    
}

Neste exemplo, o formulário é exibido durante o n segundos, mas como ele não é modal, ele não exibe as mensagens.
No meu formulário eu chamo este metodo da seguinte forma :
Exemplo :

MensagemPopup(this,“teste1”,“teste2”,“teste3”,“teste4”,false);
<mando imprimir algo …>

Eu consegui achar uma solução, não sei se é a melhor. Vou colocá-la aqui como minha contribuição com este grupo de usuário, que tem me ajuda muito no meu aprendizado em java.

/*

  • frmMensagemPopup.java

/
import java.awt.
;
import java.awt.event.;
import javax.swing.
;
import java.util.Timer;
import java.util.TimerTask;

public class frmMensagemPopup extends javax.swing.JDialog {
Timer tempo;
int Segundos = 0;

public frmMensagemPopup(javax.swing.JDialog parent, boolean modal, int segundos) {
    super(parent, modal);
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    initComponents();
    Segundos = segundos;
}

public void Exibir(){
    if (!this.isModal()){
        // se não modal, exibir o formulario
        // durante segundos determinando no parametro
        setModal(true);
        
        tempo = new Timer();
        tempo.schedule(new Tarefa(), Segundos*1000);
        setBtnOk(false);
        
    }
    pack();
    show();
}

// classe que executará o fechamento do formulário,
// quando o tempo em segundos esgotar.
class Tarefa extends TimerTask {
    public void run() {
        Terminar(); // Termina a linha de execução tempo
    }
}

protected void processWindowEvent(WindowEvent e) {
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
        Terminar();
    }
    super.processWindowEvent(e);
}

public void Terminar() {
    dispose();
}

public void setLinha1(String valor){
    linha1.setText(valor);
}

public void setLinha2(String valor){
    linha2.setText(valor);
}

public void setLinha3(String valor){
    linha3.setText(valor);
}

public void setLinha4(String valor){
    linha4.setText(valor);
}


private void initComponents() {
    java.awt.GridBagConstraints gridBagConstraints;

    jPanel1 = new javax.swing.JPanel();
    linha1 = new javax.swing.JLabel();
    linha2 = new javax.swing.JLabel();
    linha3 = new javax.swing.JLabel();
    linha4 = new javax.swing.JLabel();
    btnOk = new javax.swing.JButton();

    getContentPane().setLayout(new java.awt.GridBagLayout());

    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    setTitle("Mensagem do TEF");
    jPanel1.setLayout(new java.awt.GridBagLayout());

    jPanel1.setMinimumSize(new java.awt.Dimension(400, 66));
    jPanel1.setPreferredSize(new java.awt.Dimension(400, 66));
    linha1.setFont(new java.awt.Font("Verdana", 1, 10));
    linha1.setForeground(new java.awt.Color(255, 0, 0));
    linha1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    linha1.setText("Linha1");
    linha1.setMaximumSize(new java.awt.Dimension(800, 16));
    linha1.setMinimumSize(new java.awt.Dimension(400, 16));
    linha1.setPreferredSize(new java.awt.Dimension(400, 16));
    linha1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridwidth = 3;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    jPanel1.add(linha1, gridBagConstraints);

    linha2.setFont(new java.awt.Font("Verdana", 0, 10));
    linha2.setText("Linha2");
    linha2.setMaximumSize(new java.awt.Dimension(800, 14));
    linha2.setMinimumSize(new java.awt.Dimension(400, 14));
    linha2.setPreferredSize(new java.awt.Dimension(400, 14));
    linha2.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    jPanel1.add(linha2, gridBagConstraints);

    linha3.setFont(new java.awt.Font("Verdana", 0, 10));
    linha3.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    linha3.setText("Linha3");
    linha3.setMaximumSize(new java.awt.Dimension(800, 14));
    linha3.setMinimumSize(new java.awt.Dimension(400, 14));
    linha3.setPreferredSize(new java.awt.Dimension(400, 14));
    linha3.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    jPanel1.add(linha3, gridBagConstraints);

    linha4.setFont(new java.awt.Font("Verdana", 0, 10));
    linha4.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    linha4.setText("Linha4");
    linha4.setMaximumSize(new java.awt.Dimension(800, 14));
    linha4.setMinimumSize(new java.awt.Dimension(400, 14));
    linha4.setPreferredSize(new java.awt.Dimension(400, 14));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(1, 1, 1, 1);
    jPanel1.add(linha4, gridBagConstraints);

    getContentPane().add(jPanel1, new java.awt.GridBagConstraints());

    btnOk.setFont(new java.awt.Font("Verdana", 0, 10));
    btnOk.setText("Ok");
    btnOk.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            btnOkActionPerformed(evt);
        }
    });

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    getContentPane().add(btnOk, gridBagConstraints);

    pack();
}

private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Terminar();
    
}

public void setBtnOk(boolean valor){
    btnOk.enable(valor);
    btnOk.setVisible(valor);
}



// Variables declaration - do not modify
private javax.swing.JButton btnOk;
private javax.swing.JPanel jPanel1;
public static javax.swing.JLabel linha1;
public static javax.swing.JLabel linha2;
public static javax.swing.JLabel linha3;
public static javax.swing.JLabel linha4;
// End of variables declaration

}

E para chamar esta classe utilizo este método :

public void MensagemPopup(String linha1,
                          String linha2,
                          String linha3,
                          String linha4,
                          boolean ShowModal){
    if ((!linha1.trim().equals("")) ||
        (!linha2.trim().equals("")) ||
        (!linha3.trim().equals("")) ||
        (!linha4.trim().equals("")) ) {


        frmMensagemPopup fMensagem = new frmMensagemPopup(getParentFrame(), ShowModal,Integer.parseInt(getTempoMensagem()));
        
        Dimension dlgSize = fMensagem.getPreferredSize();
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 

        fMensagem.setLocation((screen.width - dlgSize.width) / 2 , (screen.height - dlgSize.height) / 2 );

        fMensagem.setLinha1(linha1);
        fMensagem.setLinha2(linha2);
        fMensagem.setLinha3(linha3);
        fMensagem.setLinha4(linha4);

        if (ShowModal){
            fMensagem.setModal(true);
            fMensagem.setBtnOk(true);
        }else{
            fMensagem.setModal(false);
            fMensagem.setBtnOk(false);
        }

        fMensagem.Exibir();
        
        getParentFrame().requestFocus();
    }
    
}

Espero que esta solução ajude alguem …

Só uma dica Italivio. Coloque o código entre [code ]código aqui[/code ].
Ficará mais legível. :wink:

Obrigado pela dica.