Ls2j ответ от диалогового окна

Тема в разделе "Lotus + Java + LS2J", создана пользователем zum, 12 янв 2010.

  1. zum

    zum Гость

    Из Лостус скрипта вызывается диалоговое окно на java
    и из него надо получить какую строчку выбрал пользователь
    почему java? потому что используется jtree дерево.
    Вот только проблема в следущем:

    Код (Text):
    Sub Initialize
    Dim s As New NotesSession
    Dim Java As JavaClass
    Dim strP As String, attr As Integer, FileNume As Integer

    Dim HomeObj As JavaObject

    Dim jSession As New JavaSession
    Set jpgClass = jSession.GetClass("Tree")
    Set Obj = jpgClass.CreateObject()
    Call Obj.run()

    Messagebox "!",,"!"
    End Sub
    после вызова Call Obj.run() окно появляется и сразу сообщение "!"
    тобишь запускает отдельным потоком
    как отловить нажитие на кнопочку на диалоговом окне и вернуть результат выбора?
     
  2. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    А в каком месте должен быть возврат стринга? Если ран возвращает, то и используйте вместо колл сразу присваивание.
     
  3. zum

    zum Гость

    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    dispose();
    ///тут вернуть)
    }
    });

    както так...
    токо как так чтото я не соображу. те надо отловить закрытия окна
     
  4. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    zum
    Может в джаве сделать статичную функцию, возвращающую стринг, которая создаёт модальное окно, возвращающее нужное значение в "глобальной переменной"? Типа так:

    Код (Text):
    String result;
    public static String getResult() {
    //создаём диалоговое окно
    //...
    return result;
    }

    //
    public void windowClosing(WindowEvent e) {
    dispose();
    ///тут вернуть)
    result = что-то нужное
    }
    });
    p.s. Подразумевается, что класс модального окна является внутренним классом для класса с методом getResult
    На LS получать так:
    Код (Text):
    Set Obj = jpgClass.CreateObject()
    str = Obj.getResult()
     
  5. K-Fire

    K-Fire Гость

    Вообще лотус-скрипт должен ждать завершения ява-кода. Значит отдельным потоком запускается что-то внутри явы.
    Там в ява-коде (в классе Tree, это же кастомный класс?) надо добавить цикл в котором ждать пока AWT/Swing тред не завершится.
     
  6. zum

    zum Гость

    Ага именно это и надо)
    А примерчик моно?

    nvy ну у меня почти так и сделанно токо вот лотус не ждет)
     
  7. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    А окно модальное? Если делать так, как я описал выше, то если окно не модальное, функция getResult вернёт пустую строку, а окно останется висеть в параллельном потоке.
     
  8. zum

    zum Гость

    попробовал модальное эфект тотже

    Код (Text):
    public class TreeSample extends JDialog
    {
    String result="";
    DefaultMutableTreeNode level0 = new DefaultMutableTreeNode("Корень дерева");
    JTree jt = new JTree(level0);
    public TreeSample()
    {
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    try{
    result=jt.getLastSelectedPathComponent().toString();
    }
    catch (Exception ex) {}  
    dispose();                                     
    }
    });
    init();
    }
    public String run()
    {
    System.out.println("Starting TreeApplic...");
    TreeSample mainFrame = new TreeSample();
    mainFrame.setSize(400, 300);
    mainFrame.setVisible(true);
    this.setModal(true);
    return result;
    }
    Код (Text):
        Set Obj = jpgClass.CreateObject()
    strP=Obj.run()
    Messagebox strP,,"!"
    Одно и тож что не так?
     
  9. K-Fire

    K-Fire Гость

    Примерчика у меня нет. Код класса Tree скиньте сюда, может что посоветуем.
     
  10. zum

    zum Гость

    выше класс
     
  11. K-Fire

    K-Fire Гость

    В JDialog проблема. Надо его делать модальным. Но setModal(true) если я правильно помню не работает как надо.
    Дело в том что должен замораживаться owner диалога (JFrame из которого диалог вызывается). А кто будет owner в Notes, да еще через LS2J, фиг его знает. Явно не главный процесс Notes.

    В общем стоит во-первых изменить вызов конструктора на JDialog(Dialog owner, String title, boolean modal), и затем поиграться с нахождением owner-a самого верхнего уровня. Приду завтра на работу, посмотрю у себя в коде, где-то был похожий кусок.
     
  12. zum

    zum Гость

    Уже завтра? :KillMe:
     
  13. K-Fire

    K-Fire Гость

    Максимум что нашел, это :
    dialog = new JDialog(JOptionPane.getFrameForComponent(this)); , где this у меня JApplet.

    Больше ничего нету
     
  14. zum

    zum Гость

    даже если делать через фрейм то замараживается собсвено фрейм
    а сам главный процесс Notes идет дальше... запущает и забывает
    надо остановить как то именно его... =\
     
  15. K-Fire

    K-Fire Гость

    Значит все таки в яве пускать бесконечный цикл в основном треде. Условие выхода из него можно уже сделать как-то в зависимости от завершения диалога.
     
  16. zum

    zum Гость

    так и не получилось =\
     
  17. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    А если так:
    Код (Text):
    public class TreeSample extends JDialog
    {
    String result="";
    int toExit = 0; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    DefaultMutableTreeNode level0 = new DefaultMutableTreeNode("Корень дерева");
    JTree jt = new JTree(level0);
    public TreeSample()
    {
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    try{
    result=jt.getLastSelectedPathComponent().toString();
    toExit = 1; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    }
    catch (Exception ex) {}  
    dispose();                                     
    }
    });
    init();
    }
    public String run()
    {
    System.out.println("Starting TreeApplic...");
    TreeSample mainFrame = new TreeSample();
    mainFrame.setSize(400, 300);
    mainFrame.setVisible(true);
    this.setModal(true);
    while(toExit == 0){;}//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    return result;
    }
    p.s. дополнения отмечены комментарием //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
  18. zum

    zum Гость

    уже лучше =)
    так ждет
    я бы сказал так лотус зависает на строчке

    strP=Obj.run()

    Ну можно считать что ждет)
     
  19. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Можно сказать, что лотус зависает при открытии любого модального окна :KillMe:. Причём все клиенты разом.
     
  20. zum

    zum Гость

    :KillMe: есть у кого-нить еще идеи?
     
Загрузка...

Поделиться этой страницей