Как дождаться завершения атрибуции в startup (), прежде чем продолжить? - PullRequest
0 голосов
/ 29 января 2012

Я делаю настольное приложение, которое просматривает папку, используя watchservice из java.nio.file. Но мне нужно загрузить графический интерфейс перед тем, как я начну смотреть, потому что путь, который нужно просмотреть, находится в JFieldText в пользовательском интерфейсе.

public class FileArchiverApp extends SingleFrameApplication {

   static FileArchiverView gui;

@Override protected void startup() {
   gui = new FileArchiverView(this); //HERE0 I have to wait for this.
   show(gui);     
...
public static void main(String[] args) throws IOException {
   launch(FileArchiverApp.class, args);
....
   WatchService watcher = FileSystems.getDefault().newWatchService();
     // HERE1 while(gui==null) System.out.println("hi") ;
    try {
          Path dir = Paths.get(gui.getOriginPath()); // HERE2 I get nullpointer if gui was not ready
          WatchKey key = dir.register(watcher, ENTRY_CREATE );
    } catch ( Exception x) {
            System.err.println(x);
    }

    while(true){ /*wait for new file event loop*/ } 
}

Функция getOriginPath () возвращает getText () из текстового поля, которое я упомянул.

В HERE0 указана авторство. Я получаю нулевой указатель в ЗДЕСЬ2, если графический интерфейс не был готов. Я пробовал вещи. Если я помещу эту вещь в ЗДЕСЬ1, она будет работать, но, конечно, я не хочу этого делать.

Как я мог это сделать?

И это занимает много времени (например, две секунды) или графический интерфейс перестает быть нулевым с этим ЗДЕСЬ1. Я не знаю, происходит ли это из-за печати, но я ожидал, что это будет почти мгновенно. Это нормально?

Спасибо.

1 Ответ

3 голосов
/ 29 января 2012

Учитывая ограниченную информацию, я должен сделать некоторые предположения.Предположение 1 состоит в том, что вы задаете JTextField значение по умолчанию и используете его в качестве пути к файлу, который хотите просмотреть.Предположение 2 состоит в том, что вы не закодировали взгляд на MVC-подобный дизайн.

Если оба верны, то звучит так, как будто вас хвост виляет собакой - вид, содержащий критические данные, а немодель.Почему бы не решить вашу проблему, перейдя к MVC и не получая критические данные из представления, а скорее из модели.Сначала запустите модель, включая получение пути по умолчанию из свойств вашей программы, включите прослушиватель, запустите представление, а затем, если представление просит контроллер изменить просматриваемый файл, попросите контроллер изменить модель.И тогда слушатели в модели уведомят ваших наблюдателей об изменениях.

...