У меня есть эта функция, которая должна запускать окно уведомления

public void PushNotif(String notifTitile,String notifText,int notifType) 
{
        Random r = new Random();
        int max = NotificationType.values().length;
        final String Title = notifTitile==null?"no Title":notifTitile;
        final String Text = notifText==null?"no Text":notifText;
        final int Type = notifType==0?r.nextInt(max):notifType;

        new Thread(new Runnable() 
        {
            public void run() 
            {
                while (true) 
               {
                  try 
                  {
                      Thread.sleep(1000); 
                  }
                  catch (Exception e) 
                  { 
                      e.printStackTrace(); 
                  }
                  Display.getDefault().syncExec(new Runnable() 
                  {
                     public void run() 
                     {
                          //IT'S NEVER ENTER HERE!!!
                          NotifierDialog.notify(Title, Text, NotificationType.values()[Type]);
                          while (!NotifierDialog._shell.isDisposed()) 
                          {
                              if (!Display.getDefault().readAndDispatch()) Display.getDefault().sleep();
                          }
                          Display.getDefault().dispose();
                     }
                     });
               }
            }
         }).start();
 }

Моя проблема в том, что он никогда не входит в функцию run().

Он застрял на Display.getDefault().syncExec(new Runnable()... и все. Я знаю, что Display.syncExec должен подождать, пока он не заработает, но я не знаю, как его подготовить ...

Справка?

0
Ofir Hadad 14 Май 2013 в 14:54
1
Это SWT? Затмение RCP?
 – 
Joachim Sauer
14 Май 2013 в 14:56
Я использую Eclipse с SWT. как я могу узнать, какая у меня версия SWT? Я знаю это org.eclipse.swt.widgets.Display
 – 
Ofear
14 Май 2013 в 15:07
Какой run () вы имеете в виду?
 – 
m0skit0
14 Май 2013 в 15:17
Это: public void run() { //IT'S NEVER ENTER HERE!!! NotifierDialog.notify(Title, Text, NotificationType.values()[Type]); while (!NotifierDialog._shell.isDisposed()) { if (!Display.getDefault().readAndDispatch()) Display.getDefault().sleep(); } Display.getDefault().dispose(); }
 – 
Ofear
14 Май 2013 в 15:18
Чего ты хочешь добиться?
 – 
Michal Borek
14 Май 2013 в 15:20

1 ответ

Лучший ответ

Мне кажется, что вы добавляете Runnable не в тот поток отображения. Используйте поток current, а не default. Замени везде.

getCurrent ()

Возвращает отображение, для которого текущий выполняющийся поток является потоком пользовательского интерфейса, или null, если текущий выполняющийся поток не является потоком пользовательского интерфейса для любого дисплея.

Display.getCurrent().syncExec(new Runnable() {
});
1
flavian 14 Май 2013 в 15:22
2
GetCurrent () исправил проблему! БЛАГОДАРНОСТЬ!
 – 
Ofear
14 Май 2013 в 15:30