1

Context : フラッシュカード アプリケーションでは、CardData(フラッシュカードの片面を表すデータ構造) のビューがあります。最も基本的な形式では、String text. ビュー (として知られているCardDataView) はtext、編集不可のJTextArea内ので構成されJScrollPaneます。

ある時点で、これらの を (垂直に) 並べる必要があるCardDataViewため、それらを垂直に配置しますBox

問題は次のとおりです。ウィンドウを「推奨」サイズ ( で決定pack) から拡大し、サイズを元に戻すと、JScrollPane は水平スクロール バーを追加し、テキスト フィールドを水平方向にスクロールできるようにします。基本的に、テキスト領域のサイズを大きくしてはいけません。

これが私のコードです(削除して簡略化しました):

public class DebugTest {

    public static void main(String[] args) {
        CardDataView cdv = new CardDataView(new CardData(
                "Lorem ipsum dolor sit amet filler filler filler"));
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(cdv), BorderLayout.CENTER);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}

class CardData {
    private String text; // text on the card

    /*
     * NOTE: This class has been simplified for SSCCE purposes. It's not really
     * just a String field in production; rather, it has an image and other
     * properties.
     */

    public CardData(String text) {
        super();
        this.text = text;
    }

    public String getText() {
        return text;
    }

}

class CardDataView extends Box {
    private JTextArea txtrText; // the text area for the text

    /*
     * NOTE: As with CardData, this class has been simplified. It's not just a
     * JTextArea; it's also an ImageView (custom class; works fine), among other
     * things.
     */

    public CardDataView(CardData data) {
        super(BoxLayout.Y_AXIS);
        txtrText = new JTextArea();
        txtrText.setLineWrap(true);
        txtrText.setRows(3);
        txtrText.setEditable(false);
        txtrText.setWrapStyleWord(true);
        final JScrollPane scrollPane = new JScrollPane(txtrText);
        add(scrollPane);
        txtrText.setText(data.getText());
    }
}

さて、私を本当に混乱させているのは(私が間違っていない限り)、テキストとスクロールペインを含むテキストエリアを作成するだけで(同じ行数を設定しても)、データとビュークラスを本質的にインライン化する場合です。 、同じラップ設定など)、期待どおりに動作します。何が起こっている可能性がありますか?

懸念事項: - すべての輸入は順調です。- なぜ: が本番環境にCardLayoutViewあるのか疑問に思っている場合はBox、テキスト ボックス以上のものがあります。の代わりにJPanelと I を使用すると、同じエラーが発生します。-クラスをまったく使用しない (テキスト領域のテキストを手動で設定する) と、同じ問題が発生します。setLayoutsuperCardData

何か案は?

4

1 に答える 1

2

私のコメントに答える:

の代わりにGridBagLayoutwithGridBagConstraints.VERTICAL/NONEを値として使用します。コンポーネントをのに追加する場合、はコンポーネントの を尊重しません。したがって、あなたのものをに追加してから、これをのに入れてみてください。gridBagLayoutObject.fillBoxLayoutCENTERJFrameBorderLayoutpreferredSize()CENTERJPanelJPanelCENTERJFrame

于 2012-06-29T19:48:34.043 に答える