サイズ変更可能な列を使用してJScrollPane内にJTableを作成する必要があります(ユーザーが列幅を増やすと、水平スクロールバーが表示されます)。このために私は使用していますtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
。また、ビューポートがテーブル全体を含むのに十分な幅である場合、列はビューポートの幅を満たすように引き伸ばされる必要があります。これを実現するためにgetScrollableTracksViewportWidth()
、次のようにJTableクラスのオーバーライドメソッドを使用します。
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
このアプローチは、1つのことを除いて、うまく機能します。最初に列のサイズを変更しようとすると、開始位置に独自の幅が返されます。列のサイズをすばやく変更してマウステーブルを離すと、引き続き正常に機能します。それで、そのような行動の理由は何ですか?getScrollableTracksViewportWidth()
falseを返してもテーブルのサイズを変更しようとするのはなぜですか?または、おそらく、そのようなサイズ変更モードを実装するためのより良いソリューションを提案できますか?
以下は、上記の問題の簡単な実例です。
import javax.swing.*;
public class TestTable {
private static Object[][] data = new Object[][] {
{ "a", "b", "c" },
{ "d", "e", "f" }
};
private static Object[] colNames = new Object[] { "1", "2", "3" };
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JTable table = new JTable(data, colNames) {
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width < getParent().getWidth();
}
};
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
});
}
}