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