Java 为什么面板仅在我首先设置Visible(false)时显示?

Java 为什么面板仅在我首先设置Visible(false)时显示?,java,swing,Java,Swing,如果我单击“包含”菜单项,它将显示面板,但仅当我首先setVisible(false)时,如果我删除该行,它将停止工作 在ActionListener中,我支持menuItem我正在创建一个带有标签的新面板,但只有在实例化后首先调用setVisible(false)时,该标签才会显示在屏幕上 MainWindow.java packagemain; 导入javax.swing.*; 导入java.awt.*; @抑制警告(“串行”) 公共类主窗口扩展JFrame{ 主窗口(){ 超级(“卡洛斯”

如果我单击“包含”菜单项,它将显示面板,但仅当我首先
setVisible(false)
时,如果我删除该行,它将停止工作

ActionListener
中,我支持
menuItem
我正在创建一个带有标签的新面板,但只有在实例化后首先调用
setVisible(false)
时,该标签才会显示在屏幕上

MainWindow.java
packagemain;
导入javax.swing.*;
导入java.awt.*;
@抑制警告(“串行”)
公共类主窗口扩展JFrame{
主窗口(){
超级(“卡洛斯”);
此.setDefaultCloseOperation(WindowConstants.DISPOSE\u ON\u CLOSE);
setExtendedState(Frame.MAXIMIZED_两者);
this.getContentPane().setLayout((null));
getContentPane().setLayout(null);
JMenuBar JMenuBar=新的JMenuBar();
立根(0,0,606,21);
this.getContentPane().add(jMenuBar);
JMenu carMenu=新JMenu(“Carros”);
jMenuBar.add(carMenu);
JMenuItem includeNuItem=新的JMenuItem(“Incluir”);
carMenu.add(包括菜单项);
addActionListener(e->showIncludePanel());
}
私有void showIncludePanel(){
JPanel面板=新的JPanel();
面板设置可见(假);
嵌板.立根(5,20,431,241);
this.getContentPane().add(面板);
JLabel标签=新JLabel(“Primeiro面板”);
面板。添加(标签);
面板设置可见(真);
}
}
主类
packagemain;
公共班机{
公共静态void main(字符串[]args){
MainWindow MainWindow=新的MainWindow();
mainWindow.setVisible(true);
}
}

无论如何,这不是一个确定的答案,而是一个潜在的答案。可能因为您对内容窗格使用了空布局,所以该组件尚未验证。尝试在创建窗口后对window.validate()或window.invalidate()进行验证,看看是否有效。

添加新组件后在框架上调用
this.pack()

此外,框架允许您设置“J”(Swing)菜单栏。尽量避免使用AWT。。。至少不要将其与Swing组件混合使用,因为它是一个较旧的重型库

我调整了程序的流程,使其更易于维护和可读

MainWindow.java
包装q60816855;
导入javax.swing.*;
导入java.awt.*;
公共类MainWindow扩展JFrame实现可运行{
公共主窗口(){
超级(“卡洛斯”);
this.setLayout(null);//与在内容窗格上调用null相同
createMenu();
}
@凌驾
公开募捐{
setExtendedState(JFrame.MAXIMIZED_两者);
此.setLocationRelativeTo(空);
此.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
此.setVisible(true);
}
私有void createMenu(){
JMenuBar JMenuBar=新的JMenuBar();
JMenu carMenu=新JMenu(“Carros”);
jMenuBar.add(carMenu);
JMenuItem includeNuItem=新的JMenuItem(“Incluir”);
carMenu.add(包括菜单项);
这个.setJMenuBar(jMenuBar);
System.out.println(this.getContentPane().getPreferredSize());
IncludeMinuItem.addActionListener(e->{
this.getContentPane().add(createIncludePanel());
这个包();
});
}
私有JPanel createIncludePanel(){
JPanel面板=新的JPanel();
JLabel标签=新JLabel(“Primeiro面板”);
标签设置水平对齐(JLabel.CENTER);
panel.setLayout(新的BorderLayout());
嵌板.立根(20,20,431,241);
面板.立根背景(颜色.浅灰色);
面板。添加(标签,边框布局。北);
返回面板;
}
}
主类
包装q60816855;
导入javax.swing.*;
公共班机{
公共静态void main(字符串[]args){
调用器(新的主窗口());
}
}
1)
this.getContentPane().setLayout((null));getContentPane().setLayout(null)Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或与布局填充和边框一起使用。2) 
jMenuBar.setBounds(0,060621)改为使用。3) 以最小尺寸提供ASCII艺术或GUI预期布局的简单绘图,如果可以调整大小,则提供更大的宽度和高度,以显示应如何使用额外的空间。4) 
showIncludePanel()
的效果可以通过在启动时添加面板和空白标签以及在需要时设置标签文本来实现。这也比动态添加面板和标签更可靠。