Progressbar для SWT-GUI

 
 
 
Сообщения:3
Здравствуйте,
нужна помощь по теме SWT, Threads.
Я хочу перед стартом GUI выполнить особые конфигурации. Их я выполняю в Progressbar:
package main_gui.gui;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
import main.StartThread;



public class StartProgram {

    private static Display display;
    protected Shell shell;



    public static void main(String args[]) {
        display = Display.getDefault();

        Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
            public void run() {
                try {
                    StartProgram window = new StartProgram();
                    window.open();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    protected void createContents() {
        shell = new Shell(display, SWT.TITLE | SWT.PRIMARY_MODAL);
        shell.setSize(491, 197);
        Label status = new Label(shell, SWT.NULL);
        status.setAlignment(SWT.CENTER);
        status.setBounds(38, 77, 399, 71);
        /** take the primary monitor */
        Monitor primary = display.getPrimaryMonitor();
        /** get the size of the screen */
        Rectangle bounds = primary.getBounds();
        /** get the size of the window */
        Rectangle rect = shell.getBounds();
        /** calculate the centre */
        int x = bounds.x + (bounds.width - rect.width) / 2;
        int y = bounds.y + (bounds.height - rect.height) / 2;
        /** set the new location */
        shell.setLocation(x, y);

        ProgressBar progressBar = new ProgressBar(shell, SWT.NONE);
        progressBar.setMaximum(0);
        progressBar.setBounds(38, 49, 399, 17);

        new StartThread(shell, display, progressBar, status).start();
    }


    public void open() {
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
}


Thread, для выполнения конфигурации для Progressbar:
package main;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
import main_gui.gui.MainGui;
import processlistener.ProcessListener.Processes;

public class StartThread extends Thread {
 private Shell shell;
 private Display display;
 private ProgressBar progressBar;
 private Label labelInfo;
 
 public StartThread(Shell shell, Display display, ProgressBar progressBar,
   Label labelInfo) {
  this.shell = shell;
  this.display = display;
  this.progressBar = progressBar;
  this.labelInfo = labelInfo;
 }

    @Override
    public void run() {
        if (display.isDisposed()) {
            return;
        }
        try {
        System.out.println("Konfiguration");
          Thread.sleep(500);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
 /**
  *
  * @param statusText
  */
 private void setFehler(String fehler) {
  display.asyncExec(new Runnable() {
   @Override
   public void run() {
    labelInfo.setText(fehler);
   }
  });
 }
 /**
  *
  */
 private void closeProgressGUI() {
  display.asyncExec(new Runnable() {
   @Override
   public void run() {
    shell.close();
   }
  });
 }
 /**
  *
  */
 private void startMainGUI() {
  display.asyncExec(new Runnable() {
   @Override
   public void run() {
    MainGui main = new MainGui();
    main.open();
//    shell.dispose();
   }
  });
 }
}

Моя проблема заключается в том что я не знаю как определить что Thread готов, закрыть progressbar и открыть мою последующую маску. Очень прошу помощи, я не сильна по теме Threads и все мои попытки приводят к Exceptions.

Прошу хотя бы какие то советы.Спасибо
 
 
Сообщения:1046
по теории это работает в 3 фазы:
1: создать диалог с ProgressBar.
2: произвести обработку, параллельно обновляя значение ProgressBar.
3: запустить основной ГУИ.

проще всего выделить каждую фазу в отдельную методу и запускать по очереди из main. (первые две методы должны быть блокирующими т.е выход из методы означает, что она отработала на 100%)

фазы 1 и 3 тут никаких проблем. фаза 2 немного сложнее:
проблема 1: получить доступ к ProgressBar - довольно просто - первая метода возвращает его, а вторая получает как параметр.
проблема 2: распараллелить, собрать и отчитаться.
если распараллелить можно, то передаём ProgressBar в конструктор Runnable и в конце методы run пишем:
        synchronized (bar)
        {
            bar.setValue(bar.getValue() + weight);
            bar.repaint();
        }

а в методе, где эти потоки запускаются, вызываешь методу join() на каждом из них.

а если не параллелится, то тут надо посмотреть или использовать ProgressBar без прогресса.
 
 
Сообщения:3
Здравствуйте,
у меня проблема из main вызвать поочередно класс StartProgram с Progressbar, а потом мою основную GUI. По отдельности все работает, а как их скомпоновать я не знаю...так как StartProgram с Thread-ом.

package main;
import main_gui.gui.MainGui;
import main_gui.gui.StartProgram;

public class Start {
    /**
    * Main-Methode
    *
    * @param args
    */
    public static void main(String[] args) {

            StartProgram progressGUI= new StartProgram();
            progressGUI.open();           
   
            MainGui test = new MainGui();
            test.open();
           
    }

}



Я бы была признательна за помощь.
 
 
Сообщения:1046
public static void main(String[] args)
{

    ProgressBar bar = new ProgressBar();         // создаёшь ProgressBar

    Dialog dialog = createAndShowDialog(bar); // создаёшь и настраиваешь диалог с ProgressBar.

    // здесь прогресс равен нулю

    loadResources(bar);                                  // загружаешь ресурсы и обновляешь прогресс.

    // здесь прогресс равен 100%

    dialog.dispose();                                       // диалог нам больше не нужен и поэтому мы его выкидываем.

    MainGui mg = new MainGui();                   // теперь можно создать основное окно
    mg.open();

}
 
 
Сообщения:3
Спасибо за совет,все получилось
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет