2013-06-26 3 views
-1

По какой-то странной причине мне нужно открыть диалог swt из сервлета. Возможно ли это? В настоящее время у меня есть это, но получение «Недопустимая ошибка доступа к потоку». Пока я это делаю.Запуск SWT-виджета от HttpServlet

 Thread th=new Thread(new Runnable(){ 

     @Override 
     public void run() { 
      Shell shell = new Shell(); 
      FileDialog dialog=new FileDialog(shell); 
      dialog.setText("Enter a filename"); 
      dialog.setFilterPath("c:\\"); 
      String selected=dialog.open(); 
      log.error(selected); 
      shell.dispose(); 

     } 

    }); 
    th.start(); 

Любые идеи?

+0

У меня есть особый случай использования, я просто хочу знать, если это технически возможно. – specialscope

+0

Не могли бы вы объяснить свой случай использования? – Baz

+0

Извините, я не могу обсуждать свой вариант использования здесь. Я просто хочу знать, возможно ли технически создать виджет swt из сервлета в локальной среде. – specialscope

ответ

2

Я не хочу знать странные причины, в то же время я не могу предупредить вас о проблемах вы можете столкнуться при открытии SWT окна в Servlet, но проблема в том, вы обращаетесь к SWT виджетам a Native Thread, который не будет работать.

Вы можете получить доступ к SWT только на UI Thread.

Также вы не блокируете UI Thread.

PFB код, который решает ваши проблемы

Thread th = new Thread(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      Display.getDefault().syncExec(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        Display display = Display.getDefault(); 
        Shell shell = new Shell(display); 
        FileDialog dialog=new FileDialog(shell); 
        dialog.setText("Enter a filename"); 
        dialog.setFilterPath("c:\\"); 
        String selected=dialog.open(); 
        log.error(selected); 
        while (!shell.isDisposed()) 
        { 
         if (!display.readAndDispatch()) 
          display.sleep(); 
        } 

       } 

      }); 
     } 
    }); 

    th.start(); 
+0

Спасибо, я думаю, это может сработать. Я забыл создать новый показ. – specialscope

+0

Это Работало спасибо! – specialscope