- ベストアンサー
JTextAreaのサイズについて
こんにちは。 現在、swingの勉強のため、簡易エディタをswingで作成しています。 JTextAreaのサイズを、文字数ではなく視覚的に設定したいので、Dimensionを使ったのですが、setSize()を使っても上手くいきません。JScrollPaneで使ってもやっぱり上手くいきません。 何か良い方法はないでしょうか?ご教授ください。 環境:J2SDK1.4.2_04/Windows2000 pro sp4/LookAndFeelはデフォルト
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>早速試してみましたが、やはりダメでした。 >しかし、 >JFrame#setLayout()を追加したところ、きちんと表示されました。 すみません、ダメという状況が具体的に把握できません。 テキストエリアは表示されるが、そのサイズがViewPortに合わせて 可変するということでしょうか? また、JFrameのレイアウトマネジャーは、デフォルトはBorderLayoutですが、 何を設定されたのでしょうか? 私がテストしてみたサンプルのソースコードを示します。 以下のコードでダメならば、そのダメな内容をより具体的に 示していただければ幸いです。 -- TestTextAreaFrame.java --- import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SpringLayout; public class TestTextAreaFrame extends JFrame { public TestTextAreaFrame() { JTextArea textArea = new JTextArea(); textArea.setPreferredSize(new Dimension(150,200)); textArea.setLineWrap( true ); JScrollPane scrollPane = new JScrollPane(); scrollPane.getViewport().add( textArea ); scrollPane.getViewport().setLayout( new SpringLayout() ); add( scrollPane ); setSize( 200, 100 ); setVisible( true ); } }
その他の回答 (3)
- HarukaV49
- ベストアンサー率53% (48/89)
Javaのレイアウトマネジャーは、非常に便利なようで、使いこなそうとすると、 かなり不思議な振る舞いに苦しまされることもでてきます。 レイアウトマネジャーとしては、複雑な部類に入りますが、 javax.swing.SpringLayoutが多くの場合有用だと思います。 多くのレイアウトマネジャーでは、setSize(...)やsetPrefferedSize(...)は 優先されませんが、SpringLayoutマネジャーではsetPrefferedSize(...)が 最優先されます。 そして、SpringLayoutを使っておけば、上下左右に適当なマージンを 挿入したくなった時などに威力を発揮してくれます。 そこで、 scroll.getViewport().setLayout( new SpringLayout() ); を、適当な位置に挿入し、 text.setSize( dim ); を text.setPreferredSize( dim ); に置き換えて動作を確認してみてください。
補足
ご回答、ありがとうございます。 早速試してみましたが、やはりダメでした。 しかし、 JFrame#setLayout()を追加したところ、きちんと表示されました。 なぜなんでしょう? いくら部品のサイズを指定しても、大本であるフレームのサイズが決まってないから表示されなかったってことなんでしょうか? 質問を重ねてしまって申し訳ないですが、 本日18:00ごろまでこのままにしておきますので、気が向いたらで構いませんので、お答え頂ければ幸いです。
- ngsvx
- ベストアンサー率49% (157/315)
>文字数ではなく視覚的に設定したいので 「視覚的に設定」というのがよくわかりません。 具体的に説明していただいた方がいいと思います。
>Dimensionを使ったのですが、setSize()を使っても上手くいきません。JScrollPaneで使ってもやっぱり上手くいきません。 これだけだと、どういうやり方をしているのかがわからないのですが。 例えば、組み込んでいるコンテナのレイアウトマネージャはnullにしてありますか?
補足
早速の回答、ありがとうございます。 >これだけだと、どういうやり方をしているのかがわからないのですが。 一応、JTextAreaをインスタンス化する際、コンストラクタで文字数によるサイズの指定をしました。終了時のサイズを保存して次回起動時に反映させようと、終了時にJTextArea#getSize()で取得してファイルに保存し、起動時にJTextArea#setSize()で指定したのですが、全く反映されていませんでした。この時のコンストラクタは引数無しを使用しています。ファイルからの取得は出来ているのは確認しましたし、同じ値を手入力しても変わりません。ならばと、JScrollPane#setSize()で同様の事をしても結果は同じでした。Container#setSize()やJFrame#setSize()はきちんと反映されるのですが・・・。 構造としては、JTextAreaを組み込んだJScrollPaneをContainer#add()してあります。それ以外の部品等は一切使用していません。 >組み込んでいるコンテナのレイアウトマネージャはnullにしてありますか? Container#setLayout()をnullにしてあるかってことですよね? していません。コンテナそのものが表示されなくなりましたので。 以下、ソースです。 import javax.swing.*; import java.awt.*; public class Test extends JFrame{ public static void main(String[] args){ new Test(); } Test(){ super("簡易エディタ"); Dimension dim = new Dimension(636,391); //JTextArea text = new JTextArea(18,55); JTextArea text = new JTextArea(); text.setSize(dim); JScrollPane scroll = new JScrollPane(text); scroll.setWheelScrollingEnabled(true); //マウスホイールを有効に scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); Container con = getContentPane(); con.add(scroll,BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); validate(); setVisible(true); pack(); } }
補足
ご回答ありがとうございます。 >ダメという状況が具体的に把握できません。 すみません。説明不足でした。 これは、テキストエリアは表示されるのですが、1行分のみしかなかったということです。 テキストフィールドにスクロールバーがついた感じです。 設定した大きさと明らかに違うので「ダメ」と表現しました。 また、JFrameのレイアウトマネジャーは設定等何もしておりませんので、デフォルトのままかと思います。 ソースのご提示までして頂いてありがとうございます。 早速試してみましたところ、問題無く表示されました。 JTextAreaとJFrameのwidthの差でテキストエリアとスクロールバーの間に隙間が出来ていましたが・・・まぁサイズ合わせれば済む話ですのでって蛇足でしたね(汗) 蛇足ついでに。ご提示頂いたソースのadd( scrollPane );の部分で、実行時にgetContentPane().add()を使えと怒られてしまいましたが、JDKのバージョン違いによるエラーなんでしょうか?