2012-02-12 83 views
2

我正在開發一個保存計算運行日誌的小型計算器小部件。每次添加新條目時,都應該滾動到日誌的底部。這部分似乎工作正常。 問題是,當我按下不添加到日誌的計算器按鈕時,日誌窗格始終滾動回頂部,滾動條消失。我怎麼能阻止它做到這一點?爲什麼我的Java Swing JScrollPane繼續滾動到頂部?

,增加了日誌的代碼是:

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); 
    } 

,這似乎與滾動搞亂的代碼是:

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/)。 – 2012-02-12 04:03:02

+0

從哪裏調用'log'?您也可以考慮使用'JScrollPane'的'JScrollBar'滾動到底部。 ([鏈接](http://stackoverflow.com/a/5150437/758280),我不知道這是否會解決您的問題,但它不能傷害嘗試。) – Jeffrey 2012-02-12 04:06:37

回答

3

你認爲的代碼是導致該問題不即使參考logArea,那麼爲什麼你會認爲這會導致問題呢?

您不需要使用scrollRectToVisible(...)方法。 setCaretPosition(...)應該做到這一點。雖然您應該獲取文檔的長度並在更新文檔後調用該方法。

檢查出Text Area Scrolling欲知更多信息。

編輯:

我也看不出有任何理由更改文本區的可編輯性。

+0

+1,that setCaretPosition(.. )必須在最後調用才能工作。 – 2012-02-12 04:17:29

+0

我認爲這是問題,因爲每次調用addDigit時,無論是通過按下按鈕還是通過鍵盤快捷鍵,滾動窗格都會返回頂部。但也許這是巧合,問題與焦點有關?這些按鈕位於與日誌不同的JPanel上。焦點的改變會導致這個問題嗎? – Leonide 2012-02-12 11:22:08

+0

這裏是一個削減版本,應該顯示我試圖擺脫的效果:這是一個削減版本,應該顯示我試圖擺脫的效果:[鏈接](http:// www .tenkuukai.com/testing/JCalculator.java)[link](http://www.tenkuukai.com/testing/JCalculatorDemo.java) – Leonide 2012-02-12 11:57:04

相關問題