JDialog Question...

R

Ramon

Hi,

I'm trying to make a class that inherits from JDialog. The dialog has
two buttons: Ok and Cancel. When the OK button is clicked, the main
form is trying to read a result that is stored in the dialog's variable.

Question: Is there a safe way how to read a dialog's instance variable
(using a getter) after the dialog is set to invisible (i.e.
this.setVisible(false)) ?

PS: In general I am able to read the dialog's variables but, apparently,
sometimes the dialog is destroyed by the garbage collector...

Thanks.
 
D

Daniel Pitts

Ramon said:
Hi,

I'm trying to make a class that inherits from JDialog. The dialog has
two buttons: Ok and Cancel. When the OK button is clicked, the main
form is trying to read a result that is stored in the dialog's variable.

Question: Is there a safe way how to read a dialog's instance variable
(using a getter) after the dialog is set to invisible (i.e.
this.setVisible(false)) ?

PS: In general I am able to read the dialog's variables but, apparently,
sometimes the dialog is destroyed by the garbage collector...

Thanks.
If you have a reference to the JDialog, then it will not be garbage
collected. Are having a particular problem? What are the symptoms?

Provide an SSCCE if you want to get the most help from this newsgroup.
See <http://sscce.org> if you don't know how or why to provide an SSCCE.
 
R

Ramon

The following is a short version of my Jdialog...

public class InputDialog extends JDialog
{
private Boolean okButtonPressed_; // true = OK button pressed

/* init here ... */


/*
* OK button even handler
*/
private void okButtonActionPerformed(java.awt.event.ActionEvent
evt)
{
this.setVisible(false);
this.okButtonPressed_ = true;
}
}


This is a method of the class which is calling my InputDialog:

private void cmdUserSettings()
{
InputDialog inputDialog = new InputDialog(null, true);

// if ok button was pressed
if (inputDialog.getOkButtonPressed()) // #####
{ /* ... */ }
else
{ /* ... */ }

if (inputDialog != null)
inputDialog.dispose();
}

The line marked with ##### is sometimes throwing a NullPointerException,
thus indicating that somehow the garbage is destroying inputDialog...

Any suggestions?
 
D

Daniel Pitts

Please don't top-post. Harder to read it makes the post.
Ramon said:
The following is a short version of my Jdialog...

public class InputDialog extends JDialog
{
private Boolean okButtonPressed_; // true = OK button pressed

/* init here ... */


/*
* OK button even handler
*/
private void okButtonActionPerformed(java.awt.event.ActionEvent evt)
{
this.setVisible(false);
this.okButtonPressed_ = true;
}
}


This is a method of the class which is calling my InputDialog:

private void cmdUserSettings()
{
InputDialog inputDialog = new InputDialog(null, true);

// if ok button was pressed
if (inputDialog.getOkButtonPressed()) // #####
{ /* ... */ }
else
{ /* ... */ }

if (inputDialog != null)
inputDialog.dispose();
}
The line marked with ##### is sometimes throwing a NullPointerException,
thus indicating that somehow the garbage is destroying inputDialog...
While this isn't an SSCCE, I do believe I'm able to tell you the solution.

The garbage collector will not set a value to null, so the NPE is caused
by something else. In this case, your okButtonPressed_ is null.

If null doesn't make sense for your value, you should use the primitive
version, in this case "boolean" with a lower-case 'b'.

A couple of other comments. In Java, the convention is to avoid "_" in
names, except constants, which are ALL_UPPERCASE_LETTERS. Thus, a
better declaration for your case is:

private boolean okPressed;

public boolean isOkPressed() {
return okPressed;
}

One other comment, for your use-case, you might be happier using
JOptionPane. some quick googling should give you some hints on how to
use it.
 
R

Ramon

What a silly mistake :) Thank you Daniel for your useful tips.

Have a good day/night.
 
A

alexandre_paterson

Hi,

I'm trying to make a class that inherits from JDialog. The dialog has
two buttons: Ok and Cancel. When the OK button is clicked, the main
form is trying to read a result that is stored in the dialog's variable.

Don't do it that way... It's really not a nice.

Imagine the point of your dialog is to create some 'Nano' object
(whatever, it's just an example).

Usually the only thing that you care about in your app is to be
handled
that Nano object (or a failure, in some apps).

So simply pass a callback when creating your JDialog and call it
when the user clicks on OK.

public final class MyDialog extends JDialog {

public MyDialog(
@NotNull final Handable<Nano> callback
) {
...
btnOK.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
callback.handle( shinyNanoObject );
dispose();
}
} );
}

}


Keeping a reference to the JDialog, starting to read it's
reference/primitives etc. is not nice OO.

It's all objects and interaction between said objects.

All that you care about is what kind of object your JDialog
can handle...

Don't go into low level details, focus on the bigger OO picture.

If you like to alienate your users and want an application
that seems to be hung when the user mistakingly hides a modal
window (or, worse, moves it to another virtual desktop), then
use the idiom:

Color after = JColorChooser.showDialog(...)

But it's really piss-poor practices. If forces you to give
a default 'fallback' value (wtf, a user picking 'red' and a
user cancelling, while 'red' was the default is the same?
A big joke I tell ya) and it forces you to compare the return
value with the fallback to see if something changed or not and
it doesn't tell you if the user clicked on OK or if he cancelled.
In some case it can amount to the same, but for a great many
scenario you'll need something more complicated than this toyish
procedural way of doing things.

The antithesis of OO...


Alex
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top