2011-06-21 2 views
2

J'utilise un JTextPane (dans un JScrollPane) dans le cadre d'un système de journalisation personnalisé. (J'avais besoin d'une sortie multicolore donc je ne pouvais pas utiliser JTextArea.)JTextPane - Comment créer un journal de défilement

J'ai la partie de journalisation qui marche, mais je dois maintenant pouvoir limiter son contenu pour qu'il ne croisse pas en mémoire en continu .

Il n'y a pas d'entrée utilisateur directe car tous les journaux sont générés par le système.

Ce que je dois pouvoir faire est d'identifier quand le JTextPane a atteint un nombre spécifié de lignes, et puis pouvoir supprimer la première ligne quand le maximum est dépassé. Cela me permettrait de conserver un tampon des dernières lignes 'x' dans l'affichage.

Comment ferais-je cela?

+0

voir ce http://stackoverflow.com/q/102171/307767 – oliholz

+0

J'avais déjà vu ce post et ça ne résout pas ma question. Je dois être en mesure de supprimer une ligne une fois que le journal entier dépasse un certain nombre de lignes. – Dave

+0

Voir ma réponse [ici] (http://stackoverflow.com/questions/6316272/). Je crois que Message Console répond à vos besoins. –

Répondre

3

Utilisez DocumentFilter et vérifiez la longueur du document. Vous pouvez également utiliser la méthode getText() du document et compter les caractères "\ n" dans la chaîne. Vous pouvez également remplacer la méthode insertString() du document. Si le montant maximum possible de lignes est obtenue il suffit d'appeler remove() et puis super.insertString()

1

essayer ce petit exemple:

public class Example { 

    private static int MAX = 7; 

    static public void main(String[] s) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException { 

     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

     JFrame frame = new JFrame(); 
     frame.setBounds(50, 50, 200, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JTextPane pane = new JTextPane(); 

     pane.setText("1\n2\n3\n4"); 

     JPanel pnl = new JPanel(new BorderLayout()); 
     pnl.add(pane, BorderLayout.CENTER); 

     pane.getDocument().addDocumentListener(new DocumentListener() { 
      public void removeUpdate(DocumentEvent e) { 
      } 
      public void insertUpdate(DocumentEvent e) { 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         try { 
          View baseView = pane.getUI().getRootView(pane); 
          View root = baseView.getView(0); 
          for(int i = 0; i < root.getViewCount()-MAX; i++) { 
           int line = root.getViewIndex(i, Bias.Forward); 
           View lineview = root.getView(line); 
           pane.getDocument().remove(lineview.getStartOffset(), lineview.getEndOffset()); 
          } 
         } catch(BadLocationException e1) { 
          e1.printStackTrace(); 
         } 
        } 
       }); 
      } 
      public void changedUpdate(DocumentEvent e) { 
      } 
     }); 

     pnl.add(new JButton(new AbstractAction("Delete") { 
      public void actionPerformed(ActionEvent e) { 
       try { 
        View baseView = pane.getUI().getRootView(pane); 
        View root = baseView.getView(0); 
        int line = root.getViewIndex(0, Bias.Forward); 
        View lineview = root.getView(line); 
        pane.getDocument().remove(lineview.getStartOffset(), lineview.getEndOffset()); 
       } catch(BadLocationException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     }), BorderLayout.SOUTH); 

     pnl.add(new JButton(new AbstractAction("Add") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        pane.getDocument().insertString(pane.getDocument().getEndPosition().getOffset(), new SimpleDateFormat("ss").format(new Date())+": This is a new line\n", null); 
       } catch(BadLocationException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     }), BorderLayout.NORTH); 
     frame.setContentPane(pnl); 
     frame.setVisible(true); 
    } 
} 
Questions connexes