Проблемы с JTable и GridBagLayout

Я пытаюсь настроить панель, которая будет содержать две разные таблицы, одна из которых составляет 1/3 ширины окна, а другая - 2/3 ширины окна. Вот демонстрационный код, который я тестировал:

import java.awt.*;
import javax.swing.*;

public class TableTest {
  public static void main(String[] args)
  {
    JFrame frame = new JFrame("Test Frame");
    frame.setTitle("Logged In");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1000, 800);
    frame.setLocationRelativeTo(null);

    JPanel tablePanel = new JPanel(new GridBagLayout());
    GridBagConstraints setup = new GridBagConstraints();

    JTable table1 = new JTable();
    table1.setFillsViewportHeight(true);
    setup.fill = GridBagConstraints.BOTH;
    setup.weightx = 0.5;
    setup.weighty = 1;
    setup.gridx = 0;
    setup.insets = new Insets(10,10,10,5);
    tablePanel.add(new JScrollPane(table1), setup);

    JTable table2 = new JTable();
    table2.setFillsViewportHeight(true);
    setup.fill = GridBagConstraints.BOTH;
    setup.weightx = 1;
    setup.weighty = 1;
    setup.gridx = 1;
    setup.insets = new Insets(10,5,10,10);
    tablePanel.add(new JScrollPane(table2), setup);

    frame.add(tablePanel);
    frame.pack();
    frame.setVisible(true);
  }
}

Если я использую JTextArea вместо JTable, я получаю правильный макет, две области, одна из которых составляет 1/3 ширины окна, а другая - 2/3 ширины. Когда я использую JTable, я получаю две области, каждая из которых составляет 1/2 ширины окна.

Некоторые из вещей, которые я пробовал:

  1. Установка ширины сетки на 1 и 2 соответственно
  2. Установка заливки по ВЕРТИКАЛИ
  3. Изменение весаx

После каждого изменения я все еще получаю две таблицы одинакового размера внутри окна.

Вещи, которые я не пробовал:
1. Новый макет. Я работаю с Swing около недели, поэтому, возможно, есть макет, отличный от GridBagLayout, который решает эту проблему, но моя относительная неопытность затрудняет его определение.

Кажется, что JScrollPane игнорирует мою настройку при использовании JTable, но я не уверен, правда ли это, и если да, то почему. Любая помощь в этом вопросе будет принята с благодарностью.

Вот изображение того, как я хочу, чтобы макет выглядел: Пример макета

ОБНОВЛЕНИЕ
После дальнейшего тестирования выяснилось, что проблема заключается в ширине окна. Если вы перетащите ширину окна ниже ~ 950, вы заметите, что макет «привязывается» к правильным пропорциям. Возможно, это намекает на виновного. Я не уверен, действует ли GridBagLayout по-разному при разной ширине окна, но я предположил, что он масштабируется одинаково при всех размерах, и это основная причина, по которой я его использовал.


person RocketSCI3NCE    schedule 21.11.2015    source источник
comment
1) Чтобы быстрее получить помощь, опубликуйте минимально воспроизводимый пример или Короткий, автономный, правильный пример. (Включите импорт кода и убедитесь, что он будет компилироваться и работать для других как есть.) 2) Предоставьте ASCII-графику или простой рисунок предполагаемого макета графического интерфейса в минимальном размере и, если размер можно изменить, с больше ширины и высоты.   -  person Andrew Thompson    schedule 21.11.2015
comment
frame.add(tablePanel); frame.setVisible(true); Всегда должен быть frame.pack() после добавления последнего компонента и перед установкой видимого фрейма. Сомневаюсь, что именно здесь проблема, но убедитесь, что это сделано, чтобы устранить все сомнения.   -  person Andrew Thompson    schedule 21.11.2015
comment
@AndrewThompson Спасибо, я обновил код с помощью импорта и добавил frame.pack(). Я не использовал пакет, потому что он портил размер моего окна. Кроме того, как вы и ожидали, функция pack() не изменила размер двух таблиц.   -  person RocketSCI3NCE    schedule 21.11.2015


Ответы (1)


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

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

Поэтому, если вы всегда хотите, чтобы таблицы были в соотношении 1/3, 2/3, вам нужно установить размер таблиц в этом начальном соотношении. Например:

JTable table1 = new JTable()
{
    @Override
    public Dimension getPreferredScrollableViewportSize()
    {
        return new Dimension(100, 100);
    }
};

...

JTable table2 = new JTable()
{
    @Override
    public Dimension getPreferredScrollableViewportSize()
    {
        return new Dimension(200, 100);
    }
};

Другой вариант — использовать относительный макет. Он был разработан, чтобы всегда отображать компоненты в их относительных размерах:

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS);
rl.setGap(10);
JPanel panel = new JPanel( rl );
panel.add(new JScrollPane(table1), new Float(1));
panel.add(new JScrollPane(table2), new Float(2));
person camickr    schedule 21.11.2015
comment
Установка начального соотношения решила проблему. Спасибо вам за помощь. Я проверю Relative Layout, так как это кажется лучшим решением. - person RocketSCI3NCE; 21.11.2015