1

私はテキスト エディターで作業しています。メイン パネルは 3 つJTextPaneの s で構成され、2 つは行数と一般的な構文エラーを表示する側にあり、1 つはメイン エディションの中央にあります。全体が に詰め込まれていJScrollPaneます。

自動スクロールの問題は、ユーザーが行をジャンプする (ENTER キーを押す) ときに表示されます。KeyListener添付の​​ s は、両側に新しいエントリを追加しJTextPaneます (行の num および構文エラー)。反応JScrollPaneとして、ドキュメントの下部にある自動スクロール、おそらく両側に挿入された新しいテキストを表示しますJTextPane

JScrollBars の新しい行 (ユーザーが追加) ごとに の位置を設定することで、問題を部分的に修正しますKeyListener。たとえば、scrollRectToVisible を使用するか、2 つの側面JTextPaneのいずれかでテキストの適切な部分を選択することにより、より適切に使用できます。

ただし、最終的な効果はそれほど大きくありません。新しい行ごとに垂直スクロールバーが振動し、Enter キーを数秒間押すと、アプリを簡単にクラッシュさせることができます。JScrollPane クラスの多くのメソッドを使用して解決策を探していましたAdjustmentListenerが、うまくいきませんでした。手伝ってくれませんか?

PS: 私の英語で申し訳ありません。私はフランス人です。私たちのフォーラムは最低です。

4

1 に答える 1

0

SSCCE は素晴らしいインスピレーションの源です。これはうまく機能したため (実行時に問題を確認できませんでした)、私の方法は実際には機能しているように見えますが、実際のコードでは適切なリスナーで実行されていませんでした。

とにかくありがとう!SSCCE があります。これは、編集用の 1 つの中央 JTextPane と行番号用の 1 つの側面から構成される単純な JScrollPane です。placeScroll() メソッドは、メイン JTextPane のキャレットが、paneLigne がスクロールバーを下に押し込もうとしたときに中央 (垂直方向) にくるようにスクロールバーを配置します。

さよなら

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;

public class SSCCE extends JFrame {

    private JTextPane paneLigne, main;
    private String tempchain;

    public SSCCE() {

        this.setSize(500,500);
        this.setTitle("S");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        paneLigne = new JTextPane();
        paneLigne.setEditable(false);

        tempchain = "";
        for(int j=1; j<40; j++)
            tempchain+="  " + j + "  \n";
        paneLigne.setText(tempchain);


        main = new JTextPane();
        main.addKeyListener(new KeyListener() {

            private int lastnline=0;
            public void keyPressed(KeyEvent arg0) {

                if(arg0.getKeyCode()==10) {

                    String tecste=main.getText();
                    int n=nbLignes(tecste);

                    if(n>38) {
                        if(lastnline<n) {
                            paneLigne.setText(paneLigne.getText()+"  " + (n+1) + "  \n");
                        } else {
                            this.retablirLignes(tecste);
                        }
                    } else {
                        paneLigne.setText(tempchain);
                    }

                    lastnline=n;
                    this.placeScroll();
                }

            }

            @Override
            public void keyReleased(KeyEvent arg0) {    }

            @Override
            public void keyTyped(KeyEvent arg0) {   }



            private int nbLignes(String str) {
                int ret=1;
                for(int n=0, cpt=0; (n=str.indexOf('\n', cpt))!=-1; cpt=n+1)
                    ret++;
                return ret;
            }

            public void retablirLignes(String stret) {

                int n=this.nbLignes(stret);
                String retoure="";

                if(n>=40) {

                    for(int j=1; j<n+2; j++)
                        retoure+="  " + j + "  \n";
                    paneLigne.setText(retoure);

                }
                lastnline=n;
            }

            public void placeScroll() { 
            // TODO Auto-generated method stub

                if(paneLigne!=null) {

                    int n=this.nbLignesBuen(main.getText().substring(0, main.getCaretPosition()));
                    if(n!=-1) {
                        paneLigne.select(paneLigne.getText().indexOf(""+n), n+1);
                    } else {
                        paneLigne.select(0,1);
                    }

                }

            }

            private int nbLignesBuen(String str) { //return the index of the last 20th line
                int ret=0;
                for(int n, cpt=0; (n=str.indexOf('\n', cpt))!=-1; cpt=n+1)
                    ret++;
                if(ret>20)
                    ret-=20;
                else
                    ret=-1;
                return ret;
            }


        });

        JPanel contentpane=new JPanel(new BorderLayout());
        contentpane.add(paneLigne, BorderLayout.WEST);
        contentpane.add(main, BorderLayout.CENTER);     

        this.setContentPane(new JScrollPane(contentpane));
        this.setVisible(true);

    }

    public static void main(String[] args) {

        SSCCE fen = new SSCCE();

    }

}   
于 2012-05-26T00:40:36.967 に答える