JFrame中没有显示任何内容

时间:2014-08-06 06:56:22

标签: java swing user-interface layout border-layout

我想创建一个gui,它在顶部有两个水平组件(一个组合框和一个按钮),在底部我想添加几个组件。我创造了这样的一切:

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;

public class minimumExample extends JFrame {

    private JButton addItem;

    private JComboBox itemBox;

    private String[] itemSelect = { "test1", "test2" };

    private JPanel addUpperPane;

    private JPanel addLowerPane;


    public void createControlPane() {

        setLayout(new BorderLayout());

        addUpperPane = new JPanel(new BorderLayout(5, 5));
        addLowerPane = new JPanel(new GridLayout(0, 1));

        addItem = new JButton("Add item");

        itemBox = new JComboBox(itemSelect);

        addItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                getContentPane().setLayout(new GridLayout(0, 1));

                if(itemBox.getSelectedItem().toString().equals("test1")) {
                    addLowerPane.add(new Button("Lolonator"));
                    validate();
                    repaint();

                }

            }
        });;

        addUpperPane.add(itemBox);
        addUpperPane.add(addItem);
        addUpperPane.add(new JSeparator(JSeparator.HORIZONTAL));

        //put everything together

        add(addUpperPane);
        add(addLowerPane);

        repaint();

    }

    private void makeLayout() {

        setTitle("Test App");
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(1000, 500));

        createControlPane();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);

    }


    /**
     * starts the GUI
     */
    public void start() {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                makeLayout();   
            }
        });
    }

    public static void main(String[] args) throws IOException {
        minimumExample ex = new minimumExample();
        ex.start();
    }

}

我的问题是没有显示任何内容,我也认为布局不正确。任何建议我应该改变什么来解决我的问题?

感谢您的回答!

更新

这是一个关于我的gui应该是什么样子的简单线框:

enter image description here

更新2

将所有内容更改为:

addUpperPane.add(itemBox, BorderLayout.EAST);
        addUpperPane.add(addItem, BorderLayout.WEST);
        addUpperPane.add(new JSeparator(JSeparator.HORIZONTAL));

        //put everything together

        add(addUpperPane, BorderLayout.NORTH);
        add(addLowerPane, BorderLayout.SOUTH);

给我: enter image description here

任何建议如何消除差距?

2 个答案:

答案 0 :(得分:3)

由于你使用BorderLayout,你需要指定布局的每个组件的位置,你所做的是你只是在布局的相同位置添加所有组件,默认情况下是{{1 }}

<强>溶液

CENTER

addUpperPane.add(itemBox,BorderLayout.EAST); addUpperPane.add(addItem,BorderLayout.WEST); addUpperPane.add(new JSeparator(JSeparator.HORIZONTAL)); //put everything together add(addUpperPane,BorderLayout.NORTH); add(addLowerPane,BorderLayout.SOUTH); 以来,JFrame的默认布局已经setLayout(new BorderLayout());,因此无需再次设置布局。

修改

如果您希望您的组件并排,那么BorderLayout是可行的方法:

FlowLayout

编辑编号2:

<强>问题:

addUpperPane = new JPanel(); //default component of JPanel is FlowLayout
addUpperPane.add(itemBox);
addUpperPane.add(addItemT);

<强>样品:

    getContentPane().setLayout(new GridLayout(0, 1)); //remove it

答案 1 :(得分:1)

Rod_Algonquin的解决方案是正确的。 如果您要构建更多GUI,我可以向您推荐MigLayout。它可以帮助您编写更好的GUI,减少可读代码行。

他们的主页:http://miglayout.com/