如果是可以用鼠标可以拉动的jTextPane也可以!!!!!!!!!

解决方案 »

  1.   

    不明白?按delete删光标前的文字?
    指定大小,文字不能超出边框?
      

  2.   

    试了一下,JTextPane本身就符合你的要求呀,但是jTextPane可能会超出Frame的边界,
    而且你的第二个要求有问题,既然指定了大小,怎么增行减行啊。
      

  3.   

    我想让这个jTextPane根据我文字的大小和多少,来变化它的尺寸。比如原来就有一行,我想按回车,增加一行。或者减去一行。还有,jTextPane的下面文字可以无限制的输入,我想到最下面就不让输入新的文字了,要想输入按回车,使jTextPane增加一行!!!
      

  4.   

    看看有用吗??
    /**
      クラス名    RelTextArea.java
     */
    import java.awt.event.FocusEvent;
    import java.awt.AWTEvent;
    import javax.swing.JTextArea;
    import javax.swing.text.PlainDocument;
    import java.util.Hashtable;
    import java.awt.im.InputSubset;
    import javax.swing.text.*;
    import java.lang.*;
    import java.util.*;/**
     * 複行用のJtextAreaでRelTextFieldと同等の拡張機能が必要な場合には、
     * RelTextAreaとして 共通部品を作成して使用してください。
     */
    public class RelTextArea
        extends JTextArea {    /**
         * IMEの制御を特に行わない(デフォルト)
         */
        public final static int IME_NONE = 0;
        /**
         * フォーカス取得時にIMEをオフにする
         */
        public final static int IME_OFF = 1;
        /**
         * フォーカス取得時にIMEをオンにする
         */
        public final static int IME_ON = 2;    /**
         * 文字列長をOS標準文字セットによるバイト数で判断
         */
        public final static int LENGTH_BY_NATIVE = 0;
        /**
         * 文字列長をUNICODEキャラクタ数で判断(デフォルト)
         */
        public final static int LENGTH_BY_UNICODE = 1;    /**
         * 全ての文字種の入力を許可(デフォルト)
         */
        public final static int REFUSAL_NONE = 0;
        /**
         * 全角文字の入力を拒否
         */
        public final static int REFUSAL_WIDE = 1;
        /**
         * 半角数字の入力を拒否
         */
        public final static int REFUSAL_NUMBER = 2;
        /**
         * 半角英字の入力を拒否
         */
        public final static int REFUSAL_ALPHABET = 4;
        /**
         * 半角記号の入力を拒否
         */
        public final static int REFUSAL_SYMBOL = 8;    private int piImeMethod; // フォーカス取得時のIME制御方法
        private int piMaxLineCount; // 最大行数の制限
        private int piMaxLength; // 単行の最大文字列長
        private int piMaxStringNum; // 最大文字数
        private int piLengthMethod; // 文字列長の判定方法
        private boolean pbReplaceMode; // フォーカス取得時の置換モード
        private int piRefusalMode; // 入力拒否文字列の種類    private Hashtable phRefusal = new Hashtable(); // 文字入力の制御方法の保存用
        private String SNULL = ""; // 判断用の0長度の文字列
        private String STRNULL = "null"; // 判断用の文字列    /**
         * RelTextArea
         * コンストラクタ
         */
        public RelTextArea() {
            this("", 0, 0, LENGTH_BY_UNICODE, false, IME_NONE);
        } // END RelTextArea()    /**
         * RelTextArea
         * コンストラクタ
         * @param asText : 表示用の文字列を指定する。
         */
        public RelTextArea(String asText) {
            this(asText, 0, 0, LENGTH_BY_UNICODE, false, IME_NONE);
        } // END RelTextArea(String)    /**
         * RelTextArea
         * コンストラクタ
         * @param asText         : 表示する文字列を指定する。
         * @param aiMaxLineCount : テキストエリアの最大行数を指定する。
         * @param aiMaxLength    : 単行の最大文字列長を指定する。
         */
        public RelTextArea(String asText, int aiMaxLineCount, int aiMaxLength) {
            this(asText, aiMaxLineCount, aiMaxLength, LENGTH_BY_UNICODE, false,
                 IME_NONE);
        } // END RelTextArea(String, int, int)    /**
         * RelTextArea
         * コンストラクタ
         * @param asText         : 表示する文字列を指定する。
         * @param aiMaxLineCount : テキストエリアの最大行数を指定する。
         * @param aiMaxLength    : 単行の最大文字列長を指定する。
         * @param aiLengthMethod : 文字列の判定方法を指定する。判定方法は次の値を指定する。
         *                          値                  説明
         *                          LENGTH_BY_UNICODE   UNICODE キャラクタ数により判定する。
         *                          LENGTH_BY_NATIVE    OSの標準文字セットによるバイト数により判定
         *                                              する。
         */
        public RelTextArea(String asText, int aiMaxLineCount,
                           int aiMaxLength, int aiLengthMethod) {
            this(asText, aiMaxLineCount, aiMaxLength, aiLengthMethod, false,
                 IME_NONE);
        } // END RelTextArea(String, int, int, int)    /**
         * RelTextArea
         * コンストラクタ
         * @param asText         : 表示する文字列を指定する。
         * @param aiMaxLineCount : テキストエリアの最大行数を指定する。
         * @param aiMaxLength    : 単行の最大文字列長を指定する。
         * @param aiLengthMethod : 文字列の判定方法を指定する。判定方法は次の値を指定する。
         *                          値                  説明
         *                          LENGTH_BY_UNICODE   UNICODE キャラクタ数により判定する。
         *                          LENGTH_BY_NATIVE    OSの標準文字セットによるバイト数により判定
         *                                              する。
         * @param abMode         : 置換モードを指定する。置換モードには次の値を指定する
         *                          値      説明
         *                          true    フォーカス取得時に全テキストが選択状態になる。
         *                          false   特に制御は行わない。
         */
        public RelTextArea(String asText, int aiMaxLineCount,
                           int aiMaxLength, int aiLengthMethod, boolean abMode) {
            this(asText, aiMaxLineCount, aiMaxLength, aiLengthMethod, abMode,
                 IME_NONE);
        } // END RelTextArea(String, int, int, int, boolean)    /**
         * RelTextArea
         * コンストラクタ
         * @param asText         : 表示する文字列を指定する。
         * @param aiMaxLineCount : テキストエリアの最大行数を指定する。
         * @param aiMaxLength    : 単行の最大文字列長を指定する。
         * @param aiLengthMethod : 文字列の判定方法を指定します。判定方法は次の値を指定する。
         *                          値                  説明
         *                          LENGTH_BY_UNICODE   UNICODE キャラクタ数により判定する。
         *                          LENGTH_BY_NATIVE    OSの標準文字セットによるバイト数により判定
         *                                              する。
         * @param abMode         : 置換モードを指定する。置換モードには次の値を指定する
         *                          値      説明
         *                          true    フォーカス取得時に全テキストが選択状態になる。
         *                          false   特に制御は行われません。
         * @param aiImeMethod    : IMEの制御方法を指定する。制御方法は次の値を指定する。
         *                          値          説明
         *                          IME_NONE    IME 制御を特に行わない。
         *                          IME_ON      フォーカス取得時にIMEをONにセットする。
         *                          IME_OFF     フォーカス取得時にIMEをOFFにセットする。
         */
        public RelTextArea(String asText, int aiMaxLineCount, int aiMaxLength,
                           int aiLengthMethod, boolean abMode, int aiImeMethod) {
            super();
            enableEvents(AWTEvent.KEY_EVENT_MASK); // イベントの送信
            setText(asText); // ディフォトテキストを指定する
            piImeMethod = aiImeMethod; // フォーカス取得時のIME制御方法を指定する
            piMaxLineCount = aiMaxLineCount; // 最大行数の指定
            piMaxLength = aiMaxLength; // 単行の最大文字列長の指定
            piLengthMethod = aiLengthMethod; // 文字列長の判定方法の指定
            pbReplaceMode = abMode; // フォーカス取得時の置換モードの指定
            piRefusalMode = REFUSAL_NONE; // 入力拒否文字列を指定する
            setDocument(new PlainDocument()); // ディフォトドキュメントを指定する
            String[] psRefusalVal = {
                "0", "1", "2", "12", "4", "14", "24", "124", "8", "18", "28", "128",
                "48", "148", "248", "1248"};
            for (int i = 0;
                 i <=
                 (REFUSAL_WIDE + REFUSAL_NUMBER + REFUSAL_ALPHABET + REFUSAL_SYMBOL);
                 i++) {
                phRefusal.put(SNULL + i, psRefusalVal[i]);
            } // END FOR
            this.setUI(new pTextAreaUI());
        } // END RelTextArea(String, int, int, int, boolean, int )
      

  5.   


        /**
         * getIMEMethod
         * IMEの制御方法を取得する。
         * @return int : IME制御方法が返る。戻り値は次の意味がある。
         *              戻り値          説明
         *              IME_NONE        IME 制御を特に行わない。
         *              IME_ON          フォーカス取得時にIMEをONに指定する。
         *              IME_OFF         フォーカス取得時にIME をOFFに指定する。
         */
        public int getIMEMethod() {
            return piImeMethod;
        } // END getIMEMethod()    /**
         * getLength
         * テキストエリアに入力されている文字列長を取得する
         * @return int : テキストエリア全体の文字列長が返る。
         *            成功した場合は、入力されているテキストエリアの文字列長を取得する。
         *            失敗した場合は-1が返る。
         */
        public int getLength() {
            try {
                // 文字列長をUNICODEキャラクタ数で判断
                if (piLengthMethod == LENGTH_BY_UNICODE) {
                    return getDocument().getLength();
                }
                // 文字列長をOS標準文字セットによるバイト数で判断
                else {
                    return getText().getBytes().length;
                } // END IF
            } // END TRY
            catch (Exception ex) {
                //例外が発生した場合、またはエラーが発生した場合は-1を返る。
                return -1;
            } // END CATCH
        } // END getLength()    /**
         * getLength
         * テキストエリアにおいて指定された行の文字列長を取得する。
         * @param aiLineNum : 文字列数を取得する行を指定する。
         * @return int      : 成功した場合、指定された行の文字列長が返る。
         *                    失敗した場合は-1が返る。
         */
        public int getLength(int aiLineNum) {
            try {
                // 文字列長をUNICODEキャラクタ数で判断
                if (piLengthMethod == LENGTH_BY_UNICODE) {
                    /*
                        指定された行の開始オフセットを取得する
                        指定された行の終了オフセットを取得する。
                        終了オフセットから開始オフセットの差をとり、1プラスする
                        計算した値を戻り値として返る。
                     */
                    String psVal = getDocument().getText(
                        getLineStartOffset(aiLineNum),
                        getLineEndOffset(aiLineNum) -
                        getLineStartOffset(aiLineNum) + 1);
                    return psVal.length();
                }
                // 文字列長をOS標準文字セットによるバイト数で判断
                else {
                    /*
                        指定された行の文字列を取得する。
                        文字列のバイト配列を取得する。
                        バイト配列の長さを戻り値として返る。
                     */
                    String psVal = getDocument().getText(
                        getLineStartOffset(aiLineNum),
                        getLineEndOffset(aiLineNum) -
                        getLineStartOffset(aiLineNum));
                    return psVal.getBytes().length;
                } // END IF
            }
            catch (Exception ex) {
                //例外が発生した場合、またはエラーが発生した場合は-1を返る。
                return -1;
            } // END TRY
        } // END getLength(int)    /**
         * getLengthMethod
         * 文字列長の判断方法を取得する。
         * @return int : 文字列長の判定方法が返る。戻り値には次の意味があす
         *              戻り値              説明
         *              LENGTH_BY_UNICODE   UNICODE キャラクタ数により判定する。
         *              LENGTH_BY_NATIVE    OSの標準文字セットによるバイト数により判定する。
         */
        public int getLengthMethod() {
            return piLengthMethod;
        } // END getLengthMethod()
      

  6.   


        /**
         * getMaxLength
         * 単行に入力できる最大文字列長を取得する。
         * @return int : 単行に入力できる最大文字列長が返る。
         */
        public int getMaxLength() {
            return piMaxLength;
        } // END getMaxLength()    /**
         * getMaxLineCount
         * テキストエリアに入力可能な最大行数を取得する。
         * @return int : テキストエリアに入力可能な最大行数が返る。
         */
        public int getMaxLineCount() {
            return piMaxLineCount;
        } // END getMaxLineCount()    /**
         * getRefusalCharacterMode
         * 入力拒否する文字セットモードを取得する。
         * @return int : 設定されている入力拒否モードが返る。
         *               戻り値は次の値の組み合わせの意味を持つ。
         *             戻り値             説明
         *             REFUSAL_NONE      全ての文字種を許可している。
         *             REFUSAL_WIDE      全角文字の入力を拒否している。
         *             REFUSAL_NUMBER    半角数字の入力を拒否している。
         *             REFUSAL_ALPHABET  半角英字の入力を拒否している。
         *             REFUSAL_SYMBOL    半角記号の入力を拒否している。
         */
        public int getRefusalCharacterMode() {
            return piRefusalMode;
        } // END getRefusalCharacterMode()    /**
         * getReplaceMode
         * 現在の置換モードを取得する。
         * @return boolean : 現在の置換モードが返る。
         *                  戻り値   説明
         *                  true    フォーカス取得時に全テキストが選択状態になる。
         *                  false   特に制御は行わない。
         */
        public boolean getReplaceMode() {
            return pbReplaceMode;
        } // END getReplaceMode()    /**
         * getMaxStringNum
         * 最大文字数の取得
         * @return int
         */
        public int getMaxStringNum() {
            return this.piMaxStringNum;
        }    /**
         * processFocusEvent
         * フォーカス取得または喪失時のイベント処理を行う。
         * @param aoEvent : フォーカスイベント
         */
        public void processFocusEvent(FocusEvent aoEvent) {
            // フォーカス取得する時
            if (aoEvent.getID() == FocusEvent.FOCUS_GAINED) {
                if (pbReplaceMode) {
                    this.selectAll();
                } // END IF
                // IMEがIME_ON
                if (piImeMethod == IME_ON) {
                    this.getInputContext().setCharacterSubsets(new Character.Subset[] {
                        InputSubset.KANJI});
                    super.enableInputMethods(true);
                }
                // IMEがIME_OFF、IME_NONE
                else if (piImeMethod == IME_OFF) {
                    this.getInputContext().setCharacterSubsets(new Character.Subset[] {
                        InputSubset.LATIN_DIGITS});
                    super.enableInputMethods(false);
                }
                else {
                    this.getInputContext().setCharacterSubsets(new Character.Subset[] {
                        InputSubset.LATIN_DIGITS});
                } // END IF
            }
            // フォーカス失う時
            else if (aoEvent.getID() == FocusEvent.FOCUS_LOST) {
                //this.getInputContext().setCharacterSubsets(new Character.Subset[] {
                //                                           InputSubset.FULLWIDTH_LATIN});
                super.enableInputMethods(true);
            } // END IF
            super.processFocusEvent(aoEvent);
        } // END processFocusEvent(FocusEvent)    /**
         * replaceSelection
         * テキストエリアに入力された文字列のチェックと挿入処理を行う。
         * @param asDestination : テキストエリアに入力された文字列
         */
        public void replaceSelection(String asDestination) {
            replaceRange(asDestination,
                         this.getSelectionStart(), this.getSelectionEnd());
        } // END replaceSelection(String)    /**
         * replaceRange
         * テキストエリアへの入力処理を行う。
         * 入力時には、利用するテキストエリアに設定された入力長、
         * 文字列制限によるチェックが行われる。
         * @param asDestination : テキストエリアに入力された文字列
         * @param aiStart       : 選択されているテキストの開始位置を指定する
         * @param aiEnd         : 選択されているテキストの終了位置を指定する
         */
        public void replaceRange(String asDestination, int aiStart, int aiEnd) {
            //入力拒否文字列のチェック
            if (piRefusalMode != REFUSAL_NONE) {
                //引数asDestinationにpiRefusalModeに一致する文字列が存在するかチェックする。
                String psReVal = SNULL + phRefusal.get(SNULL + piRefusalMode);
                if (mChkStr(psReVal).equals(SNULL)) {
                    return;
                } // END IF
                if (asDestination == null) {
                    if (this.getSelectionEnd() != this.getSelectionStart()) {
                        super.replaceSelection(asDestination);
                    } // END IF
                    return;
                } // END IF
                for (int m = 0; m < psReVal.length(); m++) {
                    char psStr = psReVal.charAt(m);
                    //全角文字の入力を拒否
                    if (psStr == '1') {
                        for (int n = 0; n < asDestination.length(); n++) {
                            if ( (SNULL + asDestination.charAt(n)).getBytes().
                                length == 2) {
                                return;
                            } // END IF
                        } // END FOR
                    } // END IF
                    //半角数字の入力を拒否
                    if (psStr == '2') {
                        if (ChkNumAlpha(asDestination)) {
                            return;
                        } // END IF
                    } // END IF
                    //半角英字の入力を拒否
                    if (psStr == '4') {
                        if (ChkEngAlpha(asDestination)) {
                            return;
                        } // END IF
                    } // END IF
                    //半角記号の入力を拒否
                    if (psStr == '8') {
                        if (ChkSignAlpha(asDestination)) {
                            return;
                        } // END IF
                    } // END IF
                } // END FOR
            } // END IF        if (piMaxLineCount != 0) {
                int curLines = this.calculateLines(this.getText() + asDestination);
                if (curLines > piMaxLineCount) {
                    return;
                }
            }        if(piMaxStringNum > 0) {
                int max = piMaxLineCount * piMaxLength;
                max = max > 0 ? Math.min(max, piMaxStringNum) : piMaxStringNum;
                int leftLen = max - getText().length();
                if(leftLen < asDestination.length()) {
                    asDestination = asDestination.substring(0, leftLen);
                }
            }
            super.replaceRange(asDestination, aiStart, aiEnd);
        } // END replaceRange(String, int, int)
      

  7.   


        /**
         * setIMEMethod
         * IMEの制御方法を設定する。
         * @param aiImeMethod : IMEの制御方法を指定する。制御方法は次の値を指定する。
         *                   値           説明
         *                   IME_NONE     IME 制御を特に行わない。
         *                   IME_ON       フォーカス取得時にIMEをONにする。
         *                   IME_OFF      フォーカス取得時にIME をOFFにする。
         * @return  boolean : 成功時はtrueを返します。引数が不正な場合はfalseを返る。
         */
        public boolean setIMEMethod(int aiImeMethod) {
            if (aiImeMethod != IME_NONE &&
                aiImeMethod != IME_ON &&
                aiImeMethod != IME_OFF) {
                return false;
            } // END IF
            piImeMethod = aiImeMethod;
            return true;
        } // END setIMEMethod(int)    /**
         * setLengthMethod
         * 文字列長の判定方法を設定する。
         * @param aiLengthMethod : 文字列の判定方法を指定する。判定方法は次の値を指定する。
         *          値                   説明
         *          LENGTH_BY_UNICODE    UNICODE キャラクタ数により判定する。
         *          LENGTH_BY_NATIVE     OSの標準文字セットによるバイト数により判定する。
         * @return boolean : 成功の時にtrueを返る、引数が不正な場合にfalseを返る。
         */
        public boolean setLengthMethod(int aiLengthMethod) {
            if (aiLengthMethod != LENGTH_BY_UNICODE &&
                aiLengthMethod != LENGTH_BY_NATIVE) {
                return false;
            } // END IF
            piLengthMethod = aiLengthMethod;
            return true;
        } // END setLengthMethod(int)    /**
         * setMaxLength
         * 入力可能な最大文字列長を設定する。
         * @param aiMaxLength : 最大文字列長を指定する。
         * @return boolean    : 成功の時にtrueを返る、引数が不正な場合にfalseを返る。
         */
        public boolean setMaxLength(int aiMaxLength) {
            if (aiMaxLength < 0) {
                return false;
            } // END IF
            piMaxLength = aiMaxLength;
            this.setLineWrap(true);
            return true;
        } // END setMaxLength(int)    /**
         * setMaxLineCount
         * テキストエリアに入力できる最大行数を設定する。
         * @param  aiMaxLineCount : 最大行数を指定する。
         * @return boolean        : 成功の時のtrueを返る、引数が不正な場合にfalseを返る。
         */
        public boolean setMaxLineCount(int aiMaxLineCount) {
            if (aiMaxLineCount < 0) {
                return false;
            } // END IF
            piMaxLineCount = aiMaxLineCount;
            setRows(aiMaxLineCount); //カラム数の更新
            return true;
        } // END setMaxLineCount(int)    /**
         * setRefusalCharacterMode
         * 入力拒否する文字セットモードを設定する。
         * @param aiRefusalMode : 入力を拒否する文字セットモードを指定する。
         *                        文字セットモードは次の値の組み合わせで指定する。
         *                   値                 説明
         *                   REFUSAL_NONE       全ての文字種を許可している。
         *                   REFUSAL_WIDE       全角文字の入力を拒否している。
         *                   REFUSAL_NUMBER     半角数字の入力を拒否している。
         *                   REFUSAL_ALPHABET   半角英字の入力を拒否している。
         *                   REFUSAL_SYMBOL     半角記号の入力を拒否している。
         * @return boolean : 成功の時にtrueを返る、引数が不正な場合にfalseを返る。
         */
        public boolean setRefusalCharacterMode(int aiRefusalMode) {
            if (aiRefusalMode < REFUSAL_NONE ||
                aiRefusalMode > REFUSAL_WIDE + REFUSAL_NUMBER +
                REFUSAL_ALPHABET + REFUSAL_SYMBOL) {
                return false;
            } // END IF
            piRefusalMode = aiRefusalMode;
            return true;
        } // END setRefusalCharacterMode(int)    /**
         * setReplaceMode
         * 置換モードを設定する。
         * @param abMode : 置換モードを指定する。
         */
        public void setReplaceMode(boolean abMode) {
            pbReplaceMode = abMode;
        } // END setReplaceMode(boolean)    /**
         * setMaxStringNum
         * 最大文字数の設定
         * @param aiMaxStringNum : 指定した最大文字数
         * @return boolean
         */
        public boolean setMaxStringNum( int aiMaxStringNum ) {
            if(aiMaxStringNum < 0) {
                return false;
            }
            this.piMaxStringNum = aiMaxStringNum;
            return true;
        }    /**
         * mChkStr
         * <PRE>
         *  文字列がNullか否かをチェック
         * </PRE>
         *
         * @param   asVal  : チェックする文字列
         * @return  String : <code>Null</code>、<code>"null"</code>、<code>""</code> 
         *          の場合<code>""</code>、その他場合Stringを返る
         */
        private String mChkStr(String asVal) {
            if (asVal == null) {
                return SNULL;
            } // END IF
            if (asVal.trim().equals(STRNULL)) {
                return SNULL;
            } // END IF
            if (asVal.trim().equals(SNULL)) {
                return SNULL;
            } // END IF
            return asVal.trim();
        } // END mChkStr(String)    /**
         * ChkNumAlpha
         * 半角数字のチェック
         * @param asval : チェックする文字列
         * @return true : YES ; false : NO
         */
        private boolean ChkNumAlpha(String asval) {
            final String psHanjh = "0123456789";
            for (int i = 0; i < psHanjh.length(); i++) {
                String pa = psHanjh.substring(i, i + 1);
                int pis = asval.indexOf(pa);
                if (pis != -1) {
                    return true;
                } // END IF
            } // END FOR
            return false;
        } // END ChkNumAlpha(String)
      

  8.   


        /**
         * ChkEngAlpha
         * 半角英字のチェック
         * @param asval : チェックする文字列
         * @return true : YES ; false : NO
         */
        private boolean ChkEngAlpha(String asval) {
            final String psHanjh =
                "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            for (int i = 0; i < psHanjh.length(); i++) {
                String pa = psHanjh.substring(i, i + 1);
                int pis = asval.indexOf(pa);
                if (pis != -1) {
                    return true;
                } // END IF
            } // END FOR
            return false;
        } // END ChkEngAlpha(String)    /**
         * ChkSignAlpha
         * 半角記号チェック
         * @param asval : チェックする文字列
         * @return true : YES ; false : NO
         */
        private boolean ChkSignAlpha(String asval) {
            final String psHanjh = "~!@#$%^&*()_-+=|[]{};:'?.,<>\\ \"/";
            for (int i = 0; i < psHanjh.length(); i++) {
                String pa = psHanjh.substring(i, i + 1);
                int pis = asval.indexOf(pa);
                if (pis != -1) {
                    return true;
                } // END IF
            } // END FOR
            return false;
        } // END ChkSignAlpha(String)    /**
         * calculateLines
         * 文字列の行数を計算する
         * @param text : 計算する文字列
         * @return int : 計算した行数
         */
        private int calculateLines(String text) {
            int lines = 1;
            ArrayList arr = new ArrayList();
            //String lineWrap = System.getProperty("line.separator");
            String lineWrap = "\n";
            int pos = -1;
            while ( (pos = text.indexOf(lineWrap)) >= 0) {
                arr.add(text.substring(0, pos));
                text = text.substring(pos + 1);
            } // END WHILE
            arr.add(text);        lines = arr.size();
            int max = getMaxLength();
            java.awt.FontMetrics fm = getFontMetrics(getFont());
            for (int i = 0; i < arr.size() && this.getLineWrap(); i++) {
                String s = (String) arr.get(i);
                int len = s.length();
                // 単行文字数の制限が無し
                if (max == 0) {
                    int curLen = 0;
                    for (int j = 0; j < len; j++) {
                        int chrLen = fm.stringWidth(s.substring(j, j + 1));
                        if (curLen + chrLen > getWidth()) {
                            ++lines;
                            curLen = chrLen;
                        }
                        else {
                            curLen += chrLen;
                        } // END IF
                    } // END FOR
                }
                // 単行文字数の制限が有り
                else {
                    int mod = len % max;
                    lines += mod > 0 ? (len - mod) / max : len / max - 1;
                } // END IF
            } // END FOR
            return lines;
        }    /**
         * <p>pTextUI</p>
         * <p>Description: </p>
         * <p>Copyright: Copyright (c) 2003</p>
         * <p>Company: NECソフト㈱</p>
         */
        class pTextAreaUI
            extends javax.swing.plaf.basic.BasicTextAreaUI {
            /**
             * create
             * ビューの生成
             * @param elem : エレメント
             * @return 生成したビュー
             */
            public View create(Element elem) {
                JTextComponent c = getComponent();
                if (c instanceof JTextArea) {
                    JTextArea area = (JTextArea) c;
                    View v;
                    if (area.getLineWrap()) {
                        v = new pWrappedPlainView(elem, area.getWrapStyleWord());
                    }
                    else {
                        v = new PlainView(elem);
                    } // END IF
                    return v;
                } // END IF
                return null;
            } // END create(Element)
        } // END pTextAreaUI    /**
         * <p>pWrappedPlainView</p>
         * <p>Description: </p>
         * <p>Copyright: Copyright (c) 2003</p>
         * <p>Company: NECソフト㈱</p>
         */
        class pWrappedPlainView
            extends WrappedPlainView {
            /**
             * pWrappedPlainView
             *
             * @param elem : エレメント
             * @param b    :
             */
            public pWrappedPlainView(Element elem, boolean b) {
                super(elem, b);
            } // END pWrappedPlainView(Element, boolean)        /**
             * calculateBreakPosition
             *
             * @param p0 : 位置0
             * @param p1 : 位置1
             * @return   : 取得した位置
             */
            protected int calculateBreakPosition(int p0, int p1) {
                int p;
                if (getMaxLength() > 0) {
                    p = p0 + Math.min(getMaxLength(), p1 - p0);
                }
                else {
                    p = super.calculateBreakPosition(p0, p1);
                }
                return p;
            } // END calculateBreakPosition(int, int)
        } // END pWrappedPlainView
    }
      

  9.   

    我写的是一个TEXTAREA的方法你可以自己看里面用的到的地方MAIL:[email protected]
      

  10.   

    heroiv(阿土) 
    把JTextPane加到JScrollPane中你说的是个好主意。可是不行/