2012-05-25 34 views
1

我正在文本編輯器,主面板在中間主版由3個JTextPane S,2在其上顯示線路和共同的語法錯誤的數目的一側,和1。整個東西都包裝在JScrollPane自動滾屏JScrollPane的干擾

當用戶跳線(按ENTER鍵),附KeyListener■添加在兩面JTextPane s(對於行NUM和語法錯誤)的新條目, 在反應中,JScrollPane自動滾屏出現自動滾屏問題在文檔的底部,可能會顯示插入在兩側JTextPane的新文本。

我通過在我的KeyListener中爲每條新行(由用戶添加)設置JScrollBar的位置來部分解決問題。例如,使用scrollRectToVisible,或者通過在兩側JTextPane s之一中選擇適當的文本部分來更好地使用。

然而,最終的效果是沒有那麼大,對於每一個新的生產線的垂直滾動條振盪,我​​們可以很容易地通過按下ENTER鍵幾秒鐘崩潰的應用程序。我一直在尋找JScrollPane類的很多方法的解決方案,並嘗試AdjustmentListener,但未成功。你能幫我嗎?

PS:對不起,我的英語。我是法國人,我們的論壇很糟糕。

+5

爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 –

+1

你有三個JTextPanes全部在同一個JScrollPane裏面嗎?我不認爲這是一個好主意。把每一個放在一個單獨的JScrollPane中,看看它是如何工作的。 – ChadNC

回答

0

SSCCE靈感的重要來源,因爲這一個運作良好(運行時,它不能看到我的問題)看來,我的方法確實有效,但在我真正的代碼正確的監聽器沒有運行。

還是要謝謝你! 有SSCCE,它是一個簡單的JScrollPane,由一個用於編輯的中央JTextPane和一個用於行號的橫向組成。 placeScroll()方法放置滾動條,以便當paneLigne嘗試按下時,JTextPane中的插入符號位於中間(垂直)。

再見

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

    } 

}