управление размером JPanels в соответствии с JFrame Resize

Я хочу иметь две панели Jpanel с изменяемым размером (jpanelDarkGray и jpanelLightGray) с точно таким же размером, разделенные другой панелью JPanel с изменяемым размером (jpanelMidSep), содержащейся в JFrame...

Начальная высота для jpanelDarkGray и jpanelLightGray равна 146, а для jpanelMidSep равна 8.

Иногда при изменении размера JFrame jpanelDarkGray имеет высоту больше jpanelLightGray на 1 единицу. Я хочу сделать это снова точно такого же размера, изменив высоту jpanelMidSep на 1 единицу (уменьшив высоту jpanelDarkGray на 1 единицу и увеличив высоту jpanelMidSep на 1 единицу).

Вот весь мой код:

package thePack;

import java.awt.Dimension;
import java.awt.Color;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.EventQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class JF_EqualSizeMovingPanels extends JFrame {

  private JPanel jpanelDarkGray;
  private JPanel jpanelLightGray;
  private JPanel jpanelMidSep;

  public JF_EqualSizeMovingPanels() {
    initComponents();
  }


  @SuppressWarnings("unchecked")
  private void initComponents() {

    jpanelDarkGray = new JPanel();
    jpanelMidSep = new JPanel();
    jpanelLightGray = new JPanel();

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    addComponentListener(new ComponentAdapter() {
      public void componentResized(ComponentEvent evt) {
        formComponentResized(evt);
      }
    });

    jpanelDarkGray.setBackground(new Color(96, 96, 96));

    GroupLayout jpanelDarkGrayLayout = new GroupLayout(jpanelDarkGray);
    jpanelDarkGray.setLayout(jpanelDarkGrayLayout);
    jpanelDarkGrayLayout.setHorizontalGroup(
      jpanelDarkGrayLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGap(0, 400, Short.MAX_VALUE)
    );
    jpanelDarkGrayLayout.setVerticalGroup(
      jpanelDarkGrayLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGap(0, 146, Short.MAX_VALUE)
    );

    jpanelMidSep.setBackground(new Color(128, 128, 128));

    GroupLayout jpanelMidSepLayout = new GroupLayout(jpanelMidSep);
    jpanelMidSep.setLayout(jpanelMidSepLayout);
    jpanelMidSepLayout.setHorizontalGroup(
      jpanelMidSepLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGap(0, 0, Short.MAX_VALUE)
    );
    jpanelMidSepLayout.setVerticalGroup(
      jpanelMidSepLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGap(0, 8, Short.MAX_VALUE)
    );

    jpanelLightGray.setBackground(new Color(160, 160, 160));

    GroupLayout jpanelLightGrayLayout = new GroupLayout(jpanelLightGray);
    jpanelLightGray.setLayout(jpanelLightGrayLayout);
    jpanelLightGrayLayout.setHorizontalGroup(
      jpanelLightGrayLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGap(0, 0, Short.MAX_VALUE)
    );
    jpanelLightGrayLayout.setVerticalGroup(
      jpanelLightGrayLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGap(0, 146, Short.MAX_VALUE)
    );

    GroupLayout layout = new GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
      layout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addComponent(jpanelDarkGray, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
      .addComponent(jpanelMidSep, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
      .addComponent(jpanelLightGray, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
      layout.createParallelGroup(GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
        .addComponent(jpanelDarkGray, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        .addGap(0, 0, 0)
        .addComponent(jpanelMidSep, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
        .addGap(0, 0, 0)
        .addComponent(jpanelLightGray, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );

    pack();
  }

  private void formComponentResized(java.awt.event.ComponentEvent evt) {
    System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    System.out.println(this.getName()+ " - Height:" + this.getHeight() 
        + ", Width:" + this.getWidth());
    System.out.println();
    System.out.println("jpanelDarkGray - Height:" + jpanelDarkGray.getHeight() 
        + ", Width:" + jpanelDarkGray.getWidth());
    System.out.println("jpanelMidSep - Height:" + jpanelMidSep.getHeight() 
        + ", Width:" + jpanelMidSep.getWidth());
    System.out.println("jpanelLightGray - Height:" + jpanelLightGray.getHeight()
        + ", Width:" + jpanelLightGray.getWidth());
    int adding = (jpanelDarkGray.getHeight() + jpanelMidSep.getHeight() + jpanelLightGray.getHeight());
    System.out.println("Adding:" + adding + ", diff:" + (this.getHeight() - adding));
    System.out.println("...........................................................");
    if (jpanelDarkGray.getHeight() != jpanelLightGray.getHeight()) {
      int diff;
      if (jpanelDarkGray.getHeight() > jpanelLightGray.getHeight()) {
        diff = jpanelDarkGray.getHeight() - jpanelLightGray.getHeight();
        jpanelDarkGray.setSize(jpanelDarkGray.getWidth(), jpanelLightGray.getHeight());
//        jpanelDarkGray.setPreferredSize(new Dimension(jpanelDarkGray.getWidth(), 
//            jpanelLightGray.getHeight()));
        jpanelMidSep.setSize(jpanelMidSep.getWidth(), jpanelMidSep.getHeight() + diff);
//        jpanelMidSep.setPreferredSize(new Dimension(jpanelMidSep.getWidth(), 
//            jpanelMidSep.getHeight() + diff));
      }
      if (jpanelLightGray.getHeight() > jpanelDarkGray.getHeight()) {
        diff = jpanelLightGray.getHeight() - jpanelDarkGray.getHeight();
        jpanelLightGray.setSize(jpanelLightGray.getWidth(), jpanelDarkGray.getHeight());
//        jpanelLightGray.setPreferredSize(new Dimension(jpanelLightGray.getWidth(), 
//            jpanelDarkGray.getHeight()));
        jpanelMidSep.setSize(jpanelMidSep.getWidth(), jpanelMidSep.getHeight() + diff);
        jpanelMidSep.setPreferredSize(new Dimension(jpanelMidSep.getWidth(), 
            jpanelMidSep.getHeight() + diff));
      }
    }
  }

  public static void main(String args[]) {
    try {
      for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
          UIManager.setLookAndFeel(info.getClassName());
          break;
        }
      }
    } catch (ClassNotFoundException | InstantiationException |
          IllegalAccessException | UnsupportedLookAndFeelException ex) {
      Logger.getLogger(JF_EqualSizeMovingPanels.class.getName()).log(Level.SEVERE, null, ex);
    }

    EventQueue.invokeLater(new Runnable() {
      public void run() {
        new JF_EqualSizeMovingPanels().setVisible(true);
      }
    });
  }
}

Но каждый раз, когда вы меняете размер JForm, высота jSepMid неконтролируемо растет (используя метод setPreferredSize) или цель (контролируемое изменение высоты) не достигается (используя метод setSize ).

Вывод с использованием метода setSize (когда высота JFrame нечетная, высоты jpanelDarkGray и jpanelLightGray я не мог сделать то же самое).

введите здесь описание изображения

run:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:338, Width:416

jpanelDarkGray - Height:146, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:146, Width:400
Adding:300, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:338, Width:416

jpanelDarkGray - Height:146, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:146, Width:400
Adding:300, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:354, Width:416

jpanelDarkGray - Height:154, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:154, Width:400
Adding:316, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:331, Width:416

jpanelDarkGray - Height:143, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:142, Width:400
Adding:293, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:331, Width:438

jpanelDarkGray - Height:143, Width:422
jpanelMidSep - Height:8, Width:422
jpanelLightGray - Height:142, Width:422
Adding:293, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:331, Width:457

jpanelDarkGray - Height:143, Width:441
jpanelMidSep - Height:8, Width:441
jpanelLightGray - Height:142, Width:441
Adding:293, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:322, Width:457

jpanelDarkGray - Height:138, Width:441
jpanelMidSep - Height:8, Width:441
jpanelLightGray - Height:138, Width:441
Adding:284, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:326, Width:457

jpanelDarkGray - Height:140, Width:441
jpanelMidSep - Height:8, Width:441
jpanelLightGray - Height:140, Width:441
Adding:288, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:311, Width:457

jpanelDarkGray - Height:133, Width:441
jpanelMidSep - Height:8, Width:441
jpanelLightGray - Height:132, Width:441
Adding:273, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:311, Width:439

jpanelDarkGray - Height:133, Width:423
jpanelMidSep - Height:8, Width:423
jpanelLightGray - Height:132, Width:423
Adding:273, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:311, Width:408

jpanelDarkGray - Height:133, Width:392
jpanelMidSep - Height:8, Width:392
jpanelLightGray - Height:132, Width:392
Adding:273, diff:38
...........................................................

Вывод с использованием метода setPreferredSize.

введите здесь описание изображения

run:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:338, Width:416

jpanelDarkGray - Height:146, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:146, Width:400
Adding:300, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:338, Width:416

jpanelDarkGray - Height:146, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:146, Width:400
Adding:300, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:342, Width:416

jpanelDarkGray - Height:148, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:148, Width:400
Adding:304, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:337, Width:416

jpanelDarkGray - Height:146, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:145, Width:400
Adding:299, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:337, Width:420

jpanelDarkGray - Height:145, Width:404
jpanelMidSep - Height:9, Width:404
jpanelLightGray - Height:145, Width:404
Adding:299, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:337, Width:442

jpanelDarkGray - Height:145, Width:426
jpanelMidSep - Height:9, Width:426
jpanelLightGray - Height:145, Width:426
Adding:299, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:337, Width:430

jpanelDarkGray - Height:145, Width:414
jpanelMidSep - Height:9, Width:414
jpanelLightGray - Height:145, Width:414
Adding:299, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:313, Width:430

jpanelDarkGray - Height:133, Width:414
jpanelMidSep - Height:9, Width:414
jpanelLightGray - Height:133, Width:414
Adding:275, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:317, Width:430

jpanelDarkGray - Height:135, Width:414
jpanelMidSep - Height:9, Width:414
jpanelLightGray - Height:135, Width:414
Adding:279, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:315, Width:430

jpanelDarkGray - Height:134, Width:414
jpanelMidSep - Height:9, Width:414
jpanelLightGray - Height:134, Width:414
Adding:277, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:317, Width:430

jpanelDarkGray - Height:135, Width:414
jpanelMidSep - Height:9, Width:414
jpanelLightGray - Height:135, Width:414
Adding:279, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:318, Width:430

jpanelDarkGray - Height:135, Width:414
jpanelMidSep - Height:9, Width:414
jpanelLightGray - Height:136, Width:414
Adding:280, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:318, Width:447

jpanelDarkGray - Height:140, Width:431
jpanelMidSep - Height:10, Width:431
jpanelLightGray - Height:130, Width:431
Adding:280, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:320, Width:447

jpanelDarkGray - Height:129, Width:431
jpanelMidSep - Height:20, Width:431
jpanelLightGray - Height:133, Width:431
Adding:282, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:322, Width:447

jpanelDarkGray - Height:130, Width:431
jpanelMidSep - Height:24, Width:431
jpanelLightGray - Height:130, Width:431
Adding:284, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:328, Width:447

jpanelDarkGray - Height:133, Width:431
jpanelMidSep - Height:24, Width:431
jpanelLightGray - Height:133, Width:431
Adding:290, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:328, Width:457

jpanelDarkGray - Height:133, Width:441
jpanelMidSep - Height:24, Width:441
jpanelLightGray - Height:133, Width:441
Adding:290, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:328, Width:401

jpanelDarkGray - Height:133, Width:385
jpanelMidSep - Height:24, Width:385
jpanelLightGray - Height:133, Width:385
Adding:290, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:328, Width:401

jpanelDarkGray - Height:133, Width:385
jpanelMidSep - Height:24, Width:385
jpanelLightGray - Height:133, Width:385
Adding:290, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:327, Width:401

jpanelDarkGray - Height:133, Width:385
jpanelMidSep - Height:24, Width:385
jpanelLightGray - Height:132, Width:385
Adding:289, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:327, Width:401

jpanelDarkGray - Height:133, Width:385
jpanelMidSep - Height:24, Width:385
jpanelLightGray - Height:132, Width:385
Adding:289, diff:38
...........................................................

Некоторые подсказки?

ИЗМЕНИТЬ 1

тестирование решения @chepe_lucho... у меня отлично работает!

run:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:338, Width:416

jpanelDarkGray - Height:146, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:146, Width:400
Adding:300, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:343, Width:416

jpanelDarkGray - Height:148, Width:400
jpanelMidSep - Height:8, Width:400
jpanelLightGray - Height:149, Width:400
Adding:305, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:343, Width:422

jpanelDarkGray - Height:148, Width:406
jpanelMidSep - Height:9, Width:406
jpanelLightGray - Height:148, Width:406
Adding:305, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:292, Width:422

jpanelDarkGray - Height:123, Width:406
jpanelMidSep - Height:9, Width:406
jpanelLightGray - Height:122, Width:406
Adding:254, diff:38
...........................................................
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
frame0 - Height:292, Width:460

jpanelDarkGray - Height:123, Width:444
jpanelMidSep - Height:8, Width:444
jpanelLightGray - Height:123, Width:444
Adding:254, diff:38
...........................................................

person QA_Col    schedule 17.04.2016    source источник
comment
Вы пытаетесь создать свою собственную разделенную панель, такую ​​​​как Swing Split Pane, где пользователь может изменить размеры панели или изменить код?   -  person DevilsHnd    schedule 17.04.2016
comment
Я хочу всегда иметь две панели одинакового размера (высота и ширина). Размер контейнера (в данном случае JFrame) можно свободно изменять, но размер jpanelDarkGray и jpanelLightGray не свободен, он контролируется.   -  person QA_Col    schedule 17.04.2016
comment
GridBagLayout имеет проблемы с округлением, которые иногда доходят до точки, когда необходимо решить, как лучше всего сохранить видимость всех компонентов в доступном пространстве.   -  person MadProgrammer    schedule 17.04.2016
comment
Привет, когда максимум frame0 нечетный (высокий уровень других панелей отличается), тогда максимум jpanelMidSep должен быть 9, когда максимум frame0 четный, тогда максимум других панелей равен, а максимум jpanelMidSep равен 8.   -  person QA_Col    schedule 18.04.2016


Ответы (2)


Вы должны протестировать этот код:

if (jpanelDarkGray.getHeight() != jpanelLightGray.getHeight()) {
  if (jpanelMidSep.getHeight() == 8) {
    jpanelMidSep.setPreferredSize(new Dimension(jpanelMidSep.getWidth(), 9));
  }
  if (jpanelMidSep.getHeight() == 9) {
    jpanelMidSep.setPreferredSize(new Dimension(jpanelMidSep.getWidth(), 8));
  }
}
person joseluisbz    schedule 18.04.2016

Вы можете использовать GridLayout для контейнера JFrame. Установите строки и столбцы. В вашем случае это будет 2 строки и 1 столбец. Макет сетки будет иметь одинаковую площадь для всех компонентов

jframe.setLayout(new GridLayout(2,1));

Попробуйте установить GridLayout в кадр и попробуйте изменить размер кадра. Он изменит размер панелей с одинаковой площадью. И не используйте setPreferedSize() для панелей.

person Robby Goz    schedule 17.04.2016
comment
Учитывая тот факт, что ОП хочет три параметра, два из которых имеют одинаковый размер, а третий (я полагаю, был переменным), GridLayout не поможет - person MadProgrammer; 17.04.2016