Pourquoi mon étiquette ne s'affiche pas si elle est réglée sur visible

Habermehl:

J'ai essayé de résumer ma confusion dans un programme minimal. Je sais que lorsque plusieurs composants sont ajoutés, par exemple, une zone centrale de JFrame, seul le composant le plus récemment ajouté est visible. Mais en utilisant getComponents () Je vois que les composants précédemment ajoutée sont encore « là ». Je suis curieux de savoir pourquoi je ne vois pas la composante précédente ajoutée après que je l'utilise setVisible (false) pour cacher l'élément le plus récemment ajouté? Merci beaucoup.

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:

Je sais que lorsque plusieurs composants sont ajoutés, par exemple, une zone centrale de JFrame, seul le composant le plus récemment ajouté est visible. Mais en utilisant getComponents () Je vois que les composants précédemment ajoutée sont encore « là ».

Il est le travail du gestionnaire de mise en page pour définir la taille et l'emplacement du composant.

Lorsque le cadre est visible, le gestionnaire de mise en page est invoquée et chaque composant est donné une taille et son emplacement.

Les BorderLayoutpistes que le dernier composant ajouté pour chaque contrainte, de sorte que la taille / emplacement pour label2 est réglé.

La taille par défaut d'un composant Swing est (0, 0). Depuis que le gestionnaire de mise en page n'a pas changé la taille de label1, il n'y a rien à peindre.

Essayez les points suivants:

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 );
}

Maintenant, la première étiquette a une taille de sorte qu'il est peint à son emplacement par défaut, même si le gestionnaire de mise en page ne sait rien à ce sujet.

Si vous voulez vraiment deux composants pour partager le même espace, vous pouvez utiliser un CardLayout. Le CardLayout donnera une taille / emplacement à tous les composants, mais il administrera quel composant est visible et un moment donné.

Lisez la section du tutoriel Swing Comment utiliser CardLayout pour un exemple de travail.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=365418&siteId=1
conseillé
Classement