JTextPane - 如何创建滚动日志

时间:2011-06-21 06:03:29

标签: java swing logging jtextpane

我正在使用JTextPane(在JScrollPane中)作为自定义日志记录系统的一部分。 (我需要多色输出,因此无法使用JTextArea。)

我的日志部分工作正常,但我现在需要能够限制其内容,以便它不会在内存中不断增长。

没有直接的用户输入,因为所有日志都是系统生成的。

我需要做的是确定JTextPane何时达到指定行数,然后能够在超过最大值时删除第一行。这样我就可以在显示屏上保留最后“x”行的缓冲区。

我将如何做到这一点?

2 个答案:

答案 0 :(得分:3)

使用DocumentFilter并检查文档的长度。您还可以使用Document的getText()方法并在String中计算“\ n”字符。 或者您可以覆盖文档的insertString()方法。如果达到最大可能的行数,只需调用remove()然后调用super.insertString()

答案 1 :(得分:1)

尝试这个小例子:

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