Hi Daniel

ULC Release 6.1.1 aligned the ULCWindow.setVisible() and ULCWindow.dispose()
with Swing. So let me first explain this in the Swing world.

When calling java.awt.Window.setVisible(false) on a window with child
windows/dialogs that are also currently visible, a subsequent
java.awt.Window.setVisible(true) will also bring up the child windows again. So,
if the child window should not be brought up automatically later, a Swing
application should first hide the child window and then the parent window.

Basically the same is true for ULC applications. There is one complication to
this however. A ULCDialog.setVisible(true) is handled inside a
SwingUtilities.invokeLater() on the client side. This is needed because Swing
starts a new event loop for modal dialogs on a call to
ULCDialog.setVisible(true). This usage of SwingUtilities.invokeLater()
potentially switches the order of calls to setVisible() for a frame and a
dialog. I added the issue http://www.canoo.com/jira/browse/UBA-7130 to our JIRA
issue tracking system.

So, your code should first close the alert and then the frame:

  alert.addWindowListener(new IWindowListener() {
      public void windowClosing(WindowEvent event) {
          alert.dispose();

          if (alert.getValue().equals("Ok")) {
              // e.g. saving data ...
              hidePopUp();
          }
      }
  });

To make sure that the call to setVisible(false) on your frame comes after the
corresponding call to setVisible(false) on your alert, you can use the following
workaround. This should fix the problem.

  private void hidePopUp() {
      ULCPollingTimer pollingTimer = new ULCPollingTimer(0, new
IActionListener() {
          public void actionPerformed(ActionEvent event) {
              popUpFrame.setVisible(false);
          }
      });
      pollingTimer.setRepeats(false);
      pollingTimer.start();
  }

I hope this helps.

Cheers
Rolf

**************************************
Rolf Pfenninger
Canoo Engineering AG
Kirschgartenstrasse 7
CH-4051 Basel
Tel +41 61 228 9444
Fax +41 61 228 9449
mailto:[EMAIL PROTECTED]
http://www.canoo.com

ULC - Rich Clients for J2EE
http://www.canoo.com/ulc
**************************************



> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] Behalf Of
> [EMAIL PROTECTED]
> Sent: Donnerstag, 14. Dezember 2006 11:49
> To: [email protected]
> Cc: [EMAIL PROTECTED]; [EMAIL PROTECTED]
> Subject: [ULC-developer] Problem closing frames from within a modal
> dialog in version 6.1.1
>
>
>
>
> Hello!
>
> We just discovered a strange behaviour containing modal dialogs called from
> an frame which differs between ULC version 6.0.4 and 6.1.1.
>
> The following describes the starting situation: We have a frame which
> listens to window action within a windowlistener. When trying to close the
> frame, the listener fires up a dialog which mimics an ULCAlert showing some
> confirm message (e.g. "Save changes?").
> After clicking to confirm, the dialog has to close the parent window. If I
> am not wrong, normally the dialog will disappear with the parent. Now, when
> we fire up the frame again for ULC 6.1.1, without restarting the
> application, the dialog is still shown. After confirming it again and
> starting the frame for the third time it is finally invisible. In ULC
> version 6.0.4 that behaviour doesn´t come up. The dialog will be correctly
> closed and doesn´t come up after restarting the frame.
>
> I have attached a simple snipped. If you run this code as described above
> under 6.1.1 and 6.0.4 you will see the difference.
>
> We will be glad, if you have any hint or idea to solve this problem.
>
>
> Best regards,
> Daniel
>
>
> +++ Snipped +++
>
> import com.ulcjava.base.application.AbstractApplication;
> import com.ulcjava.base.application.BorderFactory;
> import com.ulcjava.base.application.ULCBoxPane;
> import com.ulcjava.base.application.ULCButton;
> import com.ulcjava.base.application.ULCDialog;
> import com.ulcjava.base.application.ULCFrame;
> import com.ulcjava.base.application.ULCLabel;
> import com.ulcjava.base.application.ULCScrollPane;
> import com.ulcjava.base.application.ULCTable;
> import com.ulcjava.base.application.ULCWindow;
> import com.ulcjava.base.application.event.ActionEvent;
> import com.ulcjava.base.application.event.IActionListener;
> import com.ulcjava.base.application.event.IWindowListener;
> import com.ulcjava.base.application.event.WindowEvent;
> import com.ulcjava.base.application.table.AbstractTableModel;
> import com.ulcjava.base.application.util.BorderedComponentUtilities;
> import com.ulcjava.base.application.util.Dimension;
> import com.ulcjava.base.development.DevelopmentRunner;
>
> public class TableAlertSnipped extends AbstractApplication {
>   private final ULCFrame frame = new ULCFrame("TableAlertSnipped");
>   private final ULCFrame popUpFrame = new ULCFrame("A new Frame");
>
>   public void start() {
>     // This is the calling frame
>     frame.setDefaultCloseOperation(ULCFrame.TERMINATE_ON_CLOSE);
>     frame.setSize(new Dimension(200, 65));
>     frame.setLocation(150, 150);
>     frame.setVisible(true);
>     frame.toFront();
>
>     ULCBoxPane pane = new ULCBoxPane();
>     ULCTable table = new ULCTable(new SnippetTableModel());
>     pane.add(ULCBoxPane.BOX_EXPAND_EXPAND, new ULCScrollPane(table));
>
>     popUpFrame.setDefaultCloseOperation(ULCFrame.DO_NOTHING_ON_CLOSE);
>     popUpFrame.setSize(new Dimension(350, 350));
>     popUpFrame.setLocation(150, 150);
>     popUpFrame.add(BorderedComponentUtilities.createBorderedComponent(pane,
>     ULCBoxPane.BOX_EXPAND_EXPAND,
>         BorderFactory.createEmptyBorder(5, 5, 5, 5)));
>
>     popUpFrame.addWindowListener(closeAction);
>
>     ULCButton testBtn = new ULCButton("Click to open a new Frame");
>     testBtn.addActionListener(new IActionListener() {
>       public void actionPerformed(ActionEvent event) {
>         showPopUp();
>       }
>     });
>
>     frame.add(testBtn);
>   }
>
>   private IWindowListener closeAction = new IWindowListener() {
>     public void windowClosing(WindowEvent event) {
>       close();
>     }
>   };
>
>   private void close() {
>     final AlertBox alert = new AlertBox(popUpFrame, "Alert", "Want to save
>     first?");
>     alert.addWindowListener(new IWindowListener() {
>       public void windowClosing(WindowEvent event) {
>         if (alert.getValue().equals("Ok")) {
>           // e.g. saving data ...
>           hidePopUp();
>         }
>
>         // comment dispose for ULC 6.0
>         alert.dispose();
>       }
>     });
>   }
>
>   private void hidePopUp() {
>     popUpFrame.setVisible(false);
>   }
>
>   private void showPopUp() {
>     popUpFrame.setVisible(true);
>     popUpFrame.toFront();
>   }
>
>   // --
>
>   private class SnippetTableModel extends AbstractTableModel {
>     public Object getValueAt(int row, int column) {
>       return String.valueOf("xxxyyy");
>     }
>
>     public int getRowCount() {
>       return 10;
>     }
>
>     public void setValueAt(Object value, int row, int column) {
>       System.out.println("Setting: " + value.toString());
>     }
>
>     public int getColumnCount() {
>       return 5;
>     }
>
>     public boolean isCellEditable(int i, int j) {
>       return true;
>     }
>   }
>
>   public static void main(String[] args) {
>     DevelopmentRunner.setApplicationClass(TableAlertSnipped.class);
>     DevelopmentRunner.main(args);
>   }
>
>   private class AlertBox extends ULCDialog {
>     private static final long serialVersionUID = -8426765893446903437L;
>     private String value;
>
>     public AlertBox(ULCWindow parent, String title, String message) {
>       super(parent);
>
>       setTitle(title);
>       setSize(new Dimension(150, 90));
>       setModal(true);
>       setResizable(false);
>       setDefaultCloseOperation(ULCDialog.DISPOSE_ON_CLOSE);
>
>       ULCBoxPane pane = new ULCBoxPane(true);
>       pane.setVerticalGap(5);
>       pane.add(ULCBoxPane.BOX_EXPAND_EXPAND, new ULCLabel(message));
>
>       ULCBoxPane btnPane = new ULCBoxPane(false);
>
>       ULCButton btn1 = new ULCButton("Ok");
>       btn1.addActionListener(a);
>       btnPane.add(btn1);
>
>       ULCButton btn2 = new ULCButton("Cancel");
>       btn2.addActionListener(a);
>       btnPane.add(btn2);
>
>       pane.add(ULCBoxPane.BOX_EXPAND_EXPAND, btnPane);
>
>       this.add(pane);
>       this.setVisible(true);
>       this.toFront();
>     }
>
>     private IActionListener a = new IActionListener() {
>       public void actionPerformed(final ActionEvent event) {
>         // Sets the buttons text as return value of the dialog.
>         setValue(((ULCButton) event.getSource()).getText());
>
>         // ULC 6.0
>         //distributeToListeners(new WindowEvent(this));
>         // ULC 6.1
>         fireWindowClosing(new WindowEvent(this));
>         setVisible(false);
>       }
>     };
>
>     public String getValue() {
>       return (value != null) ? value : "windowClosing";
>     }
>
>     private void setValue(String value) {
>       this.value = value;
>     }
>   }
> }
>
>
>
> (See attached file: TableAlertSnipped.java)

_______________________________________________
ULC-developer mailing list
[email protected]
http://lists.canoo.com/mailman/listinfo/ulc-developer

Reply via email to