JscrollPane contenant un JTextArea et défilement automatique [Resolu]

JscrollPane contenant un JTextArea et défilement automatique [Resolu] - Java - Programmation

Marsh Posté le 23-08-2002 à 11:50:10    

Voilà, j'ai un JScrollPane qui contient un JTextArea, jusqu'ici rien de bien extraordinaire. Le seul problème est que le ScrollPane ne défile pas automatiquement lorsque j'ajoute du texte, alors qu'il me semble bien qu'il le fait, normallement, non ?
 
Voilà mon code :
dans le constructeur de ma JFrame (après je touche plus à ces objets) :
 

Code :
  1. //redirection de la sortie standard
  2.         JTextArea stdOutText=new JTextArea();
  3.         stdOutText.setFont(new Font("Courier",Font.PLAIN,14));
  4.         stdOutText.setEditable(false);
  5.         stdOutText.setLineWrap(true);
  6.         stdOutText.setWrapStyleWord(true);
  7.         PrintStream outBak=System.out;
  8.         System.setOut(new PrintStream(new RedirigedStream(stdOutText,outBak)));
  9.         JScrollPane textAreaPane=new JScrollPane(stdOutText);
  10.         textAreaPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  11.         textAreaPane.setPreferredSize(new Dimension(screenWidth,(screenHeight-displayHeight)/2));
  12.         textAreaPane.setIgnoreRepaint(false);

 
et la déclaration de la classe RedirigedStream

Code :
  1. public class RedirigedStream extends OutputStream {
  2.         private JTextArea jta;
  3.         private PrintStream stdOut;
  4.         public RedirigedStream(JTextArea jta,PrintStream stdOut) {
  5.             this.jta=jta;
  6.             this.stdOut=stdOut;
  7.         }
  8.         public void write(int a) throws IOException {
  9.             stdOut.write(a);
  10.             byte [] b={(byte)a};
  11.             jta.append(new String(b,"ISO-8859-1" ));
  12.         }
  13.     }


le "stdOut.write(a);" dans RedirigedStream->write(int) me sert en cas de freeze de mon appli  :ange: , et la redirection m'est utile car je suis en plein écran ...
 
des idées ?


Message édité par bobuse le 23-08-2002 à 15:32:08
Reply

Marsh Posté le 23-08-2002 à 11:50:10   

Reply

Marsh Posté le 23-08-2002 à 12:34:35    

en fait voilà ma classe (réduite) :
 

Code :
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import java.io.*;
  5. public class TestFrame extends JFrame {
  6.     // rsolution
  7.     private final int displayWidth;
  8.     private final int displayHeight;
  9.     private final int screenWidth;
  10.     private final int screenHeight;
  11.    
  12.     public TestFrame() {
  13.         super();
  14.         this.setResizable(false);
  15.         this.setUndecorated(true);
  16.        
  17.         getContentPane().setBackground(new Color(0.5f,0.5f,0.5f));
  18.        
  19.         double ratio=(double)768/1365;
  20.         screenWidth=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode().getWidth();
  21.         screenHeight=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode().getHeight();
  22.         if ((double)screenHeight/screenWidth>ratio) {
  23.             displayWidth=screenWidth;
  24.             displayHeight=(int)(screenWidth*ratio);
  25.         } else {
  26.             displayWidth=(int)(screenHeight*ratio);
  27.             displayHeight=screenHeight;
  28.         }
  29.         //redirection de la sortie standard
  30.         JTextArea stdOutText=new JTextArea();
  31.         stdOutText.setFont(new Font("Courier",Font.PLAIN,14));
  32.         stdOutText.setEditable(false);
  33.         stdOutText.setLineWrap(true);
  34.         stdOutText.setWrapStyleWord(true);
  35.         PrintStream outBak=System.out;
  36.         System.setOut(new PrintStream(new RedirigedStream(stdOutText,outBak)));
  37.         JScrollPane textAreaPane=new JScrollPane(stdOutText);
  38.         textAreaPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  39.         textAreaPane.setPreferredSize(new Dimension(screenWidth,(screenHeight-displayHeight)/2));
  40.        
  41.         getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS));
  42.         this.getContentPane().add(Box.createVerticalStrut((screenHeight-displayHeight)/2));
  43.         JPanel panel=new JPanel();
  44.         panel.setPreferredSize(new Dimension(displayWidth,displayHeight));
  45.         this.getContentPane().add(panel);
  46.         this.getContentPane().add(textAreaPane);
  47.        
  48.         //on enlve le curseur de la souris
  49.         try {
  50.             getContentPane().setCursor(Toolkit.getDefaultToolkit().createCustomCursor(Toolkit.getDefaultToolkit().createImage("" ),new Point(0,0),"no cursor" ));
  51.         } catch (Exception e) {
  52.             e.printStackTrace();
  53.         }
  54.        
  55.         //dessin de la fentre
  56.         this.addWindowListener(new WindowAdapter() {
  57.                                    public void windowClosing(WindowEvent e) {
  58.                                        System.exit(0);
  59.                                    }
  60.                                }
  61.                               );
  62.         this.pack();
  63.         //affichage de la fentre
  64.         this.setVisible(true);
  65.         //passe en mode fullscreen
  66.         GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this);
  67.        
  68.         this.addKeyListener(new MyKeyListener());
  69.         this.requestFocus();
  70.     }
  71.     ////////////////////////////
  72.     // MAIN
  73.     public static void main(String [] args) {
  74.         TestFrame testFrame=new TestFrame();
  75.         for (int i=0;i<15;i++) {
  76.             System.out.println("du texte" );
  77.         }
  78.     }
  79.    
  80.     private class MyKeyListener implements KeyListener {
  81.         public MyKeyListener() {}
  82.         public void keyTyped(KeyEvent e) {}
  83.         public void keyPressed(KeyEvent e) {
  84.             if (e.getKeyCode()==KeyEvent.VK_ESCAPE) {
  85.                 System.exit(0);
  86.             }
  87.         }
  88.         public void keyReleased(KeyEvent e) {}
  89.     }
  90.    private class RedirigedStream extends OutputStream {
  91.         private JTextArea jta;
  92.         private PrintStream stdOut;
  93.         public RedirigedStream(JTextArea jta,PrintStream stdOut) {
  94.             this.jta=jta;
  95.             this.stdOut=stdOut;
  96.         }
  97.         public void write(int a) throws IOException {
  98.             stdOut.write(a);
  99.             byte [] b={(byte)a};
  100.             jta.append(new String(b,"ISO-8859-1" ));
  101.         }
  102.     }
  103. }


Si vous la lancez ([Echap] pour sortir), vous verrez que le JScrollPane ne défile pas, alors qu'il le fait normalement, non ?


Message édité par bobuse le 23-08-2002 à 12:37:56
Reply

Marsh Posté le 23-08-2002 à 14:06:18    

faut mettre des <blink> dans ton texte
[:kunks]


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 23-08-2002 à 14:45:40    

--greg-- a écrit a écrit :

faut mettre des <blink> dans ton texte
[:kunks]



:heink:  :??:

Reply

Marsh Posté le 23-08-2002 à 15:09:46    

y'a qu'a bouger le Caret a la fin de ton fichier, et sa scroll tous seul.

Reply

Marsh Posté le 23-08-2002 à 15:31:36    

nbarbosa a écrit a écrit :

y'a qu'a bouger le Caret a la fin de ton fichier, et sa scroll tous seul.
 




 [:zjk] [:yaisse] Merci !
voilà la ligne à ajouter après le append(...) :
 

Code :
  1. jta.setCaretPosition(jta.getText().length());

Reply

Marsh Posté le 23-08-2002 à 17:33:50    

bobuse a écrit a écrit :

 :heink:  :??:  



désolé, c'était une référence à un autre topic drolissime (hahem), rien à voir, euh. c pas grave :o


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 23-08-2002 à 17:53:33    

Citation :

voilà la ligne à ajouter après le append(...) :  
 
Code :
 
  jta.setCaretPosition(jta.getText().length());
 


 
Ouais, mais ca fait chier a chaque append de rajouter ca. On peut surclasser le append pour qu'il le fasse tout seul. Mais dans l'api, ya pas un autoscroll ?
J'ai vu des trucs qui y ressemblent mais rien qui fonctionne  :(  

Reply

Marsh Posté le 23-08-2002 à 17:58:26    

oliv5 a écrit a écrit :

Citation :

voilà la ligne à ajouter après le append(...) :  
 
Code :
 
  jta.setCaretPosition(jta.getText().length());
 


 
Ouais, mais ca fait chier a chaque append de rajouter ca. On peut surclasser le append pour qu'il le fasse tout seul. Mais dans l'api, ya pas un autoscroll ?
J'ai vu des trucs qui y ressemblent mais rien qui fonctionne  :(  
 




keski fé chier ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed