Hi Daniel

I agree that both workarounds are not really satisfying in the long run. Issue
http://www.canoo.com/jira/browse/UBA-7130 is scheduled for release 6.1.3.

However, with the proposed workaround from my last mail your dialog at least has
the correct frame as its parent. I added the complete sample with the workaround
below.

Cheers
Rolf


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.ULCPollingTimer;
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 AAA extends AbstractApplication {
  private static final long serialVersionUID = -9164998680046972987L;
  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) {
        alert.dispose();

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

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

  private void showPopUp() {
    popUpFrame.setVisible(true);
    popUpFrame.toFront();
  }

  // --

  private class SnippetTableModel extends AbstractTableModel {
     private static final long serialVersionUID = 6715883500867725570L;

    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(AAA.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;
    }
  }
}

> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] Behalf Of
> [EMAIL PROTECTED]
> Sent: Mittwoch, 20. Dezember 2006 11:42
> To: [email protected]
> Cc: [EMAIL PROTECTED]
> Subject: RE: [ULC-developer] Problem closing frames from within a
> modal dialog in version 6.1.1
>
>
> Hello Rolf.
>
> Thank you for your answer concerning our problem. Well, we see the problem
> and we also could build a little workaround to fix the problem. When the
> parent isn't set, the dialog is closed. Otherwise if the parent is set, the
> dialog shows up as mentioned in our the previous post. Please see the
> snipped below to reproduce it.
>
> But nevertheless both workarounds aren't satisfying in long time sight - so
> we will be pleased, if this problem could be fixed in a near future
> release.
>
>
> Best regards,
> Daniel
>
>
> MT AG
> Dipl.-Ing. Daniel Backhausen
> Balcke-Dürr-Allee 9
> D-40882 Ratingen
>
> Telefon  +49 (0) 21 02 309 61-0
> Telefax  +49 (0) 21 02 309 61-50
> Mobil    +49 (0) 173 594 27 95
>
> E-Mail   [EMAIL PROTECTED]
>
> Internet http://www.mt-ag.com
>
> +++ 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 static final long serialVersionUID = -9164998680046972987L;
>   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?");
>     final AlertBox alert = new AlertBox(null, "Alert", "Want to save
>     first?");
>     // null => unsetting parent!
>     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 {
>      private static final long serialVersionUID = 6715883500867725570L;
>
>     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;
>     }
>   }
> }
>
>
>
>
> -----"Rolf Pfenninger" <[EMAIL PROTECTED]> wrote: -----
>
>
> To: <[email protected]>, <[EMAIL PROTECTED]>
> From: "Rolf Pfenninger" <[EMAIL PROTECTED]>
> Date: 12/20/2006 11:12
> cc: <[EMAIL PROTECTED]>, <[EMAIL PROTECTED]>
> Subject: RE: [ULC-developer] Problem closing frames from within a modal
> dialog in version 6.1.1
>
> 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-7130to 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

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

Reply via email to