• ベストアンサー

JScrollPaneの細かい設定について

JScrollPaneのViewPortにJTextAreaを追加したとします。 JScrollPane pane_txt = new JScrollPane(); JTextArea txt = new JTextArea(); pane_txt.setViewportView(txt); このテキストに次々と文字列が追加された場合、作成されるScrollバーがそれについてくる(カレントな行が必ずView内に表示される)ようにするにはどうすればよいのでしょうか? また、その逆(ついてこさせない)をするにはどうすればよいのでしょうか? アドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • lawson
  • ベストアンサー率44% (29/65)
回答No.1

以下のソースの javax.swing.JScrollBar jcrollbar = test._pane_txt.getVerticalScrollBar(); jcrollbar.setValue(jcrollbar.getMaximum()); 部分が該当個所です。 >(カレントな行が必ずView内に表示される)ようにするにはどうすればよいのでしょうか? boolean flag = true; フラグをたてて実行してください。 >また、その逆(ついてこさせない)をするにはどうすればよいのでしょうか? boolean flag = false; フラグをたおして実行してください。 これただ、なんの対応もしないだけです。 ####################### #↓以下ソースリスト ####################### import javax.swing.*; import java.awt.event.*; import java.awt.*; public class ScrollBarJ extends JFrame{ JScrollPane _pane_txt; JTextArea _txt; public static void main(String[] args){ /* 自分自身を作成 */ ScrollBarJ test = new ScrollBarJ("Swing Test"); /* 終了処理を追加 */ test.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){System.exit(0);} }); test.setVisible(true); boolean flag = true; //boolean flag = false; int i = 0; while(true) { try { Thread.currentThread().sleep(1000); } catch(InterruptedException e) { } test._txt.append("add[" + i++ + "]\n"); if(flag) { javax.swing.JScrollBar jcrollbar = test._pane_txt.getVerticalScrollBar(); jcrollbar.setValue(jcrollbar.getMaximum()); } } } ScrollBarJ(String title){ setTitle(title); this.setResizable(false); try{ //UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); SwingUtilities.updateComponentTreeUI(this); }catch(Exception ex){ System.out.println("Error L&F Setting"); } JScrollPane pane_txt = new JScrollPane(); JTextArea txt = new JTextArea("", 10, 10); _pane_txt = pane_txt; _txt = txt; pane_txt.setViewportView(txt); //pane_txt.setLayout(new FlowLayout()); getContentPane().setLayout(new FlowLayout()); getContentPane().add(pane_txt); this.pack(); } }

renann
質問者

お礼

ありがとうございました。 javax.swing.JScrollBar jcrollbar = test._pane_txt.getVerticalScrollBar(); jcrollbar.setValue(jcrollbar.getMaximum()); を一回だけでは若干ついてこないので、FOR文で3~4回まわすことで完璧についてくるようになりました。 でもやっぱり少し泥臭いのは否めませんね。。ポリシーの設定等でドンピシャなものが必ずあると思ったのですが。。。

その他の回答 (1)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

以前に、同じようなことをした記憶がおります。 確か、JTextArea#appendではスクロールはしなかったと思います。 (デフォルト動作) そのとき行った手は、キャレットを表示させる位置に動かして、 勝手にスクロールさせたと記憶しています。 もっと細かくスクロール制御するには、JViewportを操作すれば出来たと思います。

関連するQ&A