Как изменить размер JTable, как это делает Windows?

Я делаю приложение в eclipse с помощью swing и jfreechart, и у меня есть следующая проблема:

Скриншот

Как вы можете видеть на скриншоте, у меня есть рамка с несколькими компонентами. Проблема заключается в JTable, который всегда имеет один и тот же размер, независимо от того, изменяю ли я размер окна. Я хочу, чтобы размер таблицы изменялся так же, как и другие компоненты, например ChartPanel справа, и я не знаю, как это сделать. ContentPane имеет BorderLayout с тремя панелями:

  • ScrollPane для JTable (ЗАПАД)
  • Панель диаграммы (ЦЕНТР)
  • Панель для кнопок (ЮГ)

Код для создания JTable таков:

private JTable getTasksTable() {
    if (tasksTable == null) {
        tasksTable = new JTable(new DefaultTableModel(new Object[] { "ID", "Duration", "Due-Date" }, 0) {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }

        });

        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
        for (int i = 0; i < tasksTable.getColumnModel().getColumnCount(); i++) {
            tasksTable.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);
        }

        tasksTable.getTableHeader().setDefaultRenderer(centerRenderer);
        tasksTable.getTableHeader().setBorder(new LineBorder(new Color(0, 0, 0)));

        tasksTable.setBorder(new LineBorder(new Color(0, 0, 0)));
        tasksTable.setFillsViewportHeight(true);
    }
    return tasksTable;
}

person novayhulk14    schedule 06.03.2019    source источник
comment
Попробуйте GridLayout или BoxLayout держать таблицу и диаграмму в CENTER.   -  person trashgod    schedule 06.03.2019
comment
Я пробовал оба, и они работают лучше, чем то, что у меня было раньше, но проблема в том, что размер таблицы не изменяется. Также, когда я максимизирую окно, на панели таблицы есть пустое место, и я хочу, чтобы таблица соответствовала всей панели.   -  person novayhulk14    schedule 06.03.2019
comment
У вас может быть вложенный JPanel со своим значением по умолчанию FlowLayout в иерархии; ваш фрагмент показывает таблицу, но не вложенный макет; пожалуйста, отредактируйте свой вопрос, включив в него минимально воспроизводимый пример, демонстрирующий ваш пересмотренный подход.   -  person trashgod    schedule 06.03.2019
comment
Единственный FlowLayout, который у меня есть, находится на панели с кнопками. Больше нет. JTable находится в JScrollPane, и я не могу изменить его макет.   -  person novayhulk14    schedule 06.03.2019
comment
Я не могу изменить макет этого. Хорошо, как угодно. Вы можете опубликовать MCVE. Сделай это.   -  person Andrew Thompson    schedule 06.03.2019


Ответы (1)


ScrollPane для JTable (ЗАПАД), ChartPanel (ЦЕНТР), Панель для кнопок (ЮГ)

Итак, вот как работает BorderLayout:

  1. компоненты в WEST/EAST имеют размер по предпочтительной ширине компонента.
  2. Компонент в ЦЕНТРЕ получает оставшуюся ширину.

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

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

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

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

person camickr    schedule 06.03.2019