¿Por qué mi etiqueta no aparece si está configurado como visible

habermehl :

He tratado de encapsular mi confusión en un programa mínimo. Sé que cuando se añaden varios componentes a, por ejemplo, región de centro de un JFrame, sólo el componente más recientemente añadido es visible. Pero el uso de getComponents () puedo ver que los componentes añadidos antes-aún están "ahí". Así que tengo curiosidad por qué no puedo ver el componente añadido antes-después de usar setVisible (falso) para ocultar el componente más recientemente añadido? Muchas gracias.

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

public class Foo {

    public static void main(String [] args) {
        JFrame jFrame = new JFrame();
        jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        jFrame.setLocationRelativeTo( null );
        jFrame.setSize( 300, 300 );
        jFrame.setLayout( new BorderLayout() );

// 1. Put 2 JLabels in BorderLayout.CENTER
        JLabel label1 = new JLabel( "Label1" ), label2 = new JLabel( "Label2" );
        jFrame.add( label1, BorderLayout.CENTER );
        jFrame.add( label2, BorderLayout.CENTER );

// 2. Demonstrate that both JLabels are in the JFrame
        listAllComponents( jFrame ); // Show that jFrame contains both JLabels.

// 3. Hide the 2nd-added JLabel.
        label2.setVisible( false );
        label1.setVisible( true );  // WHY IS label1 NOT DISPLAYED?

// 4. Revalidate/repaint the JFrame
        jFrame.setVisible( true );
        jFrame.revalidate();
        jFrame.repaint();

// 5. Why isn't the 1st-added JLabel displayed?
    }

    // List all of a JFrame's JLabels' text strings (assumes JFrame only contains JLabels).
    static void listAllComponents( JFrame jFrame ) {
         Component[] components = jFrame.getContentPane().getComponents();
         System.out.println( "\nComponents in the JFrame:" );
         for ( Component component : components ) {
             System.out.printf( "\t%s\n", ((JLabel)component).getText() );
         }
    }
}
camickr:

Sé que cuando se añaden varios componentes a, por ejemplo, región de centro de un JFrame, sólo el componente más recientemente añadido es visible. Pero el uso de getComponents () puedo ver que los componentes añadidos antes-aún están "ahí".

Es el trabajo del controlador de distribución para establecer el tamaño y la ubicación del componente.

Cuando el marco se hace visible, el controlador de distribución se invoca y cada componente se le da un tamaño y ubicación.

El BorderLayoutsólo las pistas el último componente añadido para cada restricción, por lo que sólo se establece el tamaño / ubicación para label2.

El tamaño predeterminado de un componente Swing es (0, 0). A partir de ese controlador de distribución no ha cambiado el tamaño de label1, no hay nada que pintar.

Intente lo siguiente:

public static void main(String [] args) {
    JFrame jFrame = new JFrame();
    jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    jFrame.setLocationRelativeTo( null );
    jFrame.setSize( 300, 300 );
    jFrame.setLayout( new BorderLayout() );

    JLabel label1 = new JLabel( "Label1" );
    label1.setSize( label1.getPreferredSize() );
    JLabel label2 = new JLabel( "Label2" );
    jFrame.add( label1, BorderLayout.CENTER );
    jFrame.add( label2, BorderLayout.CENTER );
    jFrame.setVisible( true );
}

Ahora, la primera etiqueta tiene un tamaño por lo que se pinta en su ubicación predeterminada a pesar de que el controlador de distribución no sabe nada al respecto.

Si realmente quiere dos componentes para compartir el mismo espacio, entonces se puede utilizar una CardLayout. El CardLayout dará un tamaño / ubicación de todos los componentes, pero va a gestionar qué componente es visible y en cualquier momento dado.

Lea la sección del tutorial Swing en cómo utilizar CardLayout para un ejemplo de trabajo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=365422&siteId=1
Recomendado
Clasificación