Интересная проблема (и мне не слишком нравится смотреть на jpa, как я должен)
По сути, это не так уж много, что макет может сделать сам по себе: размер pref scrollPane отличается в зависимости от видимостигоризонтальная полоса прокрутки.Код клиента должен динамически сообщать менеджеру, что делать с подлежащей покрытию областью, IMO.Ниже приведен фрагмент кода для игры.
- он использует невидимый фиктивный компонент с фиксированным размером, возможно, видимой горизонтальной полосы прокрутки (да, Галс, я знаю, этот фиксированный размер должен динамически корректироваться для любых свойств, изменяющих высоту горизонтальной полосы прокрутки scrollPane: -)
- устанавливает компонент componentListener на горизонтальную полосу прокрутки scrollPane, корректирует режим скрытия манекена при изменении видимости и повторно проверяет содержащую панель.
Работает нормально для Win / Nimbus, естьглюк в металле, хотя (и, возможно, другие LAFs), которым требуется корректировка магического числа различий, чтобы поддерживать устойчивый макет
JTextArea area = new JTextArea("starting ", 1, 10);
JScrollPane areaScrollPane = new JScrollPane(area);
areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
Dimension dim = areaScrollPane.getPreferredSize();
areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// get the height diff with/out horizontal scrollbar
int diff = dim.height - areaScrollPane.getPreferredSize().height;
areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
LC lc = new LC().wrapAfter(2).debug(500);
final MigLayout layout = new MigLayout(lc);
final JPanel panel = new JPanel(layout);
panel.add(new JLabel("OneLineRow"));
panel.add(areaScrollPane);
// create and add an invisible filler
// note: metal needs magic adjust, dont know why
// diff -= 3;
final JComponent dummy = (JComponent) Box.createVerticalStrut(diff);
dummy.setVisible(false);
final String dummyConstraint = "span, hidemode ";
panel.add(dummy, dummyConstraint + "0");
// component listener which adjusts hidemode of filler on
// scrollpane's horizontal scrollbar showing/hiding
ComponentAdapter adapter = new ComponentAdapter() {
/**
* @inherited <p>
*/
@Override
public void componentShown(ComponentEvent e) {
layout.setComponentConstraints(dummy, dummyConstraint + "2");
panel.revalidate();
}
/**
* @inherited <p>
*/
@Override
public void componentHidden(ComponentEvent e) {
layout.setComponentConstraints(dummy, dummyConstraint + "0");
panel.revalidate();
}
};
areaScrollPane.getHorizontalScrollBar().addComponentListener(adapter);
panel.add(new JScrollPane(new JTable(20, 5)), "span");
showInFrame(panel, "one line textArea");
Обратная связь очень приветствуется, возможно, есть менее искусственный подход, который я пропустил