Java JScrollPaneで自動的に一番下まで移動する
地味にハマったので、メモ。
やりたかったのはただ、JScrollPaneを設定したJListにJTextFieldに入力した文字をJButtonを押して追加することなのですが、このときに要素数がJListの幅を超えてスクロールが必要になる状態までいくと、新しくJListModel.addした要素が、自分でスクロールしないと見られないという問題が発生。
本来ならばJButtonのActionListener内で
JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
scrollBar.setValue(scrollBar.getMaximum());
とでもすれば勝手に下までスクロールしてくれそうなものですが、これがうまく行かなかった。
結局、どうすればいいかというと、
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
scrollBar.setValue(scrollBar.getMaximum());
}
});
とする必要があった。
つまり、そのまま書くだけではなぜか、JListModel.addより先にJScrollBar.setValueが呼び出されてしまうのです。
へえ。
<参考サイト>
・JScrollBar problems( http://objectmix.com/java/73776-jscrollbar-problems.html )