Проблемы с макетом - Java

Я использую GridBagLayout в проекте, над которым я работал, проблема в том, что когда я компилирую на своем компьютере или на других компьютерах в моем универмаге, он правильно показывает, каким я хочу его видеть.

Правильный способ

Но когда я запускаю его на другом ПК, он отображается по-другому, верхняя левая панель и панель радара не такие, какими должны быть.

Неправильный путь

У нас обоих один и тот же JDK, и мы используем NetBeans 7.3, поэтому я не знаю, в чем проблема.

Это метод, который я использую для добавления панелей в раму.

private void agregarPaneles() {

    this.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(10, 10, 10, 10);
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    add(scrollerVuelos, gbc);
    gbc.gridx = 1;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    add(panelEstado, gbc);
    gbc.gridx = 2;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    add(panelOrdenes, gbc);
    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridwidth = 3;
    gbc.gridheight = 1;
    add(panelRadar, gbc);

}

person sandiego    schedule 20.10.2013    source источник


Ответы (2)


Код, который вы разместили, недостаточно, чтобы дать вам точный ответ, но в целом:

Если в GridBagLayout недостаточно места для отображения компонента с его предпочтительным размером, он будет использовать минимальный размер компонента. Поскольку многие компоненты имеют небольшой минимальный размер, компонент может уменьшиться почти до нуля.

Таким образом, вам может потребоваться установить минимальные размеры на ваших панелях. Вы также можете посмотреть значения weightX и weighty, поскольку они влияют на изменение размера компонента.

Прочтите руководство по Swing на How to Use GridBagLayout для получения дополнительной информации и примеров.

Также помните, что вы можете использовать вложенные панели с разными менеджерами компоновки, если это упрощает компоновку. Например, возможно, основным макетом должен быть BorderLayout. Затем на СЕВЕРЕ вы добавляете панель с помощью GridLayout. В ЦЕНТРЕ вы добавляете другую панель.

person camickr    schedule 20.10.2013
comment
Действительно, я установил минимальный размер, и он работал нормально, но я все еще не могу понять, почему он работал на некоторых компьютерах, а не на других с тем же jdk. - person sandiego; 21.10.2013
comment
@sandiego Поскольку разные компьютеры используют разные методы рендеринга, метрики шрифтов и другие элементы, которые вводят подходящие элементы в систему, именно поэтому вам всегда следует использовать менеджер по расположению;) - person MadProgrammer; 21.10.2013

Возможно, предпочтительный размер компонента не помещается в доступное пространство кадра, и GridBagLayout возвращается к использованию минимального размера компонента.

Вы можете использовать GridBagConstraints#weightx, GridBagConstraints#weighty и GridBagConstraints#fill = GridBagConstraints.BOTH, чтобы попытаться заставить компонент использовать все доступное пространство ячейки, в которой он находится.

Вы также должны использовать Frame#pack для упаковки кадра, а не устанавливать его размер вручную, это попытается изменить размер кадра, чтобы он мог соответствовать требованиям предпочтительного размера содержимого.

person MadProgrammer    schedule 20.10.2013