- PR -

swingのJEditorPanの自動スクロールについて

1
投稿者投稿内容
がう
会議室デビュー日: 2005/02/03
投稿数: 10
投稿日時: 2005-02-03 16:20
はじめまして。よろしくお願いいたします。

JEditorPanにスクロールバーを付加して、メッセージがセットされたら
文末までスクロールさせたいのですが、以下のように行った場合、
たまに途中までしかスクロールしない場合があります。
いい方法を知っている方がおりましたら教えてください。


JEditorPane jEditorPane = new JEditorPane();
JScrollPane jScrollPane = new JScrollPane(jEditorPane);
   ・
   ・
   ・
jEditorPane.setText(Message); //メッセージをセット
jEditorPane.setCaretPosition(jEditorPane.getDocument().getLength()); //末尾までスクロール
さたろう
会議室デビュー日: 2005/02/07
投稿数: 11
投稿日時: 2005-02-07 17:09
ども,いい方法かどうかはわかりませんが,回答いたします.

> JEditorPanにスクロールバーを付加して、メッセージがセットされたら
> 文末までスクロールさせたいのですが、以下のように行った場合、
> たまに途中までしかスクロールしない場合があります。

“たまに”と言うのは,もうすでにテキスト挿入キャレット(テキストの入力位置)が後方に行っているときではないでしょうか??
そのため,“setCaretPosition(jEditorPane.getDocument().getLength()); ”で最後尾に移動させようとしても,スクロールは移動しなかったのだと思います.

そこで,一度,テキスト挿入キャレットを最初に移動させて,その後に最後尾に移動させてはどうでしょうか?

つまり,,
jEditorPane.setCaretPosition(0);
jEditorPane.setCaretPosition(jEditorPane.getDocument().getLength());

とすることで,最後尾の方までスクロールしましたよ.

しかし,,,
昔,自分もJEditorPaneの最後尾へのスクロールをしたことがあるのですが,
そのときは,別の方法でしました.
確か,,,Threadを使ったような気がするのですが,覚えてません.プログラムを探してみたのですが見つかりませんでした...
もし,思い出したり,見つかったりしたら,また,書き込みますね.
でも,テキスト挿入キャレットの移動の方が単純でわかり易いため良いと思いますよ.
がう
会議室デビュー日: 2005/02/03
投稿数: 10
投稿日時: 2005-02-09 11:49
さたろうさま、回答ありがとうございました。

キャレットを最初に移動させて、その後に最後尾に移動さる方法は、とても有効でした。
メッセージが更新されるたびに最後尾までスクロールさせて表示したいので、
たまにスクロールしないと、かっこ悪かったのですが、かなり良くなりました。
ありがとうございます。

ただ、やはり100%確実にスクロールするというわけではないのと、
気にならない程度ですが画面の「ちらつき」が増してしまいます。
一度JEditorPaneにフォーカスを持っていけば、スクロールの成功率はあがりますが、
同じ画面上に入力欄もあり、ここからフォーカスを動かしたくありません。

さらに、Java5の環境で実行すると、Java1.4環境よりも最後尾までスクロールしない頻度が高くなってしまいます

さたろうさまが行った別の方法を思い出せましたら、ぜひ教えてください
引き続き、どなたか良い方法をご存知でしたら、よろしくお願いいたします。
さたろう
会議室デビュー日: 2005/02/07
投稿数: 11
投稿日時: 2005-02-10 17:18
ども,今度は別の方法で作ってみました.
試してみてください.

JScrollPaneからJScrollBarを取り出し,それを使ってスクロールをしてみました.
サンプルを載せておきます.
これを実行させると,JButtonとJEditorPaneが表示されます.ここで,ボタンを押すと文字がエディタに追加されるようになってますので,そのとき,スクロールバーが常に最後方に行けばOKですよね?

コード:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JEditorPaneTest extends JFrame implements ActionListener{
    
    JEditorPane jEditorPane;
    JScrollPane jScrollPane;
	
	public static void main(String[] args){
        JEditorPaneTest main = new JEditorPaneTest();
        main.init();
    }
	
    void init(){
        
        JFrame mainFrame = new JFrame();
        mainFrame.getContentPane().setLayout(new BorderLayout());
        
        JButton button = new JButton("button");
        button.addActionListener(this);
        
        
        mainFrame.getContentPane().add(button, BorderLayout.NORTH);
        
        jEditorPane = new JEditorPane(); 
        jScrollPane = new JScrollPane(jEditorPane); 
        mainFrame.getContentPane().add(jScrollPane, BorderLayout.CENTER);
        
        mainFrame.setBounds(0,0,500,200);
        mainFrame.setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e){
        String message = "test1\ntest2\ntest3\ntest4\ntest5\ntest6\ntest7\ntest8\ntest9\ntest10\n\n";
        jEditorPane.setText(jEditorPane.getText()+message);
        jScrollPane.getVerticalScrollBar().setValue(jScrollPane.getVerticalScrollBar().getMaximum());
        
        //jEditorPane.setCaretPosition(0);
        //jEditorPane.setCaretPosition(jEditorPane.getDocument().getLength());
    }
}



-----
引用:

ただ、やはり100%確実にスクロールするというわけではないのと、
気にならない程度ですが画面の「ちらつき」が増してしまいます。


前回,私が載せた方では,100%スクロールされましたし,「ちらつき」も無かったと思います.ちなみに,開発環境はJava5です.
今回,載せた方法で出来ない場合は,よろしければ,ソースコードを載せていただけませんか?
検討してみますよ.
がう
会議室デビュー日: 2005/02/03
投稿数: 10
投稿日時: 2005-02-14 13:02
さたろうさま、いつも回答をありがとうございます。
空き時間に少しずつ試しているため、お返事が遅くなってしまい申し訳ありません。

実はさたろうさまが2番目に教えてくださったことは、すでに試していました。
ただ少し違う点は、以下のようにHTMLを表示していることです。

コード:
JEditorPane jEditorPane = new JEditorPane("text/html","");
jEditorPane.setText(Message);



Messageの中身は、
<body>あいうえお<br>かきくけこ<br>
などのようにHTMLタグとなっています。
フォントサイズもさまざまで、場合によってはテーブル、画像なども表示されます。

2番目に教えていただいた、スクロールバーを直接操作するような方法をとっても、
スクロールはうまくいきませんでした...。
さたろうさまのコードを上記のように変更して実験しても、結果はやはり同じでした。
HTMLを使用せずテキストのみでなら100%スクロールするのですが...

今のところ、さたろうさまに最初に教えていただいた、
> キャレットを最初に移動→最後尾に移動
が、一番有効なようです。

現在いろいろ試しているところですので、また何か別の方法がありましたら、
どなたでも投稿をお願いいたします。

うまくいかなかったコードは以下のとおりです。

コード:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JEditorPaneTest extends JFrame implements ActionListener{
    
    JEditorPane jEditorPane;
    JScrollPane jScrollPane;
    private String msg = "";
	
	public static void main(String[] args){
        JEditorPaneTest main = new JEditorPaneTest();
        main.init();
    }
	
    void init(){
        
        JFrame mainFrame = new JFrame();
        mainFrame.getContentPane().setLayout(new BorderLayout());
        
        JButton button = new JButton("button");
        button.addActionListener(this);
        
        
        mainFrame.getContentPane().add(button, BorderLayout.NORTH);
        
        jEditorPane = new JEditorPane("text/html",""); 
        jScrollPane = new JScrollPane(jEditorPane); 
        mainFrame.getContentPane().add(jScrollPane, BorderLayout.CENTER);
        
        mainFrame.setBounds(0,0,500,200);
        mainFrame.setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e){
        String message = "あいうえお<br>かきくけこ<br><a href=\"file:img\neko.jpg\">img\neko.jpg</a><br><img src=\"file:img/neko.jpg\"><br><font size=+3 color=red>ほげほげほげほげ</font><br>";
        msg = msg + message;
        StringBuffer sb = new StringBuffer();
		sb.append("<head><style type=text/css><!--body {");
		sb.append("font-family:");
		sb.append("MS ゴシック");
		sb.append("; font-size:");
		sb.append("12");
		sb.append("pt;}--></style></head>");
		sb.append("<body>");
		sb.append(msg);
		sb.append("</body>");

		jEditorPane.setText(msg);
        jScrollPane.getVerticalScrollBar().setValue(jScrollPane.getVerticalScrollBar().getMaximum());

        //jEditorPane.setCaretPosition(0);
        //jEditorPane.setCaretPosition(jEditorPane.getDocument().getLength());
    }
}


さたろう
会議室デビュー日: 2005/02/07
投稿数: 11
投稿日時: 2005-02-15 11:18
うまく行かなかったというコードをそのままコンパイルして,実行して見たのですが,私が試した限りでは100%スクロールされましたよ.
コンパイル&実行の環境はJava1.5.0とJava1.4.2_03で,OSはWinXPです.どうやってもスクロールは最下方まで行きます.

うーむ...
実行環境によるのでしょうか??

うまく行かない状況にならないため,
私の方では,これ以上は検討のしようがないですね.
1

スキルアップ/キャリアアップ(JOB@IT)