Weighty не работает в GridBagLayout

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

Выше я хочу достичь:

  1. на востоке от JFrame находится фиксированная ширина 400 JPanel.
  2. панель использует GridBagLayout.
  3. компоненты на этой панели все растягиваются по горизонтали
  4. последний компонент заполняет дополнительное пространство y
  5. последний компонент — это JscrollPane, обертывающий JTable.

У меня было много испытаний, все потерпели неудачу:

  1. Я попытался установить PreferredSize панели, тогда внутренние компоненты не будут растягиваться по горизонтали. (Я знаю, как использовать GridBagConstraints, или мне кажется, что я знаю)
  2. Я попытался установить размер панели, тогда размер фактически определяется JscrollPane.
  3. Я пытался деформировать JscrollPane в другой JPanel (потому что я не очень доверяю JScrollPane), бесполезно.
  4. GridBagContraints.weighty никогда не работает в этом проекте, но хорошо работает в других местах.

Так что я думаю, что проблема с JTable, он всегда делает прокси. 300*300 прямоугольников, как показано красной линией. введите здесь описание изображения

Сегодня еще один плохой день с setPreferredSize и setSize в Swing и всеми этими проблемами с размером. Надеюсь, кто-нибудь может помочь, спасибо!

    private JPanel buildInfoPanel() {
        JPanel panel = new JPanel();
        panel.setVisible(false);

        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.HORIZONTAL;
        constraints.gridx = 0;
        panel.setLayout(gbl);

        label_player = new JLabel("label_player");
        label_player.setBackground(Color.RED);
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.NORTH;
        gbl.setConstraints(label_player, constraints);
        panel.add(label_player);

        label_deck = new JLabel("label_deck");
        label_deck.setBackground(Color.BLUE);
        constraints.gridy++;
        gbl.setConstraints(label_deck, constraints);
        panel.add(label_deck);

        JTable table = new JTable(new ShipTableModel());
        table.setAutoCreateRowSorter(true);
        table.setFillsViewportHeight(true);
        table.getRowSorter().toggleSortOrder(2);

        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBorder(new LineBorder(Color.red));
        constraints.gridy++;
        constraints.weighty = 1;
        gbl.setConstraints(scrollPane, constraints);
        panel.add(scrollPane);
        return panel;
    }

    class ShipTableModel extends AbstractTableModel {

        private Ship[] ships = new Ship[0];
        private String[] columnNames = {"id", "name", "lv", "hp", "舰队", "舰种", "mId"};

        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public int getRowCount() { 
            return ships.length; 
        }

        @Override
        public int getColumnCount() { 
            return columnNames.length; 
        }
    }

person bijiDango    schedule 27.04.2015    source источник
comment
Не могли бы вы опубликовать свой текущий код? Лучшая попытка, которую вы достигли.   -  person StanislavL    schedule 27.04.2015
comment
На самом деле все, что вам нужно, это вызвать setPreferredSize для области прокрутки, содержащей JTable, и установить weighty, и установить fill = BOTH.   -  person StanislavL    schedule 27.04.2015


Ответы (1)


Просто установите constraints.fill = GridBagConstraints.VERTICAL для JScrollPane.

person nitegazer2003    schedule 27.04.2015