我的相框占据了大部分 space 可用
My Frames take up most of the space availbe
所以我有一个问题,我必须做一个关于某事的问卷,我必须使用多个布局。
我的问题是,当我将 2 个 JPanel 添加到网格布局(仅添加到一侧)时,我的第一个面板占据了大部分 space。
代码:
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);
}
蓝色线条只能在 JSpinner 下:
mainPanel
布局设置为有两列:
mainPanel = new JPanel(new GridLayout(0, 2));
您只需将一个面板添加到 mainPanel
,它使用 GridLayout
:
mainPanel.add(rightSideBox);
注意:您添加的第一个组件,在本例中 rightSideBox
将占据第一列,这意味着它将是 LEFT 列。
要将 rightSideGender
添加到 mainPanel
,您需要:
mainPanel.add(rightSideGender);
您添加的第二个组件,在本例中 rightSideGender
将占据第二列,在本例中为右侧。
ageSpinner.setPreferredSize(new Dimension(40, 20));
首先,您不应该手动设置组件的大小。每个 Swing 组件负责确定自己的大小。
The Blue lineout should be only under the JSpinner:
如果 space 可用,框布局会将组件的大小调整为最大尺寸。由于某种原因,JSpinner 似乎没有最大高度,因此它会扩展以填充所有可用的 space.
要解决此问题,您可以执行以下操作:
//ageSpinner.setPreferredSize(new Dimension(40, 20));
ageSpinner.setMaximumSize( ageSpinner.getPreferredSize() );
所以我有一个问题,我必须做一个关于某事的问卷,我必须使用多个布局。
我的问题是,当我将 2 个 JPanel 添加到网格布局(仅添加到一侧)时,我的第一个面板占据了大部分 space。
代码:
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);
}
蓝色线条只能在 JSpinner 下:
mainPanel
布局设置为有两列:
mainPanel = new JPanel(new GridLayout(0, 2));
您只需将一个面板添加到 mainPanel
,它使用 GridLayout
:
mainPanel.add(rightSideBox);
注意:您添加的第一个组件,在本例中 rightSideBox
将占据第一列,这意味着它将是 LEFT 列。
要将 rightSideGender
添加到 mainPanel
,您需要:
mainPanel.add(rightSideGender);
您添加的第二个组件,在本例中 rightSideGender
将占据第二列,在本例中为右侧。
ageSpinner.setPreferredSize(new Dimension(40, 20));
首先,您不应该手动设置组件的大小。每个 Swing 组件负责确定自己的大小。
The Blue lineout should be only under the JSpinner:
如果 space 可用,框布局会将组件的大小调整为最大尺寸。由于某种原因,JSpinner 似乎没有最大高度,因此它会扩展以填充所有可用的 space.
要解决此问题,您可以执行以下操作:
//ageSpinner.setPreferredSize(new Dimension(40, 20));
ageSpinner.setMaximumSize( ageSpinner.getPreferredSize() );