2013-06-13 1 views
1

У меня есть метод, который импортирует набор данных в базу данных, я хочу иметь индикатор выполнения, чтобы информировать пользователя о том, что импорт происходит после нажатия кнопки. Я закодировал индикатор выполнения, который работает для жесткого кодирования, но я, очевидно, хочу, чтобы это было динамическим в зависимости от продолжительности импорта. Я пробовал много разных вещей без успеха, поэтому надеюсь, что там есть какая-то помощь! :) Спасибо! Edit: это слушатель действия для кнопки импорта ->Swing JProgressBar для времени, проведенного в методе

 btnImportADataset.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent ae) { 
       progressBar(10); 
       SystemAdminHome.testMethod();`enter code here` 
       ExcelReadInReadOut.writeToDB(); 
      } 
     }); 

Ниже метод вызывается в слушателе действия ->

private final static int interval = 1000; 
    private static int i; 
    private static JLabel label; 
    private static JProgressBar progBar; 
    private static Timer timer; 

    public static void progressBar(final long duration) { 
     JFrame frame = new JFrame("Progress Bar"); 
     ProgressBar progBarInstance = new ProgressBar(); 

     progBar = new JProgressBar(0, (int) duration); 
     progBar.setValue(0); 
     progBar.setStringPainted(true); 

     label = new JLabel("Import a dataset"); 

     JPanel panel = new JPanel(); 
     //panel.add(btnStart); 
     panel.add(progBar); 

     JPanel panel1 = new JPanel(); 
     panel1.setLayout(new BorderLayout()); 
     panel1.add(panel, BorderLayout.NORTH); 
     panel1.add(label, BorderLayout.CENTER); 
     panel1.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
     frame.setContentPane(panel1); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Create a timer. 
     timer = new Timer(interval, new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       if (i == duration) { 
        timer.stop(); 
        btnImportADataset.setEnabled(true); 
        progBar.setValue(0); 
        String str = "<html>" + "<font color=\"#FF0000\">" + "<b>" 
          + "Import completed." + "</b>" + "</font>" 
          + "</html>"; 
        label.setText(str); 
       } 
       i = i + 1; 
       progBar.setValue(i); 
      } 
     }); 


    } 

    public static void testMethod() { 
     btnImportADataset.setEnabled(false); 
     i = 0; 
     String str = "<html>" + "<font color=\"#008000\">" + "<b>" 
       + "Import is in process......." + "</b>" + "</font>" 
       + "</html>";label.setText(str);timer.start(); 
    } 
+2

Вы могли бы показать, что искали? Я думаю, что вы должны использовать 'SwingWorker' и' PropertyChangeListener' на лету. – nachokk

+0

Вы можете установить индикатор выполнения в режим неопределенности и не беспокоиться о том, сколько времени потребуется. См.: Http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html#indeterminate – Eric

ответ

-1

Вы можете попробовать somethig подобное (не тестировалось):

JProgressBar jp = new JProgressBar(); 
jp.setMinimum(System.currentTimeMillis()); 

while(import) { 
    jp.setValue(System.currentTimeMillis()); 
} 
+3

Вы можете обновить gui в EventDispatchThread и выполнить работу в другом потоке, иначе ваш графический интерфейс зависает. – keuleJ

3

См метод а SwingWorker в doInBackground делать тяжелую нагрузку и использовать метод публикации для публикации прогресса https://stackoverflow.com/a/10774277/66207 использования.

[Изменить], связанный с правильным ответом вместо вопроса.