• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

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

Andre

Green Team
29.07.2004
114
1
BIT
1
Когда то давно рисовал диалог на "жабе" и устраивал обмен данными с lotus скриптом при помощи Ls2J.
Вариант который использовал для ожидания закрытия диалога -

в классе на java вводил переменную типа boolean значение по default false
на event windowClosing устанавливал значение этой переменной в true

в lotus script

вызов диалога на java

затем в цикле
while <значение переменной из java <> true>

читаем <значение переменной из java>

sleep 0.25

Wend

Из минусов насколько я помню - если переключиться на другое приложение, а затем обратно в Lotus - окошка с диалогом не видно, активируется оно по alt+tab
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
не помню опцию...
сделать окно апликейшн топмост (не модальное)
поток отслеживать по join (я уже упоминал это) - он как-раз и ждет завершения др. (порожденного) потока
 
N

nvyush

zum
Получилось или нет? Поделитесь, плз, у меня похожая задача.

Попробовал с join — Lotus виснет. С бесконечным циклом вроде бы работает, но Lotus при этом "съедает" 50% процессорного времени, что не есть гуд.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
join бывает с таймаутом!
 
N

nvyush

join бывает с таймаутом!
Для испытаний у меня окно с одной кнопкой. Если окно закрыть кнопкой, должна возвращаться строка "ОК", если крестом —пустая. Просто с join Lotus виснет. При join(5000) если не успеть нажать кнопку за 5 с, возвращается пустая строка, если успеть — возвращается "ОК", но не сразу после нажатия кнопки, а по завершении таймаута.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
значит поток сам не умирает
надо планировать его бийство (самоубийство) по кнопке
 
N

nvyush

Решить задачу с помощью join, wait, notify, synchronized не удалось. Для освобождения процессора в цикле помог sleep.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
а ежели на кнопке (событии) this.dispose()
типа
Код:
			public void run() {
final AccountDialog dialog = new AccountDialog(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent e) {
dialog.dispose();
//System.out.println(dialog.account.getName());
//System.exit(0);
}
});
dialog.setVisible(true);
}
 
N

nvyush

На эксперименты времени уже не остаётся. Сделал пока так:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Java-библиотека "TestDlg":</div></div><div class="sp-body"><div class="sp-content">
Код:
public class TestDlgextends javax.swing.JFrame {
private static String res;
private static int isReady;

public static String getResult() {
try {
isReady = 0;
new TestDlg().setVisible(true);
Thread mainThread = Thread.currentThread();
while(isReady == 0) {
mainThread.sleep(10);
}
return res;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}

private void jButtonOKActionPerformed(java.awt.event.ActionEvent evt) {										 
res = "OK";
isReady = 1;
dispose();
}										

private void formWindowClosed(java.awt.event.WindowEvent evt) {
if (isReady == 0) {
res = "Cancel";
isReady = -1;
}
}

public TestDlg() {initComponents();}
private void initComponents() { ...  }
}
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">LotusScript-агент:</div></div><div class="sp-body"><div class="sp-content">
Код:
Uselsx "*javacon"
Use "TestDlg"

Sub Initialize
Dim mySession As JavaSession
Dim myClass As JavaClass
Dim myMethod As JavaMethod
Set mySession = New JavaSession()
Set myClass = mySession.GetClass("TestDlg")
Set myMethod = myClass.GetMethod("getResult", "()Ljava/lang/String;")
Msgbox myMethod.Invoke()
End Sub
 
O

oshmianski

Доброго времени.

Подниму тему.

Кто-нить добился нормального отображения диалогового окна java в LN с ожиданием от него ответа?

Вариант nvy работает, но при перемещении диалогового окна НЕ происходит перерисовка background окна.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
с многотредовостью у Нотусни "бяда"...
а уж для LS2J и подавно
вариант "нормального" взаимодействия - для 8.х - композитные приложения
можно ещё внешнюю жвм, через RMI дергать, сложновато - но не будет ограничений нотусёвого UI
 
N

nvyush

при перемещении диалогового окна НЕ происходит перерисовка background окна.
У меня не перерисовывается только область первоначального размещения диалога. Т.е. если диалог переместить куда-либо, потом вернуть, то область временного нахождения диалога обновится.
Возможно, если сперва создать прозрачный фрейм на весь экран, а уже потом диалог, можно добиться полноценной прорисовки, но сам такого не пробовал.
 
O

oshmianski

перед show

AWTUtilities.setWindowOpacity(this, 0.97f);


Можно до 0.99f. Добавляет немного прозрачности, но это даже интересно ))).

Это для java 1.6.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
Возможно, если сперва создать прозрачный фрейм на весь экран
и забить на многомониторность... ;)
до к-то жвм м многоголовостью проблем, могут даже окошки не туды выводиться
если скажите - де нету у нас нескольких мониторов, возражу ;) - в любой фирме юзают проекторы
 
Мы в соцсетях:

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