質問: getContentPane(); contentPane.add(p,BorderLayout.CENTER); } } ```
回答: 解決済みではありますが・・・ アプリを作るときのコツめいたことを少しコメントしてみます。 * レイアウトマネージャーとレイアウト制約 元のコードではJTextAreaを置くJPanelにレイアウトマネージャーを指定してませんのでデフォルトのFlowLayoutが使われます。このためユーザーがウィンドウのリサイズ操作をしてもJTextAreaのサイズは固定のままとなり、ウィンドウのサイズに応じて広がったり縮まったりしてくれません。BorderLayoutを用いるとウィンドウのサイズに応じて子供が自動的にリサイズするようなふるまいを簡単にさせられます。またJFrameのcontentPaneはデフォルトでBorderLayoutを適用したJPanelになってますので、ご質問のコードにあるようなJPanelの生成は省略することもできます。 最初は「サイズや位置を固定で指定する」方法がわかりやすいのですが、それだと充分な使い勝手にならないことが多いのでレイアウトマネージャーやレイアウト制約について学ぶとよいと思います。swingに限らずGUIライブラリーを使う場合必ずと言ってよいほどレイアウト制約の考え方が出てきますので。 * 自分自身の属性は自分自身のコンストラクターで設定する mainメソッドでProjectのインスタンスを作ってそこにサイズや位置などいろいろ設定してますが、そのようにするといちいち `frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);` なんてふうに記述がながくなります。これをProjectのコンストラクターの方に書けば `setDefaultCloseOperation(EXIT_ON_CLOSE);` と書けます。レシーバー(frame)が自分自身(this)の場合thisが省略できますしProjectの継承元のフィールド(EXIT_ON_CLOSE)を参照するのにいちいちクラス名をくっつけなくてもよいからです。 これらは「単に記述が短くなるからよい」のではなく「初期化は自分自身のコンストラクターで行うのが自然」であり、その原則を守ることで自然に分かり易く短く記述できるのだと考えたほうがよいと思います。 * 可視化 他のGUIライブラリーで通用する原則ではないのですが、「JFrameの初期化をコンストラクターでやる」には例外があり、最初の可視化(setVisible)だけはコンストラクターの外(mainメソッド)で行ったほうがよいです。詳細は省略しますが、最初の可視化によって動き出すEDT(Event Dispatch Thread)とmainスレッドでのGUI処理が並列に動作することによる様々な不具合を避けるためのお約束と思ってください。 こうしたことを考慮して少しコードを変えてみますと ``` import javax.swing.*; import java.awt.*; public class Project extends JFrame { public static void main(String args[]) { // mainメソッドではウィンドウ(JFrame)を作ってそれを可視化するコードしか書かない方がよい JFrame frame = new Project("Window"); frame.setVisible(true); } Project (String title){ super(title); // 基底クラスの適切なコンストラクターを呼び出しましょう。 JTextArea area = new JTextArea("text", 10, 70); // root_jpさん回答の通り add(area, BorderLayout.CENTER); // 上記の1行は次の2行と同じ意味になる(小技) //Container contentPane = getContentPane(); //contentPane.add(p, BorderLayout.CENTER); setDefaultCloseOperation(EXIT_ON_CLOSE); //setSize (800,500); //サイズはレイアウトマネージャーにお任せで pack(); //お約束。レイアウトマネージャーに全てのComponentのサイズや位置を初期計算させる setLocationRelativeTo(null); //JFrameのサイズが決まったらこれができるようになる } } ``` 自分は常々「swingはまだ充分成熟していない時期のGUIライブラリー」のように感じていました。なんとなれば 「ああもできるしこうもできる」 =>「自分でレイアウトを計算することもできるし、レイアウトマネージャーに任せることもできる」 =>多くの初心者が柔軟でない方法(自分で全部レイアウトを計算する)でプログラムを書くくせがついてしまう という流れになってしまっていた気がするのです。こういう癖は気づかないとずっとよくないコードを書く結果になります。swing後継のマイナー感あふれる(?)JavaFXですが新しい設計のためかswingのように「よくない方法でGUIを作れてしまう」ような余地が少なく「よい方法ででしか作れないような仕様」になっていると感じます。swingを学んでもよいと思いますが、もし状況が許すならJavaFXを学ぶのも無駄ではないと思います。