2012-05-25 3 views
1

텍스트 편집기에서 작업하고 있는데, 메인 패널은 3 개의 JTextPane으로 구성되어 있습니다. 줄과 일반 구문 오류의 수를 나타내는 측면에 2 개, 주 에디션의 중간에 1 개가 있습니다. 전체 내용은 JScrollPane에 포장되어 있습니다.자동 스크롤 JScrollPane disturbing

사용자가 (Enter 키를 누릅니다), 부착 된 KeyListener들, 반응의 JScrollPane 자동 스크롤을 (라인에 대한 납입 및 구문 오류) 새로운 2 개면 JTextPane의에 항목을 추가 라인을 이동하면 자동 스크롤 문제가 나타납니다 문서의 맨 아래에 2 개의면에 삽입 된 새로운 텍스트가 표시됩니다. JTextPane s.

KeyListener에 새 줄 (사용자가 추가)마다 JScrollBar의 위치를 ​​설정하여 부분적으로 문제를 해결했습니다. 예로 scrollRectToVisible를 사용하거나 2 개 측면 JTextPane들 중 하나의 텍스트의 적절한 부분을 선택하여 더.

그러나, 최종 효과는 수직 스크롤이 진동 각각의 새로운 라인, 정말 대단하지, 우리는 쉽게 몇 초 동안 Enter 키를 눌러 응용 프로그램을 중단 할 수 있습니다. 나는 많은 방법으로 JScrollPane 클래스의 메소드를 찾고 있었지만 AdjustmentListener을 시도했지만 실패했다. 도와 줄래?

추신 : 내 영어로 죄송합니다. 나는 프랑스 인이다. 우리 포럼은 짜증 난다.

+5

,이 [SSCCE] (http://sscce.org/)을 게시 할 수 있습니다. –

+1

3 개의 JTextPane가 모두 같은 JScrollPane 내에 있습니다. 나는 그것이 좋은 생각이라고 생각하지 않는다. 각각을 별도의 JScrollPane에 두어 어떻게 작동하는지보십시오. – ChadNC

답변

0

SSCCE이 하나가 잘 작동으로 영감의 훌륭한 소스는 (그것을 실행할 때 내 문제를 볼 수 없었다) 내 방법은 실제로 작동하는 것 같다,하지만 내 실제 코드의 오른쪽 수신기에서 실행되지 않았습니다.

감사 어쨌든! SSCCE 하나 년판 중앙 JTextPane가 상기 라인 번호에 대한 측면의 하나 이루어지는 간단한 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(); 

    } 

}