java.awt.Component,setVisible,LayoutManager

问题描述

我试图创建一个GUI,发现了java.awt.Component的某些奇怪行为。我想通过外部事件来setVisible(true) / setVisible(false)一个java.awt.Component。但这仅在首先要切换的组件已经可见时才起作用。附件中,我提供了我的问题的最小副本。

package test;

import java.awt.Button;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public final class Test {
    public static void main(String[] args) {
        Button testButton = new Button("Test Button");
        testButton.setVisible(false); /* Removing this line makes the code to work as intended,but why? */
        
        Frame mainFrame = new Frame("Test");
        mainFrame.setMinimumSize(new Dimension(640,480));
        mainFrame.setVisible(true);
        mainFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent event) {
                System.exit(0);
            }
        });
        
        mainFrame.add(testButton);
        
        mainFrame.setMenuBar(new MenuBar());
        mainFrame.getMenuBar().add(new Menu("Test"));
        mainFrame.getMenuBar().getMenu(0).add(new MenuItem("Show/Hide \"Test Button\""));
        mainFrame.getMenuBar().getMenu(0).getItem(0).addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if(testButton.isVisible()) testButton.setVisible(false);
                else testButton.setVisible(true);
                System.out.println("testButton.getBounds()" + testButton.getBounds()); /* EDIT: Added this line for debugging. */
                System.out.println("testButton.isVisible() " + testButton.isVisible());
            }
        });
    }
}

当您删除行testButton.setVisible(false);时,testButton是可见的,并且也可以在可见状态下切换,否则就不可见。有人知道为什么吗?也许布局管理器不适用于不可见的组件?

编辑:看来布局管理器不setBounds(...)用于不可见的组件,但是为什么呢?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)