JTextPane - Как я могу создать журнал прокрутки - PullRequest
2 голосов
/ 21 июня 2011

Я использую JTextPane (в JScrollPane) как часть пользовательской системы ведения журнала.(Мне требовался многоцветный вывод, поэтому я не мог использовать JTextArea.)

У меня работает часть ведения журнала, но теперь мне нужно иметь возможность ограничить его содержимое, чтобы оно не просто рослопамять постоянно.

Прямой пользовательский ввод отсутствует, так как все журналы генерируются системой.

Что мне нужно сделать, это определить, когда JTextPane достигло указанного числа строк,а затем сможете удалить первую строку, когда превышен максимум.Это позволило бы мне сохранить буфер последних 'x' строк на дисплее.

Как мне поступить?

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Используйте DocumentFilter и проверьте длину документа.Также вы можете использовать метод getText () для Document и считать символы "\ n" в строке.Или вы можете переопределить метод insertString () документа.Если максимально возможное количество строк достигнуто, просто вызовите remove () и затем super.insertString ()

1 голос
/ 21 июня 2011

попробуйте этот маленький пример:

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