编程语言
首页 > 编程语言> > java – 将面板添加到框架,但在运行应用程序时不显示

java – 将面板添加到框架,但在运行应用程序时不显示

作者:互联网

参见英文答案 > Why shouldn’t I call setVisible(true) before adding components?                                    2个
我正在创建一个应用程序,框架中有两个面板,顶部有一个菜单栏.菜单栏显示正常,到目前为止设置的任何操作都有效,但其他两个面板从未出现.

我已经尝试回溯所有将它们添加到框架上的面板和线条,并且找不到任何错误.

在drawForm()方法中没有显示的两个窗格中的第一个在我添加一些组件之前显示,但是因为即使我再次删除组件也没有显示.

这是类框架:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Frame {
    public static void drawFrame(){
        // Create frame
        JFrame frame = new JFrame("Frame");
        // Set default close operation
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Set frame attributes
        frame.setVisible(true);
        frame.setSize(400, 300);
        frame.setResizable(false);
        // Set Layout
        frame.setLayout(new BorderLayout());
        // Add Components
        frame.add(drawMenuBar(), BorderLayout.NORTH);
        JPanel twinPane = new JPanel();
            frame.add(twinPane, BorderLayout.CENTER);
            twinPane.setLayout(new GridLayout(1, 2));
            twinPane.add(drawForm());
            twinPane.add(drawInfo());
    } // Ends method drawFrame

    public static JMenuBar drawMenuBar(){
        //Create menu structure
        JMenuBar menu = new JMenuBar();
            JMenu file = new JMenu("File");
                JMenuItem clear = new JMenuItem("Clear");
                JMenuItem calculate = new JMenuItem("calculate");
                JMenuItem exit = new JMenuItem("Exit");
            JMenu help = new JMenu("Help");
                JMenuItem about = new JMenuItem("About");
                JMenuItem instructions = new JMenuItem("Instructions");
        //Add menu items to repective area of menu tree
        menu.add(file);
            file.add(clear);
            file.add(calculate);
            file.add(exit);
        menu.add(help);
            help.add(about);
            help.add(instructions);
        //Add ActionListener
        exit.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                MainApp app = new MainApp();
                app.exit();
            }

        });
        //Set Return
        return menu;
    } // Ends method drawMenuBar

    public static JPanel drawForm(){
        //Set panel with layout and border
        JPanel form = new JPanel();
        form.setBorder(BorderFactory.createTitledBorder("Form"));
        form.setLayout(new BoxLayout(form, BoxLayout.PAGE_AXIS));
        //Create field and labels for form panel and add to form panel
        JLabel label1 = new JLabel("text1");
            form.add(label1);
        JTextField textfield1 = new JTextField(5);
            form.add(textfield1);
        JLabel label2 = new JLabel("text2");
            form.add(label2);
        JTextField textfield2 = new JTextField(5);
            form.add(textfield2);
        JButton calc = new JButton("calculate");
            form.add(calc);
        JTextField result = new JTextField(5);
            form.add(result);
        //Set return
        return form;
    } // Ends method drawForm

    public static JPanel drawInfo(){
        //Set Panel with layout and border
        JPanel info = new JPanel();
        info.setBorder(BorderFactory.createTitledBorder("Information"));
        //Set Return
        return info;
    } // Ends method drawInfo

} // Ends class Frame

主要方法是在另一个类中,但类Frame创建GUI.框架和菜单栏完美配合,但之后的所有内容都无效.

我感谢任何帮助,谢谢

玩笑

解决方法:

将组件添加到容器时,可能需要使容器层次结构无效,以使它们变得可见…

在您添加任何内容之前设置框架时,问题就是突出显示…

public static void drawFrame(){
    // Create frame
    JFrame frame = new JFrame("Frame");
    // Set default close operation
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Set frame attributes

    // !! Don't do this here...
    //frame.setVisible(true);
    // ... IMHO, better to use pack...
    //frame.setSize(400, 300);
    frame.setResizable(false);
    // Set Layout
    frame.setLayout(new BorderLayout());
    // Add Components
    frame.add(drawMenuBar(), BorderLayout.NORTH);
    JPanel twinPane = new JPanel();
    frame.add(twinPane, BorderLayout.CENTER);
    twinPane.setLayout(new GridLayout(1, 2));
    twinPane.add(drawForm());
    twinPane.add(drawInfo());

    // !! Do it here instead...
    frame.pack();
    frame.setVisible(true);
} // Ends method drawFrame

标签:java,swing,panels
来源: https://codeday.me/bug/20190831/1776216.html