Das Abräumen des Dialogs mit dispose() führt (über den Container) ein removeNotify() auf allen Komponenten aus; also auch dem JButton.
Dort wird der Button von der RootPane des Dialogs als Default entfernt. JButton-Javadoc:
to ensure the RootPane doesn't hold onto an invalid button reference
Wir können dies fixen in dem wir eine neue Unterklasse von JButton schreiben und so benutzen:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;
public class DefaultButtonAfterDisposedDialogExample implements ActionListener
{
public DefaultButtonAfterDisposedDialogExample()
{
DefaultForeverJButton b = new DefaultForeverJButton( "Tweaked Button" );
b.addActionListener( this );
JDialog d = new JDialog();
d.add( b );
d.getRootPane().setDefaultButton( b );
d.pack();
d.setVisible( true );
d.dispose();
d.pack();
d.setVisible( true );
// b.requestFocusInWindow();//fix to get the focus back (to be able to perform the Action using the spacebar)
}
public void actionPerformed( ActionEvent e )
{
System.out.println( "actioning !" );
}
public static void main( String[] args )
{
DefaultButtonAfterDisposedDialogExample g = new DefaultButtonAfterDisposedDialogExample();
}
public class DefaultForeverJButton extends JButton
{
public DefaultForeverJButton( String string )
{
super( string );
}
/**
* We don't like the removing of the DefaultButton in JButton.removeNotify() but want to preserve the
* actions from AbstractButton.removeNotify() up to Component.removeNotify().<br/>
* There is no "super.super.method()" in Java, so we have to revert the unwanted code of
* JButton.removeNotify().
*/
@Override
public void removeNotify()
{
JRootPane root = SwingUtilities.getRootPane( this );
boolean iWillHaveToReAddMeLaterAsDefaultButton = false;
if ( root != null && root.getDefaultButton() == this )
iWillHaveToReAddMeLaterAsDefaultButton = true;
super.removeNotify();
if ( iWillHaveToReAddMeLaterAsDefaultButton && root != null )
root.setDefaultButton( this );
}
}
}
Ob dies schön ist und ob dadurch Probleme mit "invalid button references" entstehen können, mögen andere beurteilen ;-)