- PR -

JTextAreaの文字数制限

1
投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-03 12:54
お世話になっています。

今作っているアプリのログを、VBの開発環境のイミディエイトウィンドウのように
テキストエリア(JTextArea)に出力しようと思います。

VBでアプリを作ったときも同様の機能を作ったときは、テキストボックスを貼り付けま
したが64KB(32KB?)の文字数制限があったので、一定数以上の文字数になったときに
前の方の古い文字列を消す処理で対応しました。

JavaのswingのJTextAreaの場合、文字数制限はあるのでしょうか?
また、このような機能を作る場合、どのような方法でやればいいのでしょうか?




[ メッセージ編集済み 編集者: maru 編集日時 2003-07-03 12:56 ]
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2003-07-03 16:01
ニシトミです。

Java-Houseメーリングリストにも同じ質問がありましたが、残念ながら
レスついてませんでした。
APIにも、記述されてませんでした。

私が思ったのは
javaのGUIは、クライアントのスペックにも影響があるのではないか?です。
一度PDA端末でAppletを試す機会があったのですが
Textareaにログを100行ぐらいだしたとこで、端末フリーズしました。
TextAreaの限界がわかればいいんですけどね。

もし不安だったら、ログファイルに出すとかいろいろあると思います。

参考になれば

[ メッセージ編集済み 編集者: ニシトミ 編集日時 2003-07-03 17:19 ]
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-03 16:52
こんにちは。返答ありがとうございます。参考になります。

Java-Houseにもまったく同じタイトルであったので、これは!と思ったのですが、
レスがなくてがっかりでした。

>javaのGUIは、クライアントのスペックにも影響があるのではないか?
サイズ制限などはOSに依存するので決められないのでしょうね。

処理の経過をユーザがリアルタイムで見れるようなログウィンドウを作りたいので、
ファイル出力ではNGです。

JTextAreaにはこだわらずJListでもいいのですが、無限に文字が書き込める
テキスト領域がほしいのです。
無限といっても、過去100行程度の履歴が出ればいいのですが。

ちょっと、JTextAreaを拡張して作ってみます。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-07-04 09:35
どうもWataです。
私の予想ではJTextAreaならOutOfMemoryExceptionが発生するまで、
文字が書き込めると思いますよ。
逆にjava.awt.TextAreaの場合、OSのネイティブなコンポーネントを
使うので、そのコンポーネントの仕様次第になると思います。
そして、Win98系のメモ帳に使われるようなテキストコンポーネントは
文字数制限があったように思います。

心配ならまず試してみればよいのではないでしょうか?
JTextAreaに適当な文字列を100行以上表示してみて、
動作を確認するとよいと思います。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-07-04 10:16
こんにちは。
ためしに作ってみました。
JTextAreaのappendをオーバーライトして、その中で最大行以上になったときに先頭行
を削る処理を追加してみました。効率いいかはわかりませんけど。

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;

class JTextAreaEx extends JTextArea{
private int maxrows = 10;
public JTextAreaEx(){
super();
}

public JTextAreaEx(int rows, int columns){
super( rows, columns );
}

public JTextAreaEx(String text){
super( text );
}

public JTextAreaEx(String text, int rows, int columns){
super( text, rows, columns );
}

public void append(String str){
if( getLineCount() > maxrows ){
try{
int len = getLineEndOffset(0);
getDocument().remove( 0, len);
}catch( BadLocationException exp ){}
}

try{
setCaretPosition( getText().length() );
super.append( str + "\n");
}catch( IllegalArgumentException exp ){}
}

public void setMaxRows( int rows ){
maxrows = rows;
}

public int getMaxRows(){
return maxrows;
}
}

class Test extends JFrame{
JTextField txt1;
JTextAreaEx txt2;

public Test(){
super("てすと");
txt1 = new JTextField("");
txt2 = new JTextAreaEx();

txt1.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent ev) {
txt2.append( txt1.getText());
txt1.setText("");
}
});

getContentPane().add( txt1, BorderLayout.NORTH );
getContentPane().add( new JScrollPane( txt2 ), BorderLayout.CENTER );
setSize( 200, 200 );
setVisible(true);
}

public static void main( String[] args ){
Test frm = new Test();
}
}


[ メッセージ編集済み 編集者: maru 編集日時 2003-07-04 10:23 ]
1

スキルアップ/キャリアアップ(JOB@IT)