JFrame缺少包含面板的GridBagLayout内容

时间:2017-03-16 20:42:54

标签: java jpanel gridbaglayout

我在OSX上使用NetBeans 8.2,当我运行代码时,我得到一个具有正确标题的窗口,但没有显示任何组件。我确保所有框架都设置为可见,但问题仍然存在。

  public Project(){
    setTitle("Panel");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 200);
    setLocationRelativeTo(null);
    setLayout(new GridBagLayout());
    setVisible(true);

    GridBagConstraints layout = new GridBagConstraints();
    layout.gridy = 3;

    JPanel topPanel = new JPanel();
    topPanel.setVisible(true);
    topPanel.setLayout(new GridLayout(2,1));
    topPanel.add(label1);
    topPanel.add(textField1); 

    JPanel midPanel = new JPanel();
    midPanel.setVisible(true);
    midPanel.setLayout(new GridLayout(1,1));
    midPanel.add(button1);

    JPanel bottomPanel = new JPanel();
    bottomPanel.setVisible(true);
    bottomPanel.setLayout(new GridLayout(2,1));
    bottomPanel.add(label2);
    bottomPanel.add(textField2);

    add(topPanel);
    add(midPanel);
    add(bottomPanel);
  }

  public static void main(String[] args) {
    Project1 frame = new Project1();
  }

1 个答案:

答案 0 :(得分:1)

选择setVisible(true);并将其作为构造函数中可以调用的最后一件事

public Project(){
    setTitle("Panel");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 200);
    setLocationRelativeTo(null);
    setLayout(new GridBagLayout());
    //setVisible(true);
    //...
    setVisible(true);
}

您还应该确保在Event Dispatching Thread

的上下文中构建了UI
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
             Project1 frame = new Project1();
        }
    });
}

这将有助于防止可能发生的一些奇怪现象