興味深い問題です(そして、私はjpaを調べることにあまり熱心ではありませんでした)
基本的に、レイアウトがそれ自体でできることはあまりありません。scrollPane の優先サイズは、水平 scrollBar の可視性によって異なります。カバーされる領域である IMO をどう処理するかをマネージャーに動的に伝えるのは、クライアント コード次第です。以下は、遊ぶためのコードスニペットです。
- 目に見える可能性のある水平スクロールバーの固定サイズを持つ非表示のダミーコンポーネントを使用します(ええ、ギャル、私は知っています、スクロールペインの水平スクロールバーのプロパティを変更する高さに合わせて固定サイズを動的に調整する必要があります:-)
- scrollPane の水平スクロールバーに componentListener をインストールし、可視性の変更時にダミーの hidemode を調整し、含まれているパネルを再検証します。
Win/Nimbus では問題なく動作しますが、Metal (およびおそらく他の LAF) にはグリッチがあり、レイアウトを安定させるために差分のマジック ナンバーを調整する必要があります
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");
フィードバックは大歓迎です。私が見落としていた人工的でないアプローチがあるかもしれません