2

カスタム ロギング システムの一部として JTextPane (JScrollPane 内) を使用しています。(マルチカラー出力が必要だったので、JTextArea を使用できませんでした。)

ロギング部分は機能していますが、メモリ内で継続的に増加しないように、コンテンツを制限できるようにする必要があります。

すべてのログはシステムで生成されるため、ユーザーが直接入力する必要はありません。

私ができる必要があるのは、JTextPane が指定された行数に達したときを識別し、最大数を超えたときに最初の行を削除できるようにすることです。これにより、ディスプレイの最後の「x」行のバッファーを保持できます。

どうすればこれを行うことができますか?

4

2 に答える 2

3

DocumentFilter を使用して、ドキュメントの長さを確認します。また、Document の getText() メソッドを使用して、文字列内の "\n" 文字をカウントすることもできます。または、ドキュメントの insertString() メソッドをオーバーライドできます。可能な最大行数に達したら、 remove() を呼び出してから super.insertString() を呼び出します

于 2011-06-21T06:30:15.593 に答える
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 );
    }
}
于 2011-06-21T06:51:10.523 に答える