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 )