为什么只有当我先设置Visible(false)时面板才会出现

  • 本文关键字:false Visible 设置 java swing
  • 更新时间 :
  • 英文 :


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

ActionListener中,我代表menuItem,我正在创建一个内部有标签的新面板,但只有在实例化后我首先调用setVisible(false),这个标签才会显示在屏幕上。

主窗口.java

package main;
import javax.swing.*;
import java.awt.*;
@SuppressWarnings("serial")
public class MainWindow extends JFrame {
MainWindow() {
super("Carros");
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setExtendedState(Frame.MAXIMIZED_BOTH);
this.getContentPane().setLayout((null));
getContentPane().setLayout(null);
JMenuBar jMenuBar = new JMenuBar();
jMenuBar.setBounds(0, 0, 606, 21);
this.getContentPane().add(jMenuBar);
JMenu carMenu = new JMenu("Carros");
jMenuBar.add(carMenu);
JMenuItem includeMenuItem = new JMenuItem("Incluir");
carMenu.add(includeMenuItem);
includeMenuItem.addActionListener(e -> showIncludePanel());
}
private void showIncludePanel() {
JPanel panel = new JPanel();
panel.setVisible(false);
panel.setBounds(5, 20, 431, 241);
this.getContentPane().add(panel);
JLabel label = new JLabel("Primeiro panel");
panel.add(label);
panel.setVisible(true);
}
}

Main.java

package main;
public class Main {
public static void main(String[] args) {
MainWindow mainWindow = new MainWindow();
mainWindow.setVisible(true);
}
}

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

此外,框架允许您设置"J"(摆动(菜单栏。尽可能避免使用AWT。。。至少不要将它与Swing组件混合,因为它是一个较旧的重载库。

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

主窗口.java

package q60816855;
import javax.swing.*;
import java.awt.*;
public class MainWindow extends JFrame implements Runnable {
public MainWindow() {
super("Carros");
this.setLayout(null); // Same as calling null on the content pane
createMenu();
}
@Override
public void run() {
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setVisible(true);
}
private void createMenu() {
JMenuBar jMenuBar = new JMenuBar();
JMenu carMenu = new JMenu("Carros");
jMenuBar.add(carMenu);
JMenuItem includeMenuItem = new JMenuItem("Incluir");
carMenu.add(includeMenuItem);
this.setJMenuBar(jMenuBar);
System.out.println(this.getContentPane().getPreferredSize());
includeMenuItem.addActionListener(e -> {
this.getContentPane().add(createIncludePanel());
this.pack();
});
}
private JPanel createIncludePanel() {
JPanel panel = new JPanel();
JLabel label = new JLabel("Primeiro panel");
label.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new BorderLayout());
panel.setBounds(20, 20, 431, 241);
panel.setBackground(Color.LIGHT_GRAY);
panel.add(label, BorderLayout.NORTH);
return panel;
}
}

Main.java

package q60816855;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new MainWindow());
}
}

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

相关内容

最新更新