gpt4 book ai didi

java - 为什么我的标签设置为可见后不显示

转载 作者:行者123 更新时间:2023-12-02 08:49:46 25 4
gpt4 key购买 nike

我试图将我的困惑封装在一个最小的程序中。我知道,当将多个组件添加到 JFrame 的 CENTER 区域时,只有最近添加的组件是可见的。但是使用 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() );
}
}
}

最佳答案

I know that when multiple components are added to, say, a JFrame's CENTER region, only the most recently added component is visible. But using getComponents() I can see that the earlier-added components are still "there."

布局管理器的工作是设置组件的大小和位置。

当框架可见时,将调用布局管理器,并为每个组件指定一个大小和位置。

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

现在第一个标签有一个大小,因此即使布局管理器对此一无所知,它也会绘制在其默认位置。

如果您确实希望两个组件共享同一空间,那么您可以使用 CardLayout。 CardLayout 将为所有组件提供大小/位置,但它将管理哪个组件在任何给定时间可见。

阅读 Swing 教程中关于 How to Use CardLayout 的部分一个工作示例。

关于java - 为什么我的标签设置为可见后不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60856820/

25 4 0