私は、最小限のプログラムで私の混乱をカプセル化しようとしました。私は複数のコンポーネントが追加されたときに、言うことを知って、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() );
}
}
}
私は複数のコンポーネントが追加されたときに、言うことを知って、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つのコンポーネントが同じ空間を共有したいなら、あなたは使用することができますCardLayout
。CardLayoutは、すべてのコンポーネントのサイズ/位置を与えるが、それは目に見える任意の所与の時間であるコンポーネント管理します。
上のSwingのチュートリアルからセクション読む使っCardLayoutにどのように取り組ん例えば。