それは目に見えるに設定すると、なぜ私のラベルが表示されません。

Habermehl:

私は、最小限のプログラムで私の混乱をカプセル化しようとしました。私は複数のコンポーネントが追加されたときに、言うことを知って、JFrameのの中心領域は、唯一の最も最近追加されたコンポーネントが表示されます。しかし、のgetComponents()を使用し、私は以前、追加コンポーネントが残っていることがわかります「が。」私は好奇心が強いので、私は最近追加されたコンポーネントを非表示にするのsetVisible(false)を使用した後、なぜ私は以前、追加のコンポーネントを見ることができませんか?どうもありがとうございました。

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:

私は複数のコンポーネントが追加されたときに、言うことを知って、JFrameのの中心領域は、唯一の最も最近追加されたコンポーネントが表示されます。しかし、のgetComponents()を使用し、私は以前、追加コンポーネントが残っていることがわかります「が。」

コンポーネントのサイズと位置を設定するレイアウトマネージャの仕事です。

フレームが可視化されたとき、レイアウトマネージャが起動され、各コンポーネントは、サイズと位置が与えられます。

BorderLayoutだけなのでLABEL2ためだけサイズ/位置が設定され、各制約のために追加された最後のコンポーネントを追跡します。

Swingコンポーネントのデフォルトのサイズは、(0、0)です。そのレイアウトマネージャは、LABEL1のサイズを変更していないので、ペイントするものは何もありません。

次のことを試してみてください。

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

今、最初のラベルは、レイアウトマネージャはそれについて何も知らないにもかかわらず、そのデフォルトの位置に描かれているように、大きさを有しています。

あなたが実際には2つのコンポーネントが同じ空間を共有したいなら、あなたは使用することができますCardLayoutCardLayoutは、すべてのコンポーネントのサイズ/位置を与えるが、それは目に見える任意の所与の時間であるコンポーネント管理します。

上のSwingのチュートリアルからセクション読む使っCardLayoutにどのように取り組ん例えば。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=365417&siteId=1