Component chamado em loop não é exibido

0 respostas
T

Saudações

Estou com dificuldade em exibir um componente gui, que é uma classe que extende JDialog. Ela exibe mensagens e espera confirmação até um tempo parametrizado. O componente só não é exibido normalmente quando chamado dentro de um evento com loop:

Method[] methodsClass = getClassFrente().getClass().getMethods();

                                    for (int i = 0; i < methodsClass.length; i++) {

                                        if (isExecutable4Frente(methodsClass[i].getName())) {
                                            
                                            setPathSaveWithMethodName(methodsClass[i].getName());
                                            setMethodRunningName(methodsClass[i].getName());
                                            methodsClass[i].invoke(getClassFrente(), getArcSave());
                                            
                                            ConfirmWindowsTime.showMessageDialogTime(5, "O metódo "+getMethodRunningName()+ " foi executado");
               
                                        }
                                    }

A classe ConfirmWindowsTime funciona normalmente quando chamada fora do loop. Como não é desejável que o programa principal aguarde a confirmação para continuar o fluxo, ConfirmWindowsTime inicia uma nova thread.

Na classe ConfirmWindowsTime:

@SuppressWarnings({"SleepWhileHoldingLock", "CallToThreadDumpStack"})
    public static void showMessageDialogTime(final int time, final String message) {

        Thread t = new Thread(new Runnable() {

            public void run() {
                try {
                    setTimeClose(time);
                    final JFrame frame = new JFrame("Confirma execução.");

                    Container tela = frame.getContentPane();
                    tela.setVisible(true);
                    frame.setLayout(null);
                    frame.setSize(260, 125);
                    frame.setResizable(false);
                    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

                    JLabel lbMsg = new JLabel();
                    JLabel lbTime = new JLabel();
                    JButton btOk = new JButton("Ok");

                    lbMsg.setText(message);
                    lbMsg.setVisible(true);
                    lbMsg.setBounds(70, 10, 150, 20);
                    lbMsg.setFont(new Font("Courier", Font.TYPE1_FONT, 12));

                    btOk.setVisible(true);
                    btOk.setBounds(103, 55, 50, 20);
                    btOk.setVisible(true);

                    frame.add(btOk);
                    frame.add(lbMsg);
                    frame.isActive();
                    frame.setVisible(true);

                    btOk.addActionListener(new ActionListener() {

                        public void actionPerformed(ActionEvent eventClick) {

                            frame.setVisible(false);
                        }
                    });

                    long timeCurrent = 0;
                    while (timeCurrent <= getTimeClose() && frame.isVisible()) {

                        Thread.sleep(1000);
                        timeCurrent++;

                        lbTime.setText(timeCurrent + "");

                        lbTime.setVisible(true);
                        lbTime.setBounds(127, 30, 10, 20);
                        lbTime.setFont(new Font("Monospaced", Font.PLAIN, 15));

                        frame.add(lbTime);
                        frame.repaint();
                    }

                    frame.setVisible(false);

                } catch (InterruptedException eInterrupted) {

                    eInterrupted.printStackTrace();

                } catch (Throwable eThrowable) {

                    eThrowable.printStackTrace();
                }
            }
        });

        t.start();
    }

Alguma sugestão?

grato

Criado 4 de agosto de 2011
Respostas 0
Participantes 1