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

  • Автор темы zum
  • Дата начала
Z

zum

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

Код:
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() окно появляется и сразу сообщение "!"
тобишь запускает отдельным потоком
как отловить нажитие на кнопочку на диалоговом окне и вернуть результат выбора?
 
X

Xalet

А в каком месте должен быть возврат стринга? Если ран возвращает, то и используйте вместо колл сразу присваивание.
 
Z

zum

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

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

nvyush

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

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

//
public void windowClosing(WindowEvent e) {
dispose();
///тут вернуть)
result = что-то нужное
}
});

p.s. Подразумевается, что класс модального окна является внутренним классом для класса с методом getResult
На LS получать так:
Код:
Set Obj = jpgClass.CreateObject()
str = Obj.getResult()
 
K

K-Fire

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

zum

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

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

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

nvyush

nvy ну у меня почти так и сделанно токо вот лотус не ждет)
А окно модальное? Если делать так, как я описал выше, то если окно не модальное, функция getResult вернёт пустую строку, а окно останется висеть в параллельном потоке.
 
Z

zum

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

Код:
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; 
}

Код:
	Set Obj = jpgClass.CreateObject()
strP=Obj.run()
Messagebox strP,,"!"

Одно и тож что не так?
 
K

K-Fire

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

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

K-Fire

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

Больше ничего нету
 
Z

zum

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

K-Fire

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

nvyush

А если так:
Код:
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. дополнения отмечены комментарием //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
Z

zum

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

strP=Obj.run()

Ну можно считать что ждет)
 
N

nvyush

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

strP=Obj.run()

Ну можно считать что ждет)
Можно сказать, что лотус зависает при открытии любого модального окна :KillMe:. Причём все клиенты разом.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!