Вопрос

(Java SE 6) Я пытаюсь создать всплывающее диалог, в котором отображается сообщение «Пожалуйста, подождите», в то время как моя программа выполняет некоторое время. Чтобы сделать это, я решил использовать бесконечный jdialog, чтобы программа продолжала работать и выполняет работу, пока JDiAlog виден (если вы используете модальную, программу остановится до тех пор, пока диалог не будет закрыт пользователем) Анкет

Проблема в том, что когда вы используете бесконечный диалог таким образом, появляется JDialog с заголовком, но содержимое этого не делает (я предполагаю, что они по какой -то причине не нарисуют). Я пытался позвонить в перераспределение и т. Д., Но, кажется, ничего не работает.

Теперь, согласно группе людей на междачи, это подлинная ошибка с качелями, и единственные ответы, которые я обнаружил, - это не делать что -то таким образом и найти какое -то другое средство уведомления пользователя о ожидании. Мне любопытно, если у кого-то здесь была эта проблема, и он выяснил обход.

Спасибо!

Это было полезно?

Решение

В качестве альтернативы рассмотрите возможность использования SwingWorker и показывая временный прогресс, как было предложено в этом пример.

Другие советы

Это не ошибка, вы должны запустить работу с тяжелым весом, а ваша работа по свету в Sepred Thread находится рядом с основной темой. Это необходимо из -за логических причин между диалоговым потоком GUI и отношением ActionListEneRevents к тяжелой работе Weigth на заднем плане. Если вы не разделяете, что ваш основной поток удерживает качели из -за некоторых событий уведомления. У меня была такая же проблема, я попытался отслеживать прогресс прогресса загрузки FTP, который я начал из JFrame, чтобы показать его в JDialog.

Сначала я попробовал:

//Activated by Upload Button
public void actionPerformed(ActionEvent e) {

    if("Upload".equals(e.getActionCommand())){

    // some Declarations

    new Thread(){

        public void run() {
            /*Run JDialog with the Upload - ProgressBar*/
            FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
        }
    }.start();

/*Run the heavy weigth Job - the Upload*/
ftpPersistence.uploadFile(localFile, remoteFile);

// ...
    }

//...

}

Но таким образом я даю jdialog frameborder и панель контента Balck, но ...

Следующая попытка:

//Activated by Upload Button
public void actionPerformed(ActionEvent e) {

    if("Upload".equals(e.getActionCommand())){

    // some Declarations

    new Thread(){

        public void run() {
        /*Run JDialog with the Upload - ProgressBar*/
        FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
    }
}.start();


new Thread(){

    public void run() 
            /*Run the heavy weigth Job - the Upload*/
            ftpPersistence.uploadFile(localFile, remoteFile);
        }
    }.start();
    // ... 
    }
//...
}

И, наконец, это сработало, надеюсь, это поможет;)

Я использую это, и это работает - исходный код (без исправления, который я нашел для перекраски во время его запуска) отсюда:http://inversionconsulting.blogspot.com/2008/03/java-jdialog-and-jprogressbar-example.html

Но я консолидировал его (с небольшими изменениями):

JProgressBar pb = new JProgressBar(0,100);

pb.setPreferredSize(new Dimension(275,30));
pb.setString("Running");
pb.setStringPainted(true);
pb.setValue(0);

JLabel label = new JLabel("Progress: ");
JPanel center_panel = new JPanel();

center_panel.add(label);
center_panel.add(pb);

JDialog dialog = new JDialog((JFrame)null, "Working ...");

dialog.getContentPane().add(center_panel, BorderLayout.CENTER);
dialog.pack();
dialog.setVisible(true);
dialog.setLocationRelativeTo(null); // center on screen

В моем коде позже, когда он проходит через мой цикл (от 1 до 10, используя переменную «tot»), я переказываю диалог, обновляя панель прогресса, когда программа проходит через цикл, таким образом, (это не дано на Ссылка выше страницы) (я не использую несколько потоков, все это в основном потоке):

//set progress bar
pb.setValue(tot*10);
//repaint it
dialog.getContentPane().paintAll(pb.getGraphics());

Потребовалось много времени, проб и ошибок, чтобы найти это решение. Надеюсь, это сработает для вас, как и для меня.

Ты пытался Validate () (Это необходимо после добавления компонентов в контейнер)? Также рассмотрите возможность размещения исходного кода, чтобы мы могли проверить его. Удачи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top