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

时间:2013-09-23 00:10:27

标签: java swing panels

我正在创建一个应用程序,框架中有两个面板,顶部有一个菜单栏。菜单栏显示得很好,到目前为止设置的任何操作都有效,但其他两个面板永远不会出现。

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

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

这是类Frame:

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。框架和菜单栏完美配合,但之后的所有内容都无效。

感谢您的帮助,谢谢

约什

3 个答案:

答案 0 :(得分:3)

当您向容器添加组件时,您可能需要使容器层次结构无效以使它们变得可见...

在您添加任何内容之前设置框架时,问题就是高亮显示...

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

答案 1 :(得分:2)

您在添加组件之前将JFrame设置为可见。不要那样做。添加组件,pack()您的JFrame,然后将其设置为可见。

但无论您收到任何答案,您的问题之前都会被多次询问,包括:Why shouldn't I call setVisible(true) before adding components?。由于这个问题不太可能帮助未来的访问者,因此投票结束复制。

答案 2 :(得分:0)

同意@MadProgrammer。您应该将代码 - frame.pack(); frame.setVisible(true) - 放在底部。