2012-05-25 31 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(); 

    } 

}