2012-05-25 2 views
1

Я работаю над текстовым редактором, основная панель состоит из 3 JTextPane s, 2 на стороне, которая показывает количество строк и общих синтаксических ошибок и 1 в середине для основного выпуска. Весь материал упакован в JScrollPane.autoscroll JScrollPane беспокоит

Проблема автопрокрутки появляется, когда пользователи перепрыгнуть линию (нажмите ENTER), то KeyListener s присоединенные добавить новую запись в 2-х сторон JTextPane S (Num и синтаксические ошибки для линии), в реакции, в JScrollPane Автопрокрутки в нижней части документа, возможно, чтобы показать новый текст, вставленный в 2 стороны JTextPane s.

Я частично исправил проблему, установив позицию JScrollBar для каждой новой строки (добавленной пользователем) в моих KeyListener s. Например, с помощью scrollRectToVisible или лучше, выбрав подходящую часть текста на одной из двух сторон: JTextPane.

Однако конечный эффект не так велик, поскольку каждая новая строка колеблется в вертикальной полосе прокрутки, и мы можем легко свернуть приложение, нажав ENTER на несколько секунд. Я искал решения с большим количеством методов класса JScrollPane и пытался AdjustmentListener, но безуспешно. Ты поможешь мне?

PS: Извините за мой английский. Я французский, наши форумы сосут.

+5

Для лучшей помощи рано, опубликовать [SSCCE] (http://sscce.org/). –

+1

У вас есть три JTextPanes внутри одной JScrollPane? Я не считаю это хорошей идеей. Поместите каждый в отдельную JScrollPane и посмотрите, как это работает. – ChadNC

ответ

0

SSCCE отличный источник вдохновения, так как этот работал хорошо (не мог видеть мою проблему при запуске). Кажется, что мой метод действительно работает, но не работает в правом прослушивании в моем реальном коде.

В любом случае, спасибо! Существует SSCCE, его простая JScrollPane, состоящая из одной центральной JTextPane для версии и одна боковая для номера строк. Метод placeScroll() помещает полосу прокрутки так, чтобы каретка в основной части JTextPane находилась посередине (по вертикали), когда paneLigne пытается ее сместить.

Bye

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

    } 

} 
Смежные вопросы