From: Ramon on
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.
From: Daniel Pitts on
Ramon wrote:
> 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.

--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>
From: Ramon on
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?




Daniel Pitts wrote:
> Ramon wrote:
>> 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.
>
From: Daniel Pitts on
Please don't top-post. Harder to read it makes the post.
Ramon wrote:
> Daniel Pitts wrote:
>> Ramon wrote:
>>> 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.
>>
> 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.
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>
From: Ramon on
What a silly mistake :) Thank you Daniel for your useful tips.

Have a good day/night.


Daniel Pitts wrote:
> Please don't top-post. Harder to read it makes the post.
> Ramon wrote:
>> Daniel Pitts wrote:
>>> Ramon wrote:
>>>> 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.
>>>
>> 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.