пространство java boxlayout после добавления jpanel

У меня есть контейнер jpanel, в котором я использовал менеджер boxlayout, и я добавляю другие панели внутри, в которых добавленная панель содержит метку и текстовое поле, используя менеджер потока. каждый раз, когда я добавляю панель внутри, она создает раздражающее большое пространство после другой добавленной панели. Я хочу уменьшить расстояние между панелями, которые я пробовал, используя методы setsize и setpreferredsize, чтобы настроить его. Вот мой код:

  JPanel global = new JPanel();
  global.setLayout(new BoxLayout(global, BoxLayout.Y_AXIS));
  global.setPreferredSize(new Dimension(500,312));
  global.setSize(500,312);
  global.setBounds(8, 5, 500, 312);
  global.setBorder(BorderFactory.createLineBorder(Color.black));
  global.setBackground(Color.white);
  //Elements of global

  JLabel label1 = new JLabel("Global Settings");
  label1.setAlignmentX(Component.CENTER_ALIGNMENT);
  label1.setFont(new Font("tahoma", Font.BOLD, 17));
  global.add(label1);
  global.add(new JSeparator());


  //Name Field
  JPanel c = new JPanel();
  c.setSize(100, 1);
  c.setPreferredSize(new Dimension(100,1));
  c.setLayout(new FlowLayout());
  JLabel label = new JLabel("Display Name");
  JTextField text = new JTextField(20);
  text.setPreferredSize(new Dimension(20,25));
  c.add(label);
  c.add(text);
  global.add(c);

  //Hostname Field
  JPanel c1 = new JPanel();
  c1.setSize(100, 1);
  c1.setPreferredSize(new Dimension(100,1));
  c1.setLayout(new FlowLayout());
  JLabel label2 = new JLabel("Host Name");
  JTextField text1 = new JTextField(20);
  text1.setPreferredSize(new Dimension(20,25));
  c1.add(label2);
  c1.add(text1);
  global.add(c1);

person Lore Jairus Camero    schedule 20.04.2013    source источник


Ответы (1)


BoxLayout довольно агрессивен LayoutManager и не всегда учитывает предпочтительный размер компонентов внутри него. Вместо этого мы должны установить максимальный размер BoxLayout компонентов, чтобы они не растягивались. Кроме того, нам нужно добавить Box через Box.createVerticalGlue() — это специальный компонент, который растягивается (а не другие компоненты).

Вот переписанный код:

    JPanel global = new JPanel();
    global.setLayout(new BoxLayout(global, BoxLayout.Y_AXIS));
    global.setPreferredSize(new Dimension(500, 312));
    global.setSize(500, 312);
    global.setBounds(8, 5, 500, 312);
    global.setBorder(BorderFactory.createLineBorder(Color.black));
    global.setBackground(Color.white);
    // Elements of global

    JLabel label1 = new JLabel("Global Settings");
    label1.setAlignmentX(Component.CENTER_ALIGNMENT);
    label1.setFont(new Font("tahoma", Font.BOLD, 17));
    global.add(label1);
    JSeparator sep = new JSeparator();
    sep.setMaximumSize(new Dimension((int) sep.getMaximumSize().getWidth(), 50));
    global.add(sep);

    // Name Field
    JPanel c = new JPanel();
    c.setMaximumSize(new Dimension((int) c.getMaximumSize().getWidth(), 50));
    JLabel label = new JLabel("Display Name");
    JTextField text = new JTextField(20);
    text.setPreferredSize(new Dimension(20, 25));
    c.add(label);
    c.add(text);
    global.add(c);

    // Hostname Field
    JPanel c1 = new JPanel();
    c1.setMaximumSize(new Dimension((int) c1.getMaximumSize().getWidth(), 50));
    JLabel label2 = new JLabel("Host Name");
    JTextField text1 = new JTextField(20);
    text1.setPreferredSize(new Dimension(20, 25));
    c1.add(label2);
    c1.add(text1);
    global.add(c1);
    global.add(Box.createVerticalGlue());
person Muel    schedule 20.04.2013
comment
Большое спасибо .. я думал, что вертикальный клей добавляется каждый элемент, добавленный в панель. - person Lore Jairus Camero; 20.04.2013
comment
Этот учебник может лучше объяснить, как работает BoxLayout клей: docs.oracle. com/javase/tutorial/uiswing/layout/box.html#filler - person Muel; 20.04.2013