Исправить ширину JTextPane в GridBagLayout

У меня есть эта панель:

public class MyPanel extends JPanel {

    public MyPanel() {
        super();
        this.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        JTable leftTable = new JTable();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0.1;
        gbc.weighty = 1.0;
        add(leftTable, gbc);

        JTextPane textPane = new JTextPane();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 0.4;
        gbc.weighty = 1.0;
        add(textPane, gbc);

        JTable rightTable = new JTable();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 2;
        gbc.gridy = 0;
        gbc.weightx = 0.5;
        gbc.weighty = 1.0;
        add(rightTable, gbc);
    }
}

Затем, когда я ввожу некоторые символы в JTextPane, он автоматически изменяется. При 200 символах в одной строке (на текстовой панели) 2 JTable больше не видны.

Как я могу исправить ширину моего JTextPane?

Спасибо.


person Marc de Verdelhan    schedule 20.08.2012    source источник
comment
Веса в GBL будут использоваться только для оставшегося места. Если вы не переопределите поведение, JTextPane запросит достаточно места для отображения всего текста внутри него, поэтому веса учитываются только после отображения всего текста. Прилично ли ведет себя макет, если у JTable тоже есть содержимое? Как вы хотите, чтобы макет вел себя? Вы можете использовать setPreferredSize в JTextPane, чтобы "исправить" размер, но этого следует избегать, если это возможно.   -  person Jacob Raihle    schedule 20.08.2012


Ответы (2)


Просто используйте gbc.fill = GridBagConstraints.NONE; для JTextPane

person nIcE cOw    schedule 20.08.2012
comment
@StanislavL Сделал это: gbc.fill = GridBagConstraints.VERTICAL; gbc.weightx = 0.0; но размер моей JTextPane все еще изменяется, когда я печатаю. И я до сих пор не знаю, как исправить ее ширину. - person Marc de Verdelhan; 20.08.2012
comment
@MarcdeVerdelhan: Тогда сделайте одно: добавьте свой JTextPane к JScrollPane и поместите этот JScrollPane вместе с JTable. - person nIcE cOw; 20.08.2012
comment
Эрф. Я не могу этого сделать. MyPanel уже находится в компоненте JScrollPane. Я хочу, чтобы эти 3 компонента (2 jtables и jscrollpane) были синхронизированы, поэтому я не могу использовать независимый компонент для JTextPane. - person Marc de Verdelhan; 20.08.2012
comment
Можете ли вы предоставить какой-то фрагмент кода о том, как вы планируете это сделать? Это может помочь. Что, если вместо GridBagLayout вы используете GridLayout и поместите три внутри JScrollPane ? Разве это не поможет, поскольку все три будут иметь одинаковые размеры? - person nIcE cOw; 20.08.2012

Наконец, я использовал FormLayout из JGoodies.

private void initItemsPanel() {
    JPanel itemsPanel = new JPanel();
    itemsPanel.setLayout(new FormLayout("left:pref, fill:400px, pref:grow", "fill:20px, fill:4px, fill:max(20px;pref)"));
    CellConstraints cc = new CellConstraints();

    // the left table
    JTable leftTable = new JTable();
    itemsPanel.add(leftTable.getTableHeader(), cc.xywh(1, 1, 1, 2));
    itemsPanel.add(leftTable, cc.xywh(1, 3, 1, 1));

    // the text pane
    itemsPanel.add(new JTextPane(), cc.xywh(2, 2, 1, 2));

    // the right table
    JTable rightTable = new JTable();
    rightTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    itemsPanel.add(rightTable.getTableHeader(), cc.xywh(3, 1, 1, 2));
    itemsPanel.add(rightTable, cc.xywh(3, 3, 1, 1));

    // Adding the items panel to dialog panel
    JScrollPane itemsScrollPane = new JScrollPane(itemsPanel);
    itemsScrollPane.getVerticalScrollBar().setUnitIncrement(3);

    dialogPanel.add(itemsScrollPane, BorderLayout.CENTER); // with dialogPanel previously instantiated
}

Для всех ситуаций, которые я тестировал (изменение размера, пустые/заполненные компоненты и т. д.), это было более предсказуемо.

Обратите внимание, что вы должны вызывать getTableHeader() явно, потому что JTables не находятся непосредственно в JScrollPane.

Спасибо.

person Marc de Verdelhan    schedule 05.09.2012
comment
Рад узнать, что вы как-то разобрались с этим +1 за это :-) - person nIcE cOw; 23.09.2012