Неверное поведение GridBagLayout - PullRequest
0 голосов
/ 04 июля 2011

Когда я изменяю размер JFrame, таблица (или точнее scrollPane) сжимается в маленький прямоугольник (с неизменным, но высота больше как 5-10 пикселей).

Также я заметил, что есть определенный порог высоты JFrame, и когда высота JFrame падает ниже этого значения, все GridBagLayouts ведут себя правильно (например, правильная ширина и высота всех панелей). Когда высота выше этого порога, обе правые панели приобретают дополнительную ширину, и rightTopPanel теряет свою высоту намного быстрее, чем rightBottomPanel при уменьшении высоты JFrame.

Порог, кажется, является точкой, когда rightTopPanel получает минимальную высоту (около 5-10 пикселей).

JPanel panel = new JPanel(new GridBagLayout());

JPanel rightTopPanel = new JPanel(new GridBagLayout());
panel.add(rightTopPanel, Helper.createGridBagConstraints(1, 0, 1, 1, 0.5, 0.5, GridBagConstraints.BOTH));

JPanel rightBottomPanel = new JPanel(new GridLayout(1, 1));

tableModel = new DefaultTableModel(0, 2);
JTable table = new JTable(tableModel);

JScrollPane scrollPane = new JScrollPane(table);
rightBottomPanel.add(scrollPane);

panel.add(rightBottomPanel, Helper.createGridBagConstraints(1, 1, 1, 1, 0.5, 0.5, GridBagConstraints.BOTH));

JPanel leftPanel = new JPanel();
panel.add(leftPanel, Helper.createGridBagConstraints(0, 0, 1, 2, 0.5, 1.0));

add(panel);

Helper.createGridBagConstraints - это просто вспомогательный метод для создания GridBagConstraints с многочисленными «необязательными» параметрами.

GridBagConstraints createGridBagConstraints(int gridx, int gridy)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int fill)

Редактировать: Кажется, что это проблема в JScrollPane. Если я не добавлю его, остальные панели изменят размер правильно.

Редактировать 2: Поскольку до сих пор никто не понимает, в чем моя проблема, вот скриншоты: http://img155.imageshack.us/img155/8847/badgridbaglayout1.png

http://img17.imageshack.us/img17/8779/badgridbaglayout2.png

http://img28.imageshack.us/img28/9336/badgridbaglayout3.png

Ответы [ 4 ]

3 голосов
/ 04 июля 2011

таблица (или, точнее, scrollPane) сжимается в маленький прямоугольник (с неизменным, но высота больше как 5-10 пикселей).

A GridBagLayoutбудет пытаться нарисовать компоненты в их предпочтительном размере.Когда рамка сжимается, компонент будет окрашен в «минимальный размер».Поэтому иногда компонент имеет минимальный размер 0, он будет отображаться только в виде небольшого прямоугольника.

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

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

Если у вас все еще есть проблемы, то опубликуйте свой SSCCE , который демонстрирует проблему.

1 голос
/ 07 июля 2011

Единственное решение - НЕ использовать какой-либо макет вообще и размещать / изменять размеры компонентов вручную, поскольку none встроенных макетов в Swing реализованы правильно.

1 голос
/ 04 июля 2011

Я создал эту программу -

package pkg;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TestFrame extends JFrame {
    public TestFrame() {
        JPanel panel = new JPanel(new GridBagLayout());

        JPanel rightTopPanel = new JPanel(new GridBagLayout());
        panel.add(rightTopPanel, new GridBagConstraints(1, 0, 1, 1, 0.5, 0.5, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        JPanel rightBottomPanel = new JPanel(new GridLayout(1, 1));

        DefaultTableModel tableModel = new DefaultTableModel(0, 2);
        JTable table = new JTable(tableModel);

        JScrollPane scrollPane = new JScrollPane(table);
        rightBottomPanel.add(scrollPane);

        panel.add(rightBottomPanel, new GridBagConstraints(1, 1, 1, 1, 0.5, 0.5, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        JPanel leftPanel = new JPanel();
        panel.add(leftPanel, new GridBagConstraints(0, 0, 1, 2, 0.5, 1.0, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        add(panel);
        setSize(800, 600);
        setVisible(true);
    }

    public static void main(String[] args) {
        new TestFrame();
    }
}

, и она, кажется, работает хорошо.Что вы помещаете в ваши методы Help.createGridBagConstraints ().Похоже, что там может быть проблема.

1 голос
/ 04 июля 2011

TRy для указания значений ipadx и ipady для GridBagConstraints.

...