JDK-4224470 : JPanel.setEnabled(false) doesn't disable its children
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 1.2.0
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_98,windows_nt
  • CPU: x86
  • Submitted: 1999-03-26
  • Updated: 1999-12-26
  • Resolved: 1999-12-26
Related Reports
Duplicate :  
Description

Name: krT82822			Date: 03/26/99


In AWT calling setEnable(false) on a Panel used 
to disable all components placed in this container.
With JPanel it seems not to work any more.

Here are examples of the code in both Swing (doesn't work) 
and AWT (works OK).
Pressing the button at the bottom of the frame will 
disable and enable keyboard input in AWT example.
In Swing there is no effect.

////////////////////// Swing ///////////////////////
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JPanel
{
	static Test test;
	static boolean enabled = true;
	JButton b;

	Test()
	{
		JTextField t = new JTextField("type here");
		setLayout( new BorderLayout() );
		add( t, BorderLayout.CENTER );

	}

	public static void main( String[] arg )
	{
		JFrame f = new JFrame("JPanel setEnabled() bug demo");
		test = new Test();
		test.b = new JButton("disable");
		f.getContentPane().setLayout( new BorderLayout() );
		f.getContentPane().add( test, BorderLayout.CENTER );
		f.getContentPane().add( test.b, BorderLayout.SOUTH );
		test.b.addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent a)
				{
					enabled = !enabled;
					test.setEnabled( enabled );
					test.b.setText( enabled ? "disable" : "enable" );
				}
			} );
		f.setSize( 200, 200 );
		f.setVisible( true );
	}
}

///////////////////////// AWT /////////////////////////

import java.awt.*;
import java.awt.event.*;

public class Test2 extends Panel
{
	static Test2 test;
	static boolean enabled = true;
	Button b;

	Test2()
	{
		TextField t = new TextField("type here");
		setLayout( new BorderLayout() );
		add( t, BorderLayout.CENTER );

	}

	public static void main( String[] arg )
	{
		Frame f = new Frame("JPanel setEnabled() bug demo");
		test = new Test2();
		test.b = new Button("disable");
		f.setLayout( new BorderLayout() );
		f.add( test, BorderLayout.CENTER );
		f.add( test.b, BorderLayout.SOUTH );
		test.b.addActionListener( new ActionListener()
			{
				public void actionPerformed( ActionEvent a)
				{
					enabled = !enabled;
					test.setEnabled( enabled );
					test.b.setLabel( enabled ? "disable" : "enable" );
				}
			} );
		f.setSize( 200, 200 );
		f.setVisible( true );
	}
}
(Review ID: 56124)
======================================================================

Name: skT88420			Date: 08/23/99


The following program has two places with setVisible(true).
The first one shows the frame, but not the children,
the second ones shows the frame with the children.
Switch between these to reproduce.
I believe the first one should also allow the children to be shown.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TextDemo {

    static JFrame jframe = new JFrame("Example");

    public static void setupjframe() {
        jframe.setSize(400,100);
        jframe.getContentPane().setLayout( new FlowLayout() );
				
				// This setVisible sets the frame visible, but children added later
				// are never shown.	
				 jframe.setVisible(true);

        WindowListener l = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {System.exit(0);}
        };
        jframe.addWindowListener(l);
    }

    public static void main(String[] args) {
        setupjframe();

        JTextField jtf = new JTextField(25);
        JLabel jl = new JLabel("Enter your name:");

        jtf.addActionListener( new ActionListener() {
                public void actionPerformed(ActionEvent e) 
                {  System.out.println(" you entered: " + e.getActionCommand() );
								  }
              } );

        Container c = jframe.getContentPane();
        c.add( jl );
        c.add( jtf );
        
        // Placing the setVisible call here will make everything OK.
        // jframe.setVisible(true);
    }
}


C:\>java -version
java version "1.2"
Classic VM (build JDK-1.2-V, native threads)

C:\>java -fullversion
JAVA.EXE full version "JDK-1.2-V"
(Review ID: 94237)
======================================================================

Comments
EVALUATION 12/26/99 kevin.ryan@eng -- noticed this is a dupe of 4177727.
11-06-2004

WORK AROUND Name: krT82822 Date: 03/26/99 I dont' know any workaround for JPanel itself. For my own classes derived form JPanel I simply override the setEnabled() method. ====================================================================== Name: skT88420 Date: 08/23/99 use setVisible AFTER adding children to a JFrame. (Review ID: 94237) ======================================================================
11-06-2004