2012-02-12 15 views
2

私は計算の実行ログを保持する小さな電卓ウィジェットを開発しています。新しいエントリが追加されるたびにログの一番下までスクロールすることになっています。この部分は正常に動作しているようです。 問題は、ログに追加されていない電卓ボタンを押すと、ログウィンドウが常に上にスクロールしてスクロールバーが消えてしまうことです。これをやめないようにするにはどうすればいいですか?Java Swing JScrollPaneがスクロールし続けるのはなぜですか?

ログに追加するコードは次のとおりです。あなたが思うのコードは問題がない原因になっている

private void addDigit(char digit) { 
     if (clearDisplayBeforeDigit) { 
      clearNumDisplay(); 
     } 
     if (numInDisplay.getText().length() < maxNumDigits) { 
      if (digit == '.') { //Point 
      if (!hasPoint) { //Only one point allowed 
       hasPoint = true; 
       String newText = numInDisplay.getText() + "."; 
       numInDisplay.setText(newText); 
      } 
      } else { //New digit 
      String newText = numInDisplay.getText() + digit; 
      numInDisplay.setText(newText); 
      } 
     } 
    } 
+1

[SSCCE](http://sscce.org/)を投稿するとすぐに役立ちます。 –

+0

'log'はどこから呼び出されますか? 'JScrollPane'の' JScrollBar'を使って下にスクロールすることも考えられます。 ([リンク](http://stackoverflow.com/a/5150437/758280)、私はあなたの問題を解決するかどうかは考えていませんが、試して傷つけることはできません。) – Jeffrey

答えて

3

private JTextPane logArea; //This is placed inside a JScrollPane 
    private void log(String m, SimpleAttributeSet a) { 
     int len = logArea.getDocument().getLength(); 
     logArea.setEditable(true); 
     logArea.setCaretPosition(len); 
     logArea.setCharacterAttributes(a, false); 
     logArea.replaceSelection(m); 
     logArea.scrollRectToVisible(new Rectangle(0,logArea.getBounds(null).height,1,1)); 
     logArea.setEditable(false); 
    } 

スクロールをいじっているように見えるコードがありますlogAreaも参照してください。なぜ、これが問題の原因になると思いますか?

scrollRectToVisible(...)メソッドを使用する必要はありません。 setCaretPosition(...)はトリックを行う必要があります。ドキュメントの長さを取得し、ドキュメントを更新した後にそのメソッドを呼び出す必要があります。

詳細については、Text Area Scrollingをご覧ください。

編集:私はまた、テキストエリアの編集可能性を変更するための何らかの理由が表示されない

+0

+1、そのsetCaretPosition 。)は、トリックを動作させるために最後に呼び出さなければなりません。 –

+0

ボタンを押すかキーボードショートカットを押すかによって、addDigitが呼び出されるたびに、スクロールペインが先頭に戻ってくるので、問題だと思っていました。しかし、それは偶然であり、問​​題は焦点に関係しているのでしょうか?ボタンはログとは異なるJPanelにあります。焦点の変更によってこの問題が起こるか? – Leonide

+0

ここには、私が取り除こうとしている効果を示す慎重なバージョンがあります。ここには、私が取り除こうとしている効果を示す慎重なバージョンがあります。[http:// www .tenkuukai.com/testing/JCalculator.java)[リンク](http://www.tenkuukai.com/testing/JCalculatorDemo.java) – Leonide

関連する問題