我的框架占据了大部分空间

时间:2016-10-29 12:08:33

标签: java user-interface layout jspinner

所以我有一个问题,我必须对某些事情进行调查,我必须使用多个布局。

我的问题是,当我将2个JPanel添加到网格布局(仅限于1面)时,我的第一个面板占用了大部分空间。

代码:

public class MainFrame extends JFrame implements ItemListener{
        JPanel mainPanel,rightSideAge,rightSideGender,leftSide,rightSideBox,leftSideBox;
        JTextArea nameArea;
        JSpinner ageSpinner;
        JRadioButton genMale,genFema;
        ButtonGroup genderGroup;

    MainFrame(){
        this.setSize(1000, 800);
        this.setLocationRelativeTo(null);
        this.setTitle("Közvélemény kutatás a zenei ízlésekről");
        mainPanel = new JPanel(new GridLayout(0, 2));
        this.setContentPane(mainPanel);

        /* --- RIGHT PANEL --- */
        rightSideBox = new JPanel();
        rightSideBox.setLayout(new BoxLayout(rightSideBox, BoxLayout.Y_AXIS));

        rightSideAge = new JPanel(new FlowLayout(FlowLayout.LEFT));
        rightSideAge.setBorder(BorderFactory.createLineBorder(Color.BLUE));
        //rightSide.setLayout(new BoxLayout(rightSide, BoxLayout.Y_AXIS));
        mainPanel.add(rightSideBox);

            //Age label
        //JLabel labelAge = new JLabel("Kor: ");
        //labelAge.setSize(100, 30);
            //Age Spinner
        ageSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 120, 1));
        ageSpinner.setPreferredSize(new Dimension(40, 20));
        Component mySpinnerEditor = ageSpinner.getEditor();
        JFormattedTextField jftf = ((JSpinner.DefaultEditor) mySpinnerEditor).getTextField();
        jftf.setColumns(5);

            //New box for zenei ízlés
        rightSideGender = new JPanel();
        rightSideGender.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        rightSideGender.setLayout(new BoxLayout(rightSideGender,BoxLayout.Y_AXIS));

            //Gender ComboBox
            genderGroup = new ButtonGroup();
            genMale = new JRadioButton("Férfi");
            genderGroup.add(genMale);
            genFema = new JRadioButton("Nő");
            genderGroup.add(genFema);

        /* --- LEFT SIDE --- */

        rightSideBox.setBorder(BorderFactory.createLineBorder(Color.RED));


        /* ADD STUFF TO PANELS */
            /* RightSideBox */
            rightSideBox.add(rightSideAge);
            rightSideBox.add(rightSideGender);
                /*RIGHT SIDE PANELS*/
                rightSideGender.add(new JLabel("Nem:"));
                rightSideGender.add(genMale);
                rightSideGender.add(genFema);
                rightSideAge.add(new JLabel("Kor"));
                //rightSide.add(labelAge);
                rightSideAge.add(ageSpinner);
                /*LEFT SIDE PANEL*/

        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

Blue lineout应该只在JSpinner下面:

https://i.stack.imgur.com/xF5At.png

2 个答案:

答案 0 :(得分:0)

mainPanel布局设置为两列:

mainPanel = new JPanel(new GridLayout(0, 2));

您只需向mainPanel添加一个使用GridLayout

的面板
mainPanel.add(rightSideBox);

注意:您添加的第一个组件(在这种情况下为rightSideBox)将占据第一列,这意味着它将是LEFT之一。

要将rightSideGender添加到mainPanel,您需要:

mainPanel.add(rightSideGender);

您添加的第二个组件,在这种情况下rightSideGender将占用第二列,在这种情况下是右侧列。

答案 1 :(得分:0)

ageSpinner.setPreferredSize(new Dimension(40, 20));

首先,您不应手动设置组件的大小。每个Swing组件都负责确定自己的大小。

  

Blue lineout应该只在JSpinner下:

如果有可用空间,框布局会将组件的大小调整为最大大小。出于某种原因,JSpinner似乎没有最大高度,因此它会扩展以填充所有可用空间。

要解决此问题,您可以执行以下操作:

//ageSpinner.setPreferredSize(new Dimension(40, 20));
ageSpinner.setMaximumSize( ageSpinner.getPreferredSize() );