Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
Нужна помощь!
В sub-window есть кнопка развернуть во весь экран и свернуть обратно, мне нужно перехватить её, чтобы окно разворачивалось с теми размерами и тем положением, которые я им задам...
Использовал addWindowModeChangeListener, но он сначала выполнил мой код, а затем развернул окно во весь экран
можно как-нибудь решить эту проблему? vaadin изучаю недавно
Упомянутая кнопка изменяет shared state для окна, точнее его аттрибут "windowMode".
Так, что когда Вы выполняете свой код в обработчике значение этого аттрибута всё равно меняется и выполняетя код, который реагирует на изменение этого аттрибута.
Так, что Вам нужно не обработчик добавлять, а отнаследоваться от класса Window и переопределить метод setWindowMode. Причём, не вызывая super метода.
Denis Anisimov: Упомянутая кнопка изменяет shared state для окна, точнее его аттрибут "windowMode".
Так, что когда Вы выполняете свой код в обработчике значение этого аттрибута всё равно меняется и выполняетя код, который реагирует на изменение этого аттрибута.
Так, что Вам нужно не обработчик добавлять, а отнаследоваться от класса Window и переопределить метод setWindowMode. Причём, не вызывая super метода.
Выполнил, как вы объяснили, вот код переопределения
public class MyWindow extends Window{
public MyWindow( String name ){
super( name );
} // constructor MyWindow
public void setWindowMode( WindowMode windowMode ) {
System.out.println( "--> MyWindow.setWindowMode" );
} // setWindowMode
} // MyWindow class
Окно всё равно продолжает разворачиваться во весь экран
Надо ли что-нибудь писать в переопределенном методе?
Ax ты ж....
Да, виноват.
setWindowMode
вызывается для уведомления серверного класса постфактум. То есть сначала клиентская часть меняет размер окна, а потом уже посылает уведомление на сервер что режим изменился. А серверный класс только листенеры и оповещает в итоге через этот метод.
Да, так не получится. Придётся менять клинетский код.
Нужно сделать свою компоненту: отнаследоваться от класса Window, создать свой коннектор, наследованный от WindowConnector (коннетор долженю быть привязан к подклассу Window через @Connect).
В коннекторе есть метод
updateWindowMode
который нужно переопределить. Сделать ему пустую реализацию.
Этот метод и распахивает окно.
Тогда серверная часть всё равно будет уведомляться о смене режима, но распахивания не будет.
Потом нужно будет пересобрать проект с перекомпиляцией виджетов. Тогда заработает.
Denis Anisimov: Ax ты ж....
Да, виноват.setWindowMode
вызывается для уведомления серверного класса постфактум. То есть сначала клиентская часть меняет размер окна, а потом уже посылает уведомление на сервер что режим изменился. А серверный класс только листенеры и оповещает в итоге через этот метод.
Да, так не получится. Придётся менять клинетский код.
Нужно сделать свою компоненту: отнаследоваться от класса Window, создать свой коннектор, наследованный от WindowConnector (коннетор долженю быть привязан к подклассу Window через @Connect).
В коннекторе есть методupdateWindowMode
который нужно переопределить. Сделать ему пустую реализацию.
Этот метод и распахивает окно.
Тогда серверная часть всё равно будет уведомляться о смене режима, но распахивания не будет.Потом нужно будет пересобрать проект с перекомпиляцией виджетов. Тогда заработает.
Сделали, как Вы написали, вот код ....
////////////////////////////////////////////////////////////////////////////////////////////Коннектор
import com.vaadin.client.ui.window.WindowConnector;
import com.vaadin.shared.ui.Connect;
@Connect(value = com.example.myproject.MyWindow.class)
public class MyWindowConnector extends WindowConnector {
protected void updateWindowMode(){
System.out.println( "--> MyWindowConnector.updateWindowMode()" );
} // updateWindowMode
} // WindowConnector
////////////////////////////////////////////////////////////////////////////////////////////Компонент
import com.vaadin.shared.ui.window.WindowMode;
import com.vaadin.ui.Window;
public class MyWindow extends Window{
public MyWindow( String name ){
super( name );
} // constructor MyWindow
public void setWindowMode( WindowMode windowMode ) {
System.out.println( "--> MyWindow.setWindowMode" );
} // setWindowMode
} // MyWindow class
/////////////////////////////////////////////////////////////////////////////Вывод в консоль
авг 27, 2014 5:36:37 PM com.vaadin.server.VaadinServlet serveStaticResourcesInVAADIN
INFO: Requested resource [/VAADIN/themes/myproject/favicon.ico] not found from filesystem or through class loader. Add widgetset and/or theme JAR to your classpath or add files to WebContent/VAADIN folder.
--> MyWindow.setWindowMode
--> MyWindow.setWindowMode
Окна разворачиваются и мы не смогли попасть в метод updateWindowMode, может что-то не так сделали?
В коннекторе System.out.println бесполезен потому что он компилируется в JS, а там этот код ничего не выведет.
Вы компилировали виджет ?
Я не стал подробно расписывать компиляцию. Для того чтобы свой виджетсет заработал нужно сделать кучу вещей помимо создания коннектора и связывания его с серверным классом.
Вы всё это сделали ?
Вот прочтите здесь:
http://wiki.netbeans.org/VaadinPlugin_ru#.D0.9D.D0.B0.D0.B8.D0.B1.D0.BE.D0.BB.D0.B5.D0.B5_.D1.80.D0.B0.D1.81.D0.BF.D0.BE.D1.81.D1.82.D1.80.D0.B0.D0.BD.D1.91.D0.BD.D0.BD.D1.8B.D0.B5_.D0.BE.D1.88.D0.B8.D0.B1.D0.BA.D0.B8
Это хоть и про плагин для NetBeans, но там описано всё что можно собрать по пути создания кустарных компонент. Наверняка что-нибудь оттуда подойдёт и Вам.