2016-09-30 8 views
-3

Я не понимаю, почему индикатор не двигается в следующем коде:Неопределенный JProgressBar Всплывающие/модальный диалог не передвигающиеся

JDialog dlgProgress = new JDialog(InterfaceYadis.frameInterface, "Veuillez patienter...", true); 
JLabel lblStatus = new JLabel("Test"); 

JProgressBar pbProgress = new JProgressBar(0, 100); 
pbProgress.setIndeterminate(true); 

dlgProgress.add(BorderLayout.NORTH, lblStatus); 
dlgProgress.add(BorderLayout.CENTER, pbProgress); 
dlgProgress.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
//dlgProgress.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
dlgProgress.setSize(300, 90); 
dlgProgress.setLocationRelativeTo(null); 


SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() { 
    @Override 
    protected Void doInBackground() throws Exception { 
     Thread.sleep(2500); 
     return null; 
    } 

    @Override 
    protected void done() { 
     dlgProgress.dispose(); 
    } 
}; 

sw.execute(); 
dlgProgress.setVisible(true); 

JDialog должен быть выполнен на UI потоке и индикатор выполнения должен перейти от слева направо ? Спасибо.

EDIT:

Проблема не в коде, прежде, я создал пользовательский JProgressBar и я модифицировал по умолчанию перекрашивать интервал и время цикла ... Пользовательского Jprogress садилось:

UIManager.put("ProgressBar.repaintInterval", new Integer(50)); 
UIManager.put("ProgressBar.cycleTime", new Integer(100)); 

Значение по умолчанию:

INTERVAL = UIManager.getInt("ProgressBar.repaintInterval"); // = 50 
CYCLETIME = UIManager.getInt("ProgressBar.cycleTime"); // = 3000 

Для меня, у меня есть два решения:

1/Я определил цикл и интервал каждый раз, чтобы быть уверенным, чтобы иметь правильные значения

2/Я использую тот же везде Progressbar

Я думаю, что решение 2 является лучшим, но я как знать, может ли решение быть хорошим решением.

+0

JProgressBar установлен быть неопределенным - то, что вы думаете, что это делает? Сначала ознакомьтесь с руководством и API. –

+1

'JDialog должен быть выполнен на потоке пользовательского интерфейса', а затем опубликовать соответствующий [SSCCE] (http://sscce.org/), который показывает, как вы это делаете. 'и индикатор выполнения должен перемещаться слева направо? - код работает отлично для меня, используя JDK8 в Windows 7. – camickr

+0

Обычно JProgressBar не должен быть статическим. Я хочу, чтобы пациент был пользователем операции (неопределенное время) –

ответ

1
  1. Вы установили, что JProgressBar является неопределенным, поэтому вы не должны ожидать изменения слева направо. Скорее, в учебнике и API, панель будет перемещаться назад и вперед.
  2. И даже если вы этого не сделаете, вы никогда не устанавливаете его значение, поэтому оно никогда не изменится.

Если вы хотите неуклонный слева направо движение с прогрессом:

  1. Не устанавливайте индикатор быть неопределенными. Оставьте это
  2. Задайте его значение по мере продвижения вашего работника. Это часто делается с использованием свойства PropertyChangeListener, добавленного к рабочему, а затем внутри рабочего, устанавливающего свойство progress, и внутри слушателя, слушая его.

Для примера как:

import java.awt.BorderLayout; 
import java.awt.Dialog.ModalityType; 
import java.awt.Dimension; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class ProgressBarEg extends JPanel { 
    public ProgressBarEg() { 
     add(new JButton(new ShowDialogAction("Show Indeterminant Dialog", KeyEvent.VK_I, true))); 
     add(new JButton(new ShowDialogAction("Show Determinant Dialog", KeyEvent.VK_D, false))); 
     setPreferredSize(new Dimension(500, 350)); 
    } 

    private class MyWorker extends SwingWorker<Void, Void> { 

     private static final int DELTA_PROGRESS = 1; 
     private static final long SLEEP_TIME = 40; 

     @Override 
     protected Void doInBackground() throws Exception { 
      int progress = getProgress(); 
      while (progress < 100) { 
       progress += DELTA_PROGRESS; 
       progress = Math.min(progress, 100); 
       setProgress(progress); 
       Thread.sleep(SLEEP_TIME); 
      } 
      return null; 
     } 
    } 

    private class ShowDialogAction extends AbstractAction { 
     JDialog dlgProgress; 
     private boolean indeterminant; 
     JProgressBar pbProgress = new JProgressBar(0, 100); 

     public ShowDialogAction(String name, int mnemonic, boolean indeterminant) { 
      super(name); 
      putValue(MNEMONIC_KEY, mnemonic); 
      this.indeterminant = indeterminant; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (dlgProgress == null) { 
       Window window = SwingUtilities.getWindowAncestor(ProgressBarEg.this); 
       dlgProgress = new JDialog(window, "Veuillez patienter...", ModalityType.APPLICATION_MODAL); 
       JLabel lblStatus = new JLabel("Test"); 

       if (indeterminant) { 
        pbProgress.setIndeterminate(true); 
       } else { 
        pbProgress.setStringPainted(true); 
       } 

       dlgProgress.add(BorderLayout.NORTH, lblStatus); 
       dlgProgress.add(BorderLayout.CENTER, pbProgress); 
       dlgProgress.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
       //dlgProgress.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
       dlgProgress.setPreferredSize(new Dimension(300, 90)); 
       dlgProgress.setLocationRelativeTo(null); 
       dlgProgress.pack(); 
      } 

      SwingWorker<Void, Void> sw = new MyWorker(); 
      sw.addPropertyChangeListener(new PropertyChangeListener() { 

       @Override 
       public void propertyChange(PropertyChangeEvent evt) { 
        if (evt.getPropertyName().equalsIgnoreCase("progress")) { 
         pbProgress.setValue((Integer) evt.getNewValue()); 
        } else if (evt.getNewValue() == SwingWorker.StateValue.DONE) { 
         dlgProgress.dispose(); 
        } 
       } 
      }); 

      sw.execute(); 
      dlgProgress.setVisible(true); 

     } 
    } 

    private static void createAndShowGui() { 
     ProgressBarEg mainPanel = new ProgressBarEg(); 

     JFrame frame = new JFrame("ProgressBarEg"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
+0

Точка неопределенности заключается в том, что вы не знаете, как долго будет выполняться задача, так как панель просто идет назад и вперед, пока индикатор выполнения не будет закрыт. – camickr

+0

@camickr: Я знаю это, конечно. Но он, кажется, полагает, что это означает, что бар будет двигаться постепенно слева направо. –

+0

Спасибо за ответ. Я не обязательно хочу, чтобы панель перемещалась слева направо, просто нужно, чтобы панель двигалась. JprogressBar должен заставить пользователя ждать, если панель не перемещается, пользователь считает, что программное обеспечение больше не работает ... –